Kesalahan saat menjalankan glmnet di multinomial [ditutup]

9

Masalah yang disebutkan dalam pertanyaan ini diperbaiki dalam versi 1.7.3 dari paket R glmnet.

Saya mengalami beberapa masalah menjalankan glmnet dengan keluarga = multinomial, dan bertanya-tanya telah menemukan sesuatu yang serupa atau mungkin dapat memberi tahu saya apa yang saya lakukan salah.

Ketika saya memasukkan data dummy saya sendiri, kesalahan "Kesalahan dalam menerapkan (nz, 1, median): redup (X) harus memiliki panjang positif" akan dilaporkan ketika saya menjalankan cv.glmnet, yang selain mengatakan "itu tidak berhasil" tidak sangat informatif bagi saya.

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

Berikut adalah deskripsi visual dari masalah yang saya coba dapatkan untuk diselesaikan oleh glmnet, jika itu membantu:

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

Saya dapat menjalankan kode contoh dari dokumen paket, yang membuat saya curiga bahwa saya salah memahami sesuatu atau ada bug di 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")

Ini menggunakan versi R 2.13.1 (2011-07-08) dan glmnet 1.7.1, meskipun saya dapat menghasilkan masalah yang sama pada R 2.14.1. Ada ide orang?

BenJWoodcroft
sumber

Jawaban:

11

Ada bug halus.

Apa yang terjadi adalah sebagai berikut: Dalam kumpulan data buatan Anda, rata-rata tiga kelompok berada pada satu garis, dan dengan standar deviasi yang relatif kecil, ketiga kelompok menjadi terpisah secara linear dalam ruang 10-dimensi Anda. Sebagai konsekuensinya, semua parameter yang terkait dengan kelompok kedua diperkirakan 0 untuk semuaλ . Memeriksa

coef(glm)

Secara internal cv.glmnetada panggilan untuk predictmenentukan untuk setiap jumlah koefisien tidak nol. Mencobaλ

predict(glm, type = "nonzero")

Strukturnya, dari membaca cv.glmnetkode, seharusnya menjadi daftar daftar, tetapi entri kedua dalam daftar adalah NULL, dan bukan daftar! Ini menyebabkan kesalahan. Itu terjadi di blok kode ini daricv.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))
}

Hasil yang dikembalikan dari dua sapplypanggilan bersarang bukan matriks seperti yang diharapkan pada panggilan terakhir apply. Ini menghasilkan kesalahan.

Mungkin sangat tidak mungkin untuk menemukan kesalahan dalam praktiknya, tetapi kode itu tentu saja harus kuat untuk kasus-kasus ekstrim. Anda harus melaporkan masalahnya ke pengelola, Trevor Hastie (emailnya tercantum di tautan).

NRH
sumber
Terima kasih atas jawaban yang bijaksana dan cepat. Kebanyakan hal yang Anda katakan tampaknya benar, tetapi saya tidak yakin alasannya karena keduanya dapat dipisahkan secara linear. Jika Anda menambah sd rnorm dalam input, kesalahan hilang:
BenJWoodcroft
1
NRH: Satu pemikiran yang tidak berhubungan - saya curiga Prof. Hastie mungkin tidak menghargai Anda memasukkan emailnya dalam bentuk teks seperti itu karena mungkin mengundang spam (walaupun tentu saja mustahil untuk memastikannya). Saya tidak bermaksud terdengar kasar karena jawaban Anda sangat membantu ..
BenJWoodcroft
2
@ BenJWoodcroft, bukan keterpisahan linier dengan demikian yang memicu kesalahan tetapi organisasi geometris dari tiga kelompok di sepanjang garis. Keterpisahan linear membuat organisasi ini lebih jelas dalam data sampel, dan jika Anda meningkatkan standar deviasi secukupnya, glmnet tidak "menemukan" organisasi. Seperti contoh kedua Anda tunjukkan, Anda sebenarnya tidak memerlukan pemisahan linear. Anda benar tentang alamat emailnya, terima kasih.
NRH
3
Saya juga mendapatkan kesalahan ini dengan glmnet 1.9.8 dan dengan R 3.1.1 dengan kode di atas serta kode yang disediakan pada sketsa dengan data sampel.
user2030668
1
Saya melihat kesalahan ini dengan data dunia nyata menggunakan R 3.2.1 pada Windows dan glmnet 2.0-2. Data pelatihan memiliki 449 pengamatan dari 229 prediktor. Variabel respons memiliki 9 level. Setiap saran tentang cara melanjutkan akan diterima.
Kent Johnson
-1

Pertama-tama, konversikan matriks Anda

x tanpa respons ke numerik. Setelah itu, koefisien signifikan yang berkontribusi pada model ditemukan dengan mencari nama atau rownames seperti dalam struktur data variabel.

Muhammad Naeem
sumber