私は2つの時系列を持っておりccf
、それらの間の相互相関を見つけるために使用しています。
ccf(ts1, ts2)
すべてのタイム ラグの相互相関を一覧表示します。手動でデータを確認せずに、最大の相関をもたらすラグを見つけるにはどうすればよいですか?
質問する
24867 次
4 に答える
21
回答を投稿する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)
}
于 2012-04-30T14:01:05.693 に答える
12
上記の関数をやり直そうと思いましたが、元の相関 (正または負) を返す絶対最大相関を見つけます。また、ラグの数を(ほぼ)最大にしました。
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)
}
于 2013-11-21T22:15:02.147 に答える
2
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が投稿したものと同じように動作します。
于 2015-11-04T18:47:31.490 に答える
1
関数をループして、インデックス (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
不必要に遅いので、関数内の部分を削除しました。a の各列をループしdata.frame
て結果を new に返すには、次の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')
于 2015-10-06T01:12:30.983 に答える