library(dplyr)
<- function(x0,y0,lag,significantLevel = 0.05){
calculate_ccf # 相関係数を求めたいlagの分だけ前後を短くしたベクトル2本を作成。
if(lag < 0){
<- head(x0,lag); y <- tail(y0,lag)
x else if(0 < lag){
}<- tail(x0,-lag); y <- head(y0,-lag)
x else{
}<- x0;y <- y0
x
}# そこから先は通常の相関係数の算出と同様。但し分子の共分散は短くなったx,yを用いる。
<- mean(x0)
mux <- mean(y0)
muy <- mean((x0 - mux)^2)
dx <- mean((y0 - muy)^2)
dy <- length(x0)
n <- sum((x - mux)*(y - muy))/n
cxy <- cxy/sqrt(dx*dy)
ccf # 誤差が正規分布の場合の信頼区間
<- qnorm((1 + (1 - significantLevel))/2)/sqrt(length(x0))
upperCI <- -qnorm((1 + (1 - significantLevel))/2)/sqrt(length(x0))
lowerCI return(data.frame(lag = lag,ccf = ccf,upperCI = upperCI,lowerCI = lowerCI))
}
Rで時系列分析:相互相関関数
Rでデータサイエンス
相互相関関数
関数
サンプル
library(ggplot2);library(tidyr)
<- 100
n0 <- -3:3
lag <- rnorm(n = n0 + max(abs(lag)))
vec <- head(vec,-max(abs(lag)))
x0 <- tail(vec,-max(abs(lag)))
y0 <- gather(data = data.frame(N = seq(x0),x0,y0),key = 'key',value = 'value',c('x0','y0'))
tidydf ggplot(data = tidydf,mapping = aes(x = N,y = value,color = key)) + geom_line(size = 0.1) +
geom_point(size = 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 で確認。
<- ccf(x = x0,y = y0,lag.max = max(abs(lag)),plot = F)
ccfdata 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_version() quarto
[1] '1.4.553'
packageVersion(pkg = "tidyverse")
[1] '2.0.0'