Lỗi khi chạy glmnet trong đa quốc gia [đã đóng]


9

Vấn đề được đề cập trong câu hỏi này được khắc phục trong phiên bản 1.7.3 của gói glmnet R.

Tôi đang gặp một số vấn đề khi chạy glmnet với gia đình = đa quốc gia và đang tự hỏi đã gặp phải điều gì đó tương tự hoặc có thể cho tôi biết tôi đang làm gì sai.

Khi tôi đặt dữ liệu giả của mình vào, lỗi "Lỗi khi áp dụng (nz, 1, trung vị): dim (X) phải có độ dài dương" được báo cáo khi tôi chạy cv.glmnet, ngoài việc nói "nó không hoạt động" không phải là rất nhiều thông tin cho tôi.

y=rep(1:3,20) #=> 60 element vector
set.seed(1011)
x=matrix(y+rnorm(20*3*10,sd=0.4),nrow=60) # 60*10 element matrix
glm = glmnet(x,y,family="multinomial")   #=> returns without error
crossval = cv.glmnet(x,y,family="multinomial")   #=> Error in apply(nz, 1, median) : dim(X) must have a positive length
crossval = cv.glmnet(x,y,family="multinomial",type.measure="class")   #=> Error in apply(nz, 1, median) : dim(X) must have a positive length
crossval = cv.glmnet(x,y,family="multinomial",type.measure="mae")   #=> Error in apply(nz, 1, median) : dim(X) must have a positive length
cvglm = cv.glmnet(x,y,family="multinomial",lambda=2)   #=> Error in apply(nz, 1, median) : dim(X) must have a positive length

Đây là một mô tả trực quan về vấn đề tôi đã cố gắng để có được glmnet để giải quyết, nếu điều đó giúp:

my_colours = c('red','green','blue')
plot(x[,1],x[,2],col=my_colours[y])

Tôi có thể chạy mã ví dụ từ các tài liệu gói, điều này khiến tôi nghi ngờ rằng tôi đang hiểu nhầm điều gì đó hoặc có lỗi trong glmnet.

library(glmnet)
set.seed(10101)
n=1000;p=30
x=matrix(rnorm(n*p),n,p) #=> 1000*30 element matrix
beta3=matrix(rnorm(30),10,3)
beta3=rbind(beta3,matrix(0,p-10,3))
f3=x%*% beta3
p3=exp(f3)
p3=p3/apply(p3,1,sum)
g3=rmult(p3) #=> 1000 element vector
set.seed(10101)
cvfit=cv.glmnet(x,g3,family="multinomial")

Đây là sử dụng phiên bản R 2.13.1 (2011-07-08) và glmnet 1.7.1, mặc dù tôi có thể tạo ra vấn đề tương tự trên R 2.14.1. Mọi người có ý kiến ​​gì không?

Câu trả lời:


11

Có một lỗi tinh tế.

λ

coef(glm)

cv.glmnetpredictλ

predict(glm, type = "nonzero")

Cấu trúc là, từ việc đọc cv.glmnetmã, được cho là một danh sách các danh sách, nhưng mục thứ hai trong danh sách là NULL, và không phải là một danh sách! Điều này gây ra lỗi. Nó xảy ra trong khối mã này từcv.glmnet

if (inherits(glmnet.object, "multnet")) {
    nz = predict(glmnet.object, type = "nonzero")
    nz = sapply(nz, function(x) sapply(x, length))
    nz = ceiling(apply(nz, 1, median))
}

Kết quả trả về từ hai sapplycuộc gọi lồng nhau không phải là một ma trận như mong đợi trong cuộc gọi cuối cùng của apply. Điều này tạo ra lỗi.

Có thể rất khó xảy ra lỗi trong thực tế, nhưng mã tất nhiên phải mạnh mẽ cho các trường hợp cực đoan. Bạn nên báo cáo vấn đề với người bảo trì, Trevor Hastie (email của anh ấy được liệt kê tại liên kết).


Cảm ơn đã trả lời chu đáo và nhanh chóng. Hầu hết những điều bạn nói dường như là chính xác, nhưng tôi không chắc lý do nhất thiết là chúng có thể phân tách tuyến tính. Nếu bạn tăng sd của rnorm trong các đầu vào, lỗi sẽ biến mất:
BenJWoodcroft

1
NRH: Một suy nghĩ không liên quan - Tôi nghi ngờ rằng Giáo sư Hastie có thể không đánh giá cao việc bạn gửi email của mình ở dạng văn bản đơn giản như thế vì nó có thể mời thư rác (tất nhiên là không thể biết chắc chắn). Tôi không có ý gay gắt vì câu trả lời của bạn rất hữu ích ..
BenJWoodcroft

2
@BenJWoodcroft, không phải phân tách tuyến tính như vậy gây ra lỗi mà là tổ chức hình học của ba nhóm dọc theo một dòng. Khả năng phân tách tuyến tính làm cho tổ chức này rõ ràng hơn trong dữ liệu được lấy mẫu và nếu bạn tăng độ lệch chuẩn đủ, glmnet sẽ không "khám phá" tổ chức. Như ví dụ thứ hai của bạn cho thấy, bạn thực sự không cần phân tách tuyến tính. Bạn nói đúng về địa chỉ email, cảm ơn.
NRH

3
Tôi cũng gặp lỗi này với glmnet 1.9.8 và với R 3.1.1 với mã ở trên cũng như mã được cung cấp trên họa tiết với dữ liệu mẫu.
dùng2030668

1
Tôi thấy lỗi này với dữ liệu trong thế giới thực khi sử dụng R 3.2.1 trên Windows và glmnet 2.0-2. Dữ liệu đào tạo có 449 quan sát của 229 người dự đoán. Biến phản ứng có 9 cấp độ. Bất kỳ đề xuất về cách tiến hành sẽ được hoan nghênh.
Kent Johnson

-1

Đầu tiên chuyển đổi ma trận của bạn chẳng hạn

x mà không trả lời thành số. Sau đó, các hệ số có ý nghĩa đóng góp cho mô hình tìm thấy bằng cách tìm kiếm tên hoặc tên gọi như trong cấu trúc dữ liệu của các biến.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.