2011-12-10 18 views
20

Veri kümesindeki glmnet paketini kullanmaya çalışıyorum. glmnet() için bir lambda değeri almak için cv.glmnet() kullanıyorum. Ben sütunları 1,2,7,12 hariç ediyorumR glmnet: "(liste) nesnesi 'double' yazmak için zorlanamaz"

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

oldukları gibi: id sütunu, tepki sütun NA adlı içerir ve NA adlı ihtiva Burada veri kümesi ve hata mesajı yok. Herhangi bir öneri harika olurdu. Bir veri çerçevesi değil, bir kestirici matrisini bekler.

cevap

39

cv.glmnet Eğer herhangi bir faktör değişkenleri veya zorlaştıran diğer sorunları var görünüyor olmadığı Genellikle

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

aracılığıyla ancak sizin durumunuzda bu elde edebilirsiniz, muhtemelen

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

ile daha kolayca alabilirsiniz konular. Bu yanıt beri


bol isabet oluyor: glmnetUtils package çoğu R modelleme fonksiyonları için kullanılan gibi bir formül tabanlı arayüz, glmnet sağlamaktadır. glmnet ve cv.glmnet için yöntemlerin yanı sıra, hem alfa hem de lambda için çapraz eşlemeli yeni bir cva.glmnet işlevini içerir.

yukarıda Eksik değerlerle sütunları hariç zorunda kalmamak

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

NA adlı

otomatik olarak çözülür hale gelecektir.

+6

Hızlı not, as.matrix() yerine, kullanmak zorunda kaldım: data.matrix(). – screechOwl

+1

@screechOwl: 'data.matrix() 'işlevini kullanmanız gerektiğini görmüyorum; tüm değişkenler int veya num idi. Nedenini tekrar kontrol edebilir misin? – smci