2つの時系列があり、ccf
を使用してそれらの間の相互相関を見つけています。 ccf(ts1, ts2)
は、すべてのタイムラグの相互相関をリストします。データを手動で確認せずに、最大の相関をもたらすラグを見つけるにはどうすればよいですか?
回答を投稿する 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)
}
上記の関数をやり直そうと思いましたが、元の相関(正または負)を返す絶対最大相関を見つけてもらいました。また、ラグの数を(ほぼ)最大にしました。
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)
}
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 。
関数をループしてインデックス(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')