web-dev-qa-db-ja.com

R solve:systemは厳密に特異です

単純な最適化問題を解決しています。データセットには26列と3000行以上があります。ソースコードは次のようになります

Means   <- colMeans(Returns)
Sigma   <- cov(Returns)
invSigma1 <- solve(Sigma)

そして、すべてが完璧に動作します-しかし、私はより短い期間(261行のみ)で同じことをしたいので、解決関数は次のエラーを書き込みます:

solve(Sigma)
Error in solve.default(Sigma) : 
  Lapack routine dgesv: system is exactly singular 

私がいくつかの乱数で同じことをするとき、その奇妙な:

Returns<-matrix(runif(6786,-1,1), nrow=261)
Means   <- colMeans(Returns)
Sigma   <- cov(Returns)
invSigma <- solve(Sigma)

エラーはまったく発生しません。誰かが私に問題の可能性がある場所とその対処方法を説明できますか?ありがとう、アレックス

21
Alex

単一のパラメーターでsolveを使用することは、マトリックスを反転する要求です。エラーメッセージは、マトリックスが特異であり、反転できないことを示しています。

19
borrible

コードでは、2番目のケースのどこかで特異行列(つまり、可逆ではない)を使用しており、関数solveはそれを反転する必要があると思います。これはサイズとは関係ありませんが、ベクトルの一部が(おそらく)共線的であるという事実とは関係ありません。

10
drolex

Lapackはsolve()の下でR(実際にはどこでも使用されます)によって使用される線形代数パッケージです。dgesvは、パラメーターとして渡された行列が特異な場合にこの種のエラーを吐き出します。

補遺として:dgesvはLU分解を実行します。これは、マトリックスを使用するときに0による除算を強制します。これは不明確であるため、このエラーをスローします。または、マシン上で特異な場合(近似により、本当に小さい数を0と見なすことができます)

使用している行列の大部分が整数で、大きくない場合は、行列式を確認することをお勧めします。大きい場合は、 this link をご覧ください。

6
Diego Queiroz