Çok terimli glmnet çalıştırılırken hata oluştu [kapalı]


9

Bu soruda belirtilen sorun R paket glmnet 1.7.3 sürümünde giderilmiştir.

Ben aile = multinomial ile glmnet çalışan bazı sorunlar yaşıyorum, ve benzer bir şey karşılaştı ya da bana ne yanlış yaptığımı söyleyebilir merak ediyordum.

Kendi kukla verilerimi koyduğumda, "Uygulanma hatası (nz, 1, medyan): dim (X) pozitif bir uzunluğa sahip olmalı" hatası çalıştırdığımda bildirildi cv.glmnet, "çalışmadı" benim için çok bilgilendirici değildi.

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

İşte eğer yardımcı olursa, glmnet'i almaya çalıştığım sorunun görsel bir açıklaması:

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

Paket kodlarından örnek kodu çalıştırabiliyorum, bu da bir şeyi yanlış anladığımdan veya glmnet'te bir hata olduğundan şüpheleniyor.

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")

Bu, R 2.14.1'de aynı sorunu oluşturabilsem de, R sürüm 2.13.1 (2011-07-08) ve glmnet 1.7.1 kullanıyor. Herhangi bir fikir var mı?

Yanıtlar:


11

İnce bir böcek var.

Olan şu: Yapay veri setinizde, üç grup aracı bir çizgi üzerindedir ve kullanılan nispeten küçük standart sapma ile, üç grup 10 boyutlu alanınızda doğrusal olarak ayrılabilir hale gelir. Sonuç olarak, ikinci grupla ilgili tüm parametrelerin allλ için 0 olduğu tahmin edilmektedir . Kontrol

coef(glm)

Dahili olarak her için sıfır olmayan katsayıların sayısını belirlemeye yönelik cv.glmnetbir çağrı vardır . Deneyinpredictλ

predict(glm, type = "nonzero")

Yapı, cv.glmnetkodu okuduktan sonra , bir liste listesi olması gerekiyordu, ancak listedeki ikinci giriş bir liste değil, NULL! Bu hataya neden olur. Bu kod bloğundacv.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))
}

İki iç içe sapplyçağrıdan döndürülen sonuç , son çağrısında beklendiği gibi bir matris değildir apply. Bu hatayı oluşturur.

Pratikte hataya girmek çok olası olmayabilir, ancak kodun elbette aşırı durumlarda sağlam olması gerekir. Sorunu bakıcı Trevor Hastie'ye bildirmelisin (e-postası bağlantıda listelenmiştir).


Düşünceli ve hızlı cevap için teşekkürler. Söylediğiniz çoğu şey doğru gibi görünüyor, ancak bunun doğrusal olarak ayrılabilir olmalarının nedeni olduğundan emin değilim. Girişlerdeki rnorm sd değerini artırırsanız, hata
giderilir

1
NRH: İlgisiz bir düşünce - Prof.Dr.Hattie'nin e-postalarını spam'i davet ettiği için bu gibi düz metinlere koymayı takdir etmeyebileceğinden şüpheleniyorum (elbette söylemek mümkün olmasa da). Cevabınız çok yardımcı olduğu için sert ses çıkarmak
istemiyorum

2
@BenJWoodcroft, hatayı tetikleyen doğrusal ayrılabilirlik değil, üç grubun bir çizgi boyunca geometrik organizasyonunu tetikler. Doğrusal ayrılabilirlik, bu organizasyonu örneklenen verilerde daha belirgin hale getirir ve standart sapmayı yeterince artırırsanız, glmnet kuruluşu "keşfetmez". İkinci örneğinizin de gösterdiği gibi, aslında doğrusal ayrılabilirliğe ihtiyacınız yoktur. E-posta adresi konusunda haklısın, teşekkürler.
NRH

3
Ben de bu hatayı glmnet 1.9.8 ve R 3.1.1 ile yukarıdaki kod yanı sıra vignette örnek verileri ile sağlanan kodu ile alıyorum.
user2030668

1
Bu hatayı Windows'ta R 3.2.1 ve glmnet 2.0-2 kullanarak gerçek dünyadaki verilerle görüyorum. Eğitim verisi 229 öngörücünün 449 gözlemine sahiptir. Yanıt değişkeni 9 seviyeye sahiptir. Nasıl ilerleyeceğinize dair herhangi bir öneri memnuniyetle karşılanacaktır.
Kent Johnson

-1

Önce matrisinizi dönüştürün

x sayısal yanıt olmadan. Bundan sonra, modele katkıda bulunan anlamlı katsayı (lar) veri yapılarında olduğu gibi arama colnames veya rownames tarafından bulunur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.