R résoudre:le système est exactement singulier

je suis en train de résoudre un simple problème d'optimisation. Le jeu de données a 26 colonnes et plus de 3000 lignes. Le code source ressemble à

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

Et tout fonctionne parfaitement - mais je veux faire de même pour une période plus courte (seulement 261 lignes) et les résoudre fonction écrit l'erreur suivante:

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

Sa bizarre parce que quand je fais la même chose avec certains nombres aléatoires:

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

aucune erreur ne se produit. Quelqu'un pourrait-il m'expliquer d'où pourrait être le problème et comment la traiter. Merci beaucoup, Alex

19
demandé sur Alex 2011-07-04 17:23:09

3 réponses

en utilisant solve avec un seul paramètre est une demande d'inverser une matrice. Le message d'erreur vous informe que votre matrice est singulière et ne peut pas être inversé.

18
répondu borrible 2011-07-04 13:29:51

je suppose que votre code utilise quelque part dans le second cas une matrice singulière (c'est-à-dire non inversible), et la fonction solve doit l'Inverser. Cela n'a rien à voir avec la taille, mais avec le fait que certains de vos vecteurs sont (probablement) colinéaires.

10
répondu drolex 2011-07-04 13:29:15

Lapack est un paquet D'algèbre linéaire qui est utilisé par R (en fait il est utilisé partout) en dessous de solve(), dgesv crache ce genre d'erreur lors de la matrice passée en paramètre est singulier.

comme addendum: dgesv effectue la décomposition de LU, qui, en utilisant votre matrice, force une division par 0, puisque c'est mal défini, il jette cette erreur. Cela se produit seulement quand la matrice est singulier ou quand il est singulier sur votre machine (en raison de l'approximation, vous pouvez avoir un vraiment petit nombre à considérer 0)

je vous suggérerais de vérifier son déterminant si la matrice que vous utilisez contient principalement des entiers et n'est pas grande. Si c'est gros, alors jetez un oeil à ce lien.

5
répondu Diego Queiroz 2017-05-23 12:32:26