0

我有一个大矩阵(1,000,000 行 x 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])
    }
  }
}

这有效,但速度很慢。

4

1 回答 1

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)

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

于 2015-11-17T16:57:43.387 回答