Bonjour,
Je suis en train de développer un algorithme d'optimisation d'un modèle de choix à classes latentes. Pour vérifier que mon algo fonctionne, je génère des données à partir de coefficients arbitraires, coefficients que j'espère retrouver avec mon algo.
Pour l'instant je ne retrouve pas les bons coefficients, et il est possible que ce soit ma génération de données elle-même qui fonctionne mal. Pour vérifier que ma génération de données fonctionne, je veux faire tourner des fonctions déjà implémentées dans R, notamment mlogit() (package mlogit). Seulement, j'obtiens l'erreur suivante :
alors que mes données ne sont absolument pas colinéaires, puisque générées aléatoirement de façon indépendante les unes des autres.Code:
1
2
3
4 > reg<-mlogit(choice~X1+X2+X3+X4+X5,data.shape) Erreur dans drop(.Call("La_dgesv", a, as.matrix(b), tol, PACKAGE = "base")) : sous-programme Lapack dgesv : le système est exactement singulier
avec id.var la variable identifiant un individu (j'ai 20 individus simulés), chid.var la variable identifiant un choix et alt.var celle identifiant une option, au sein d'un même choix. Les données se lisent ainsi : l'individu 1 a eu à choisir au choix 1 entre les options 1 et 2 (options caractérisées par des valeurs de X1-X5), et il a finalement choisi l'option 1 (choice=TRUE).Code:
1
2
3
4
5
6
7
8
9 > head(data.shape) X1 X2 X3 X4 X5 choice id.var chid.var alt.var 1.1 -3.6705006 4.0189001 0.3673018 -0.001927193 -1.127631 TRUE 1 1 1 1.2 0.8894797 -5.7973798 -0.2573684 -4.532502341 -5.280530 FALSE 1 1 2 2.3 -3.1811889 2.0087362 -2.7873105 -1.358131276 5.201941 TRUE 1 2 3 2.4 -0.8415004 -0.7204216 3.6883280 0.726791957 2.776803 FALSE 1 2 4 3.5 0.2129098 2.0541943 1.3524543 3.112635710 -4.315230 TRUE 1 3 5 3.6 0.5743260 -2.8436047 2.6553177 -4.844616086 -2.785944 FALSE 1 3 6
X=X1-X5 est bien de rang 5 de même que la matrice XX'. Par contre cbind(X,choice) n'est pas de rang 6 (mais je ne sais pas si ça a quoi que ce soit à faire dans le problème) :
Code:
1
2
3
4
5
6
7 > qr(X)$rank [1] 5 > qr(X%*%t(X))$rank [1] 5 > qr(cbind(X,choice))$rank [1] 5
Les variables X1-X5 sont générées ainsi :
Pour chaque ligne, la valeur S=X1*b1 + X2*b2 + X3*b3 + X4*b4 + X5*b5 est calculée à partir de valeurs de b1 ... b5 fixées au préalable (ce sont les fameux coefficients à estimer). La variable 'choice' est TRUE pour le maximum de S au sein de chaque choix (variable chid.var).Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 > matrix(rnorm(5*K,mean=0,sd=2),nrow=K,ncol=5) [,1] [,2] [,3] [,4] [,5] [1,] -0.1388375 0.08751987 1.7515582 2.1411558 -2.07855080 [2,] 5.6999010 1.68412965 2.6812098 1.5934430 3.53517888 [3,] -1.6832822 1.32272432 1.2920483 -1.1747077 -3.24965556 [4,] -1.0567598 0.28361254 0.4804106 0.1926974 0.89616776 [5,] -1.6485392 3.03781734 2.6835301 1.0521919 -0.72972912 [6,] -4.0830007 0.74012525 -0.8748868 0.8204626 -2.36926277 [7,] -2.0079312 -1.69787389 1.6984261 2.0790443 3.08570832 [8,] -1.8974952 -1.39385358 3.4356878 1.3855985 -1.33423274 [9,] 1.5038651 -1.69747451 0.5177587 -2.3425068 0.08612213 [10,] 2.1027893 0.07387516 -0.5510225 1.2878800 -0.93083105 [11,] ..............
Mon problème principal est que je ne sais pas à quel moment de mlogit() la fonction Lapack dgesv est appellée ni sur quelles matrices... L'appel à cette fonction est extérieur au code de la fonction mlogit, que je ne comprends qu'à moitié.
Merci d'avance pour votre aide.