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