【问题标题】:Finding lag at which cross correlation is maximum ccf( )找出互相关最大的滞后 ccf( )
【发布时间】:2012-05-09 07:01:04
【问题描述】:

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

【问题讨论】:

  • 你为什么不把它作为一个答案并归功于 R 帮助邮件列表中的海报?
  • 是的,我会这样做,但我没有足够的声望点来回答我自己的问题。
  • 当你有问题的时候重新审视这个问题。 :)
  • @tan 您也可以将自己的答案标记为正确答案。而且,除了链接之外,我个人认为总结一下答案是很好的,以节省 Stackoverflowers 的额外点击。 (我已经编辑了您的答案以表明我的意思;如果您想重新编辑它,请不要冒犯:-)

标签: r time-series correlation


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我也修改了原始解决方案,以便循环函数并输出对应于索引字符向量 (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')
    

    【讨论】:

      【解决方案3】:

      我想我会重做上述函数,但让它找到返回原始相关性(正或负)的绝对最大相关性。我还(几乎)最大化了延迟的数量。

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

      【讨论】:

      • 你能说出为什么在提取 acf d$acf[,,1] 时使用了两个逗号吗?谢谢。
      • 正如 ?cor 解释的那样,它是一个三维数组。
      【解决方案4】:

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

      【讨论】:

      • cor = c$acf[,,1] 和 lag 为什么要用两个逗号?
      猜你喜欢
      • 1970-01-01
      • 2017-01-13
      • 1970-01-01
      • 2013-03-11
      • 1970-01-01
      • 2019-12-02
      • 2016-01-15
      • 2021-11-06
      • 1970-01-01
      相关资源
      最近更新 更多