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
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é.
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.
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.