web-dev-qa-db-ja.com

相互相関が最大になるラグを見つけるccf()

2つの時系列があり、ccfを使用してそれらの間の相互相関を見つけています。 ccf(ts1, ts2)は、すべてのタイムラグの相互相関をリストします。データを手動で確認せずに、最大の相関をもたらすラグを見つけるにはどうすればよいですか?

13
tan

回答を投稿する http://r.789695.n4.nabble.com/ccf-function-td2288257.html

Find_Max_CCF<- function(a,b)
{
 d <- ccf(a, b, plot = FALSE)
 cor = d$acf[,,1]
 lag = d$lag[,,1]
 res = data.frame(cor,lag)
 res_max = res[which.max(res$cor),]
 return(res_max)
} 
18
tan

上記の関数をやり直そうと思いましたが、元の相関(正または負)を返す絶対最大相関を見つけてもらいました。また、ラグの数を(ほぼ)最大にしました。

Find_Abs_Max_CCF<- function(a,b)
{
 d <- ccf(a, b, plot = FALSE, lag.max = length(a)-5)
 cor = d$acf[,,1]
 abscor = abs(d$acf[,,1])
 lag = d$lag[,,1]
 res = data.frame(cor,lag)
 absres = data.frame(abscor,lag)
 absres_max = res[which.max(absres$abscor),]
 return(absres_max)
}
11
nvogen

3は4より大きいので、この関数を変更することにも挑戦しました。今回は、 ここ からのアイデアを実装しました。

ccfmax <- function(a, b, e=0)
{
 d <- ccf(a, b, plot = FALSE, lag.max = length(a)/2)
 cor = d$acf[,,1]
 abscor = abs(d$acf[,,1])
 lag = d$lag[,,1]
 res = data.frame(cor, lag)
 absres = data.frame(abscor, lag)
 maxcor = max(absres$abscor)
 absres_max = res[which(absres$abscor >= maxcor-maxcor*e &
                        absres$abscor <= maxcor+maxcor*e),]
 return(absres_max)
}

基本的に「エラー」という用語が追加されるため、最大値に近い値がいくつかある場合、それらはすべて返されます。例:

ayy <- jitter(cos((1:360)/5), 100)
bee <- jitter(sin((1:360)/5), 100)

ccfmax(ayy, bee, 0.02)
           cor lag
348  0.9778319  -8
349  0.9670333  -7
363 -0.9650827   7
364 -0.9763180   8

eの値が指定されていない場合、ゼロと見なされ、関数は投稿されたものと同じように動作します nvogen

2
AkselA

関数をループしてインデックス(x)の文字ベクトルに対応する値を出力するために、元のソリューションも変更しました。

abs.max.ccf <- function(x,a,b) {
  d <- ccf(a, b, plot=FALSE, lag.max=length(a)-5)
  cor <- d$acf[,,1]
  abscor <- abs(d$acf[,,1])
  lag <- d$lag[,,1]
  abs.cor.max <- abscor[which.max(abscor)]
  abs.cor.max.lag <- lag[which.max(abscor)]
  return(c(x, abs.cor.max, abs.cor.max.lag))
}

関数内のdata.frame部分は不必要に遅いので、削除しました。 data.frameの各列をループして、結果を新しいdata.frameに返すには、次のメソッドを使用します。

max.ccf <- lapply(colnames(df), function(x) unlist(abs.max.ccf(x, df$y, df[x])))
max.ccf <- data.frame(do.call(rbind, max.ccf))
colnames(max.ccf) <- c('Index','Cor','Lag')
1
Adam Erickson