寻找互相关最大的滞后ccf()

时间:2012-04-29 02:00:54

标签: r time-series correlation

我有2个时间序列,我使用ccf来查找它们之间的互相关。 ccf(ts1, ts2)列出了所有时间滞后的互相关。如何在不手动查看数据的情况下找到导致最大相关性的滞后?

4 个答案:

答案 0 :(得分:18)

发布答案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)
} 

答案 1 :(得分:11)

我以为我会重做上面的函数但让它找到返回原始相关性(正或负)的绝对最大相关性。我也最多(几乎)滞后数量。

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)
}

答案 2 :(得分:2)

因为3超过4,我还有一个修改这个功能的方法,这次是通过here实现一个想法:

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一样。

答案 3 :(得分: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部分,因为它不必要地慢。要循环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')