0

私は ff パッケージを使用して保存している大きな行列 (1,140 行 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])
    }
  }
}

これは機能しますが、非常に遅いです。

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 に答える