我想计算相关矩阵的某些波段的矩阵列之间的相关性。我知道如何获得整个相关矩阵:
X <- matrix(rnorm(20*30), nrow=20)
cor(X)
但如下左图所示,我只对主对角线以下的一些乐队感兴趣。
我可以尝试巧妙地将原始矩阵子集化,只得到右图所示的小方块,但这似乎很麻烦。
你对这个问题有更好的想法/解决方案。
修改
我忘记提到这一点,但我很难在R中使用for循环,因为相关矩阵的维数相当大(大约2000 * 2000),我必须做大约100次这个过程。
答案 0 :(得分:1)
尝试for循环:
band_cor_mat = matrix(NA, nrow=nrow(X), ncol=ncol(X))
for (cc in 1:ncol(X)) { # Diagonal
for (mm in 1:min(band_width, nrow(X)-cc)) { # Band
band_cor_mat[cc+mm,cc] = cor(X[,cc+mm], X[,cc])
}
}
您将拥有一个相关矩阵,其中包含相关值,其余为NAs
。
答案 1 :(得分:1)
你可能是正确的,整个矩阵上的cor
比使用手动循环更快,因为cor
的内部工作方式针对矩阵进行了高度优化。但矩阵越大(相反,频段越小),你可以通过手动循环来获得更多的好处。
那就是说,也许只是试一试 - 手动循环的代码是微不足道的:
cor_band = function (x, band_width, method = c('pearson', 'kendall', 'spearman')) {
out = matrix(nrow = ncol(x), ncol = ncol(x))
for (i in 1 : ncol(x))
for (j in i : min(i + band_width, ncol(x)))
out[j, i] = cor(x[, j], x[, i], method = method)
out
}
请注意out
中的索引是相反的,这样我们就可以得到低于的对角线,而不是上面的。由于相关矩阵是对称的,因此可以正常工作。