2011-12-10 8 views
20

Tôi đang cố sử dụng gói glmnet trên tập dữ liệu. Tôi đang sử dụng cv.glmnet() để nhận giá trị lambda cho glmnet(). Đây là tập dữ liệu và thông báo lỗi:R glmnet: "(danh sách) đối tượng không thể bị ép buộc để nhập 'đôi'"

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

Tôi loại trừ cột 1,2,7,12 vì cột: cột id, cột phản hồi, chứa NA và chứa NA. Bất kỳ đề xuất nào cũng sẽ rất tuyệt.

Trả lời

39

cv.glmnet mong đợi một ma trận các yếu tố dự báo, không phải là khung dữ liệu. Nói chung, bạn có thể có được điều này thông qua

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

nhưng trong trường hợp của bạn, có lẽ bạn có thể đạt được điều đó một cách dễ dàng hơn với

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

kể từ khi bạn dường như không có bất kỳ biến yếu tố hoặc các vấn đề khác mà có thể làm phức tạp vấn đề.


Kể từ khi câu trả lời này là nhận được rất nhiều lượt truy cập: các glmnetUtils package cung cấp một giao diện dựa trên công thức để glmnet, như được sử dụng cho hầu hết các chức năng mô hình R. Nó bao gồm các phương thức cho glmnetcv.glmnet, cũng như một hàm cva.glmnet mới để thực hiện quá trình cộng hưởng cho cả alpha và lambda.

Trên đây sẽ trở thành

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

NA của được xử lý tự động, vì vậy bạn không cần phải loại bỏ các cột với các giá trị còn thiếu.

+6

Lưu ý nhanh, thay vì as.matrix(), tôi đã phải sử dụng: data.matrix(). – screechOwl

+1

@screechOwl: Tôi không thấy rằng bạn cần sử dụng 'data.matrix()'; tất cả các biến của bạn là int hoặc num. Bạn có thể kiểm tra lại tại sao không? – smci