R中的行方向相关性

时间:2015-01-14 12:34:04

标签: r matrix correlation

我有两个相同大小的矩阵。我想计算这些矩阵中每对行之间的相关系数;第1行,第1行,第1行,第2行,第2行,第2行,等等。

A <- matrix(runif(1:200), nrow=20)
B <- matrix(runif(1:200), nrow=20)

我能想到的最好的是

ret <- sapply(1:20, function(i) cor(A[i,], B[i,]))

但效率非常低(矩阵有数万行)。有更好,更快的方式吗?

2 个答案:

答案 0 :(得分:6)

这应该很快:

cA <- A - rowMeans(A)
cB <- B - rowMeans(B)
sA <- sqrt(rowMeans(cA^2))
sB <- sqrt(rowMeans(cB^2))

rowMeans(cA * cB) / (sA * sB)

答案 1 :(得分:2)

您可以创建矢量化函数,为您计算协方差和SD,

RowSD <- function(x) {
  sqrt(rowSums((x - rowMeans(x))^2)/(dim(x)[2] - 1))
}

VecCov <- function(x, y){
  rowSums((x - rowMeans(x))*(y - rowMeans(y)))/(dim(x)[2] - 1)
}

然后,只需做

VecCov(A, B)/(RowSD(A) * RowSD(B))