web-dev-qa-db-fra.com

R glmnet: "L'objet (liste) ne peut pas être contraint à taper 'double'"

J'essaie d'utiliser le package glmnet sur un ensemble de données. J'utilise cv.glmnet() pour obtenir une valeur lambda pour glmnet(). Voici l'ensemble de données et le message d'erreur:

> head(t2)
  X1 X2        X3 X4 X5         X6    X7 X8 X9 X10 X11 X12
1  1  1 0.7661266 45  2 0.80298213  9120 13  0   6   0   2
2  2  0 0.9571510 40  0 0.12187620  2600  4  0   0   0   1
3  3  0 0.6581801 38  1 0.08511338  3042  2  1   0   0   0
4  4  0 0.2338098 30  0 0.03604968  3300  5  0   0   0   0
5  5  0 0.9072394 49  1 0.02492570 63588  7  0   1   0   0
6  6  0 0.2131787 74  0 0.37560697  3500  3  0   1   0   1
> str(t2)
'data.frame':   150000 obs. of  12 variables:
 $ X1 : int  1 2 3 4 5 6 7 8 9 10 ...
 $ X2 : int  1 0 0 0 0 0 0 0 0 0 ...
 $ X3 : num  0.766 0.957 0.658 0.234 0.907 ...
 $ X4 : int  45 40 38 30 49 74 57 39 27 57 ...
 $ X5 : int  2 0 1 0 1 0 0 0 0 0 ...
 $ X6 : num  0.803 0.1219 0.0851 0.036 0.0249 ...
 $ X7 : int  9120 2600 3042 3300 63588 3500 NA 3500 NA 23684 ...
 $ X8 : int  13 4 2 5 7 3 8 8 2 9 ...
 $ X9 : int  0 0 1 0 0 0 0 0 0 0 ...
 $ X10: int  6 0 0 0 1 1 3 0 0 4 ...
 $ X11: int  0 0 0 0 0 0 0 0 0 0 ...
 $ X12: int  2 1 0 0 0 1 0 0 NA 2 ...
> cv1 <- cv.glmnet(t2[,-c(1,2,7,12)], t2[,2], family="multinomial")
Error in lognet(x, is.sparse, ix, jx, y, weights, offset, alpha, nobs,  : 
  (list) object cannot be coerced to type 'double'

J'exclus les colonnes 1,2,7,12 car elles sont: colonne id, colonne réponse, contiennent les NA et contiennent les NA. Toute suggestion sera appréciée.

31
screechOwl

cv.glmnet attend une matrice de prédicteurs, pas une trame de données. Généralement, vous pouvez l'obtenir via

X <- model.matrix(<formula>, data=<data>)

mais dans votre cas, vous pouvez probablement y arriver plus facilement avec

X <- as.matrix(t2[,-c(1,2,7,12)])

car vous ne semblez pas avoir de variables de facteur ou d'autres problèmes qui pourraient compliquer les choses.


Puisque cette réponse reçoit beaucoup de hits: le paquet glmnetUtils fournit une interface basée sur une formule à glmnet, comme celle utilisée pour la plupart des fonctions de modélisation R. Il comprend des méthodes pour glmnet et cv.glmnet, ainsi qu'un nouveau cva.glmnet fonction pour effectuer une validation croisée à la fois pour alpha et lambda.

Ce qui précède deviendrait

cv.glmnet(X2 ~ ., data=t2[-1], family="multinomial")

Les NA sont gérés automatiquement, vous n'avez donc pas à exclure les colonnes avec des valeurs manquantes.

52
Hong Ooi