web-dev-qa-db-fra.com

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

Je résous un problème d'optimisation simple. L'ensemble de données comprend 26 colonnes et plus de 3 000 lignes. Le code source ressemble à

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

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

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

C'est bizarre parce que quand je fais de même avec des 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 du tout. Quelqu'un pourrait-il m'expliquer où pourrait être le problème et comment le traiter. Merci beaucoup, Alex

21
Alex

L'utilisation de solve avec un seul paramètre est une demande pour inverser une matrice. Le message d'erreur vous indique que votre matrice est singulière et ne peut pas être inversée.

19
borrible

Je suppose que votre code utilise quelque part dans le deuxième cas une matrice singulière (c'est-à-dire non inversible), et la fonction de résolution 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
drolex

Lapack est un package d'algèbre linéaire qui est utilisé par R (en fait, il est utilisé partout) sous solve(), dgesv crache ce genre d'erreur lorsque la matrice que vous avez passée en paramètre est singulière.

En complément: dgesv effectue la décomposition LU, qui, lors de l'utilisation de votre matrice, force une division par 0, car elle est mal définie, elle génère cette erreur. Cela ne se produit que lorsque la matrice est singulière ou lorsqu'il est singulier sur votre machine (en raison de l'approximation, un très petit nombre peut être considéré comme 0)

Je vous suggère 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, jetez un œil à ce lien .

6
Diego Queiroz