Rで時系列分析:相互相関関数

Rでデータサイエンス

相互相関関数

関数

library(dplyr)
calculate_ccf <- function(x0,y0,lag,significantLevel = 0.05){
  # 相関係数を求めたいlagの分だけ前後を短くしたベクトル2本を作成。
  if(lag < 0){
    x <- head(x0,lag); y <- tail(y0,lag)
  }else if(0 < lag){
    x <- tail(x0,-lag); y <- head(y0,-lag)
  }else{
    x <- x0;y <- y0
  }
  # そこから先は通常の相関係数の算出と同様。但し分子の共分散は短くなったx,yを用いる。
  mux <- mean(x0)
  muy <- mean(y0)
  dx <- mean((x0 - mux)^2)
  dy <- mean((y0 - muy)^2)
  n <- length(x0)
  cxy <- sum((x - mux)*(y - muy))/n
  ccf <- cxy/sqrt(dx*dy)
  # 誤差が正規分布の場合の信頼区間
  upperCI <-  qnorm((1 + (1 - significantLevel))/2)/sqrt(length(x0))
  lowerCI <- -qnorm((1 + (1 - significantLevel))/2)/sqrt(length(x0))
  return(data.frame(lag = lag,ccf = ccf,upperCI = upperCI,lowerCI = lowerCI))
}

サンプル

library(ggplot2);library(tidyr)
n0 <- 100
lag <- -3:3
vec <- rnorm(n = n0 + max(abs(lag)))
x0 <- head(vec,-max(abs(lag)))
y0 <- tail(vec,-max(abs(lag)))
tidydf <- gather(data = data.frame(N = seq(x0),x0,y0),key = 'key',value = 'value',c('x0','y0'))
ggplot(data = tidydf,mapping = aes(x = N,y = value,color = key)) + geom_line(size = 0.1) + 
  geom_point(size = 1)
Figure 1
lapply(X = lag,FUN = function(lag)calculate_ccf(x0 = x0,y0 = y0,lag = lag)) %>% 
  Reduce(function(x,y)rbind(x,y),.)
  lag         ccf   upperCI    lowerCI
1  -3 -0.03843107 0.1959964 -0.1959964
2  -2 -0.02504421 0.1959964 -0.1959964
3  -1 -0.15592139 0.1959964 -0.1959964
4   0 -0.04500134 0.1959964 -0.1959964
5   1  0.01705563 0.1959964 -0.1959964
6   2  0.23518571 0.1959964 -0.1959964
7   3  0.99058376 0.1959964 -0.1959964
# Rの関数 ccf で確認。
ccfdata <- ccf(x = x0,y = y0,lag.max = max(abs(lag)),plot = F)
cbind(lag = ccfdata$lag,ccf = ccfdata$acf) %>% data.frame()
  lag         ccf
1  -3 -0.03843107
2  -2 -0.02504421
3  -1 -0.15592139
4   0 -0.04500134
5   1  0.01705563
6   2  0.23518571
7   3  0.99058376

最終更新

Sys.time()
[1] "2024-04-29 11:41:15 JST"

R、Quarto、Package

R.Version()$version.string
[1] "R version 4.3.3 (2024-02-29 ucrt)"
quarto::quarto_version()
[1] '1.4.553'
packageVersion(pkg = "tidyverse")
[1] '2.0.0'

著者