2017-04-04 1 views
0

Je suis en train d'obtenir la valeur lambda, j'ai trouvé cette question: R glmnet : "(list) object cannot be coerced to type 'double' "r erreur glmnet: objet ne peut pas être contraint de taper « double »

ne peut pas comprendre comment cependant faire appliquer. voici le code:

faba <- read.table("abalone.txt",sep=",") 
faba$y <- ifelse(faba$V9>9,1,0) 
head(faba) 

xtrain <- faba[1:3133,1:8] 
ytrain <- faba[1:3133,10] 
xtest <- faba[-c(1:3133),1:8] 
ytest <- faba[-c(1:3133),10] 


#find mean, std in xtrain 
mean_xtrain <- sapply(xtrain[2:8], mean) 
sd_xtrain <- sapply(xtrain[2:8], sd) 


ytrain_norm <- as.factor(ytrain) 
ytest_norm <- as.factor(ytest) 


#standardise xtrain with overall mean,sd 
xtrain_norm <- faba[1:3133,1:8] 
for(i in c(2,3,4,5,6,7,8)){ 
    xtrain_norm[i] <- (xtrain_norm[i]-mean_xtrain[i-1])/sd_xtrain[i-1] 
} 


#standardise xtest with xtrain mean,sd 
xtest_norm <- faba[-c(1:3133),1:8] 
for(i in c(2,3,4,5,6,7,8)){ 
    xtest_norm[i] <- (xtest_norm[i]-mean_xtrain[i-1])/sd_xtrain[i-1] 
} 


cvstd <- cv.glmnet(xtrain_norm, ytrain, family = "binomial", 
        alpha = 0, nfolds = 10, type.measure = "class") 

je puis obtenir l'erreur:

Error in lognet(x, is.sparse, ix, jx, y, weights, offset, alpha, nobs, : 
    (list) object cannot be coerced to type 'double' 

Et je ne peux pas comprendre comment résoudre ce problème. Que signifie même l'erreur? Tous les conseils seraient grandement appréciés!
C'est ce que les données ressemble à:

> head(faba) 
    V1 V2 V3 V4  V5  V6  V7 V8 V9 y 
1 M 0.455 0.365 0.095 0.5140 0.2245 0.1010 0.150 15 1 
2 M 0.350 0.265 0.090 0.2255 0.0995 0.0485 0.070 7 0 
3 F 0.530 0.420 0.135 0.6770 0.2565 0.1415 0.210 9 0 
4 M 0.440 0.365 0.125 0.5160 0.2155 0.1140 0.155 10 1 
5 I 0.330 0.255 0.080 0.2050 0.0895 0.0395 0.055 7 0 
6 I 0.425 0.300 0.095 0.3515 0.1410 0.0775 0.120 8 0 
+1

Est-ce que le problème se produit encore si vous supprimez 'V1'? Ma première supposition est que vous avez un facteur ou une variable de caractère dans vos données. Aussi, au lieu de 'c (2,3,4,5,6,7,8)', utilisez simplement '2: 8'. – Phil

+0

J'ai trouvé une solution, il y a une fonction appelée scale qui fait le tour et permet à la dernière ligne de code de fonctionner comme elle le requiert matrice – rannoudanames

+0

Veuillez fournir une réponse détaillée pour que d'autres qui pourraient se retrouver dans une situation similaire puissent appliquez votre solution. – Phil

Répondre

0
faba <- read.table("abalone.txt",sep=",") 
faba$y <- ifelse(faba$V9>9,1,0) 
head(faba) 

xtrain <- faba[1:3133,1:8] 
ytrain <- faba[1:3133,10] 
xtest <- faba[-c(1:3133),1:8] 
ytest <- faba[-c(1:3133),10] 

#find mean, std in xtrain 
(mean_xtrain <- sapply(xtrain[2:8], mean)) 
(sd_xtrain <- sapply(xtrain[2:8], sd)) 

#standardise xtrain with overall mean,sd 
xtrain_norm <- cbind(xtrain[,1],scale(xtrain[,2:8])) 
ytrain_norm <- as.factor(ytrain) 
#standardise xtest with xtrain mean,sd 
xtest_norm <- faba[-c(1:3133),1:8] 
xtest_norm <- cbind(xtest_norm[,1],scale(xtest_norm[,2:8],center=mean_xtrain,scale=sd_xtrain)) 
ytest_norm <- as.factor(ytest) 

Cela permet d'avoir sous forme de matrice qui est nécessaire pour la glmnet