矩阵中不同时间序列的互相关

时间:2017-05-18 12:48:01

标签: r time-series cross-correlation

寻找我的问题的解决方案我找到了一个旧帖子(device log),它完全问我需要什么,但不幸的是它没有得到任何答案所以我会再次要求提供一些指导。

我已经从大量具有相同大小的时间序列中创建了一个大矩阵,每列都是不同的时间序列(类似于以下内容但更大且更多的值不同于零):

      [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19]
[1,]    0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0    NA    NA    NA   0.0    NA   0.0   0.0   0.0   0.0
[2,]    0   6.0   0.0   9.0   0.0   0.0   0.0   0.0   0.0   0.0    NA     0    NA   0.0    NA   0.0   0.0   0.0   0.0
[3,]    0   0.0   0.0   5.0   0.0   0.0   0.0   0.0   0.0   0.0    NA     0    NA   0.0    NA   0.0   0.0   0.0   0.0
[4,]    0   0.0   0.0  10.0   0.0   0.0   0.0   0.0   0.0   0.0    NA     0    NA   0.0    NA   0.0   0.0   0.0   0.0
[5,]    0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0    NA     0    NA   0.0    NA   0.0   0.0   0.0   0.0
[6,]    0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0    NA     0    NA   0.0    NA   0.0   0.0   0.0   0.0
[7,]    0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0    NA     0    NA   0.0    NA   0.0   0.0   0.0   0.0
[8,]    0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0    NA     0    NA   0.0    NA   0.0   0.0   0.0   0.0
[9,]    0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0    NA     0    NA  10.0    NA   0.0   0.0   0.0   0.0
.
.
.

我想确定所有时间序列之间的相关性,我把它们放在矩阵中,因为我认为它可能是进行互相关过程的最佳方法,我可能错了。

所以,我也知道函数" ccf"和" diss()":

  1. ccf()#in base packages
  2. diss(meter_daywise,METHOD =" CORT",deltamethod =" DTW")TSclust包中的#
  3. 但是就像在旧帖子中一样,我也有同样的问题:

    1. ccf不接受完整矩阵作为输入
    2. diss()接受输入矩阵并产生一些矩阵,但在观察值时,我发现它不是互相关矩阵,因为值不在-1和1之间。
    3. 所以问题是我们如何在R?

      中计算和执行不同时间序列之间的互相关

2 个答案:

答案 0 :(得分:1)

一种可能性是使用ccf在所有列的组合中运行combn。以下代码在链接中的问题上进行了测试:

myResults <- combn(seq_len(nrow(meter_daywise)), 2,
                   FUN=function(x) ccf(meter_daywise[x[1],], meter_daywise[x[2],]),
                   simplify=FALSE)

并生成一个像这样的嵌套列表

str(myResults)
List of 10
 $ :List of 6
  ..$ acf   : num [1:17, 1, 1] 0.0241 0.0895 0.1463 0.0583 -0.0613 ...
  ..$ type  : chr "correlation"
  ..$ n.used: int 15
  ..$ lag   : num [1:17, 1, 1] -8 -7 -6 -5 -4 -3 -2 -1 0 1 ...
  ..$ series: chr "X"
  ..$ snames: chr "meter_daywise[x[1], ] & meter_daywise[x[2], ]"
  ..- attr(*, "class")= chr "acf"
 $ :List of 6
  ..$ acf   : num [1:17, 1, 1] -0.445 -0.493 -0.239 0.465 0.49 ...
  ..$ type  : chr "correlation"
  ..$ n.used: int 15
  ..$ lag   : num [1:17, 1, 1] -8 -7 -6 -5 -4 -3 -2 -1 0 1 ...
  ..$ series: chr "X"
  ..$ snames: chr "meter_daywise[x[1], ] & meter_daywise[x[2], ]"
  ..- attr(*, "class")= chr "acf"

...

列表中的每个外部元素都是两对ccf的输出。对于您的应用程序,由于时间序列存储在列中,您可以将其切换为

myResults <- combn(seq_len(ncol(myMat)), 2,
                   FUN=function(x) ccf(myMat[, x[1]], myMat[, x[2]]), simplify=FALSE)

其中myMat是矩阵的名称。您可以通过更简单的combn调用

来查看对
myPairs <- combn(seq_len(ncol(myMat)), 2)

答案 1 :(得分:1)

ccf返回每个偏移处的成对相关性(即滞后),但我认为你想要的是最大值(abs(相关))。因为你有NA,你需要设置na.action参数。

mat <- matrix(rnorm(100000), ncol=100)
mat[sample(1:length(mat), 100)] <- NA 

res <- sapply(1:ncol(mat), function(x) {
  sapply(1:ncol(mat), function(z){
    resTmp <- ccf(x = mat[, x], y = mat[, z], plot=F, na.action = na.pass)
    resTmp$acf[which.max(abs(resTmp$acf))]
  })
})

来自ccf帮助:

  

默认情况下,不允许缺少值。如果na.action函数通过缺失值(如na.pass那样),则从完整的情况计算协方差。这意味着计算的估计值可能不是有效的自相关序列,并且可能包含缺失值。