【问题标题】:How to efficiently calculate a covariance matrix from an ff_matrix如何从 ff_matrix 有效地计算协方差矩阵
【发布时间】:2015-11-16 12:33:20
【问题描述】:

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

有没有一种有效的方法来计算协方差矩阵?使用 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])
    }
  }
}

有效,但速度很慢。

【问题讨论】:

    标签: r covariance ff


    【解决方案1】:

    我根据以下问题的答案找到了一个解决方案: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)
    

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

    【讨论】:

      猜你喜欢
      • 2011-05-23
      • 1970-01-01
      • 2019-02-15
      • 1970-01-01
      • 1970-01-01
      • 2020-04-13
      • 2015-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多