如何从ff_matrix有效地计算协方差矩阵

时间:2015-11-16 12:33:20

标签: r covariance ff

我有一个大矩阵(1,000,000行乘1,140列),我使用ff包存储。

有没有一种有效的方法来计算协方差矩阵?使用cov函数会出现错误:

  

cov(X)中的错误:提供' x'并且' y'或类似矩阵的' x'

鉴于cov不了解ff对象,这并不奇怪。我目前正在使用一个简单的嵌套for循环:

covarianceMatrix <- matrix(0,nrow=ncol(ffObject),ncol=ncol(ffObject))  
distinctValues <- sum(ncol(ffObject):1)
for(i in 1:ncol(ffObject))
{
  for(j in i:ncol(ffObject))
  {
    if(i==j)
    {
      covarianceMatrix[i,j] <- var(ffObject[,i])
    }
    else
    {
      covarianceMatrix[i,j] <- covarianceMatrix[j,i] <- cov(ffObject[,i],ffObject[,j])
    }
  }
}

虽然有效但很慢。

1 个答案:

答案 0 :(得分:0)

我找到了一个基于以下问题答案的解决方案:https://scicomp.stackexchange.com/questions/5464/parallel-computation-of-big-covariance-matrices结合了bootSVD包中的一些代码:https://github.com/aaronjfisher/bootSVD/blob/master/R/bootstrap_functions.R。具体做法是:

covarianceMatrix <- matrix(0,nrow=ncol(ffObject),ncol=ncol(ffObject))
ffapply({covarianceMatrix <- covarianceMatrix + crossprod(ffObject[i1:i2,]) },X=ffObject,MARGIN=1)
columnSums <- sapply(1:ncol(ffObject),function(i) sum(ffObject[,i]))

covarianceMatrix <- covarianceMatrix/nrow(ffObject) - (columnSums %*% t(columnSums))/nrow(ffObject)/nrow(ffObject)

这比问题中的代码要快得多,只需几分钟而不是几小时。