我有一个尺寸为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的矩阵。
答案 0 :(得分:1)
确保您为plot
,acf
设置ccf
为FALSE。然后,您可以将代码打包到outer
,以提供每对i
和j
值。请注意,由于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
这是相对有效的。可能有一个比你用来获得相同答案的算法更好的算法,但我对这些东西不太熟悉,无法提供它。