R中的行相关
Row-wise correlations in R
我有两个相同大小的矩阵。我想计算这些矩阵中每对行之间的相关系数; A 的第 1 行与 B 的第 1 行,A 的第 2 行与 B 的第 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,]))
但是效率非常低(矩阵有几万行)。有没有更好更快的方法?
这应该很快:
cA <- A - rowMeans(A)
cB <- B - rowMeans(B)
sA <- sqrt(rowMeans(cA^2))
sB <- sqrt(rowMeans(cB^2))
rowMeans(cA * cB) / (sA * sB)
您可以创建矢量化函数来为您计算协方差和 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))
我有两个相同大小的矩阵。我想计算这些矩阵中每对行之间的相关系数; A 的第 1 行与 B 的第 1 行,A 的第 2 行与 B 的第 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,]))
但是效率非常低(矩阵有几万行)。有没有更好更快的方法?
这应该很快:
cA <- A - rowMeans(A)
cB <- B - rowMeans(B)
sA <- sqrt(rowMeans(cA^2))
sB <- sqrt(rowMeans(cB^2))
rowMeans(cA * cB) / (sA * sB)
您可以创建矢量化函数来为您计算协方差和 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))