计算矩阵中每对行的自相关和互相关之间的相关性

时间:2014-01-24 17:11:17

标签: r matrix

我有一个尺寸为m乘n的矩阵。例如:

m = 4
n = 10
mat = matrix(rnorm(m*n), nrow = m, ncol=n)

对于某对行i,j:

i=1
j=2

我计算第i行的自相关与第i行和第j行的互相关之间的相关性。所以给出:

lag=5

第i行的自相关将是:

acf.i = acf(mat[i,],lag.max=lag)

行i和j的互相关是:

ccf.i.j = ccf(mat[i,],mat[j,],lag.max=lag)

和acf.i和ccf.i.j之间的相关性如下:

cor.acf.i.ccf.i.j = cor(acf.i$acf,ccf.i.j$acf[(lag+1):(2*lag+1)])

(因为ccf计算与滞后范围的相关性:-lag:lag和acf仅在0的范围内:滞后我任意选择取范围0:滞后ccf.i.j)

我想要的是在垫子的所有行中,在垫子中的每一行和每一行中有效地做到这一点。我想这个函数应该返回一个维数为m乘m的矩阵。

1 个答案:

答案 0 :(得分:1)

确保您为plotacf设置ccf为FALSE。然后,您可以将代码打包到outer,以提供每对ij值。请注意,由于outer需要矢量化FUN(例如*),我们需要对您的函数进行矢量化:

set.seed(1)
m <- 4
n <- 10
mat <- matrix(rnorm(m*n), nrow = m, ncol=n)
lag <- 5

outer(1:nrow(mat), 1:nrow(mat),
  Vectorize(
    function(i, j) {
      acf.i <- acf(mat[i,],lag.max=lag, plot=F)
      ccf.i.j <- ccf(mat[i,],mat[j,],lag.max=lag, plot=F)    
      cor(acf.i$acf,ccf.i.j$acf[(lag+1):(2*lag+1)])
} ) )
#            [,1]        [,2]         [,3]        [,4]
# [1,]  1.0000000  0.47035200 -0.006371955 -0.85880247
# [2,]  0.4133899  1.00000000 -0.462744858 -0.13327111
# [3,] -0.3573965  0.01882691  1.000000000  0.09358042
# [4,] -0.8570117 -0.58359258  0.249930947  1.00000000

这是相对有效的。可能有一个比你用来获得相同答案的算法更好的算法,但我对这些东西不太熟悉,无法提供它。