R:仅计算相关矩阵的带

时间:2015-02-05 10:46:10

标签: r matrix

我想计算相关矩阵的某些波段的矩阵列之间的相关性。我知道如何获得整个相关矩阵:

X <- matrix(rnorm(20*30), nrow=20)
cor(X)

但如下左图所示,我只对主对角线以下的一些乐队感兴趣。

enter image description here

我可以尝试巧妙地将原始矩阵子集化,只得到右图所示的小方块,但这似乎很麻烦。

你对这个问题有更好的想法/解决方案。

修改

我忘记提到这一点,但我很难在R中使用for循环,因为相关矩阵的维数相当大(大约2000 * 2000),我必须做大约100次这个过程。

2 个答案:

答案 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中的索引是相反的,这样我们就可以得到低于的对角线,而不是上面的。由于相关矩阵是对称的,因此可以正常工作。