Bir örnek: ikili sonuç için glmnet kullanarak LASSO regresyonu


77

Ben kullanımı ile serpmek başlıyorum glmnetile LASSO Regresyon ilgi benim sonuç dikotom olduğunu. Aşağıda küçük bir sahte veri çerçevesi oluşturdum:

age     <- c(4, 8, 7, 12, 6, 9, 10, 14, 7) 
gender  <- c(1, 0, 1, 1, 1, 0, 1, 0, 0)
bmi_p   <- c(0.86, 0.45, 0.99, 0.84, 0.85, 0.67, 0.91, 0.29, 0.88)
m_edu   <- c(0, 1, 1, 2, 2, 3, 2, 0, 1)
p_edu   <- c(0, 2, 2, 2, 2, 3, 2, 0, 0)
f_color <- c("blue", "blue", "yellow", "red", "red", "yellow", "yellow", 
             "red", "yellow")
asthma  <- c(1, 1, 0, 1, 0, 0, 0, 1, 1)
# df is a data frame for further use!
df <- data.frame(age, gender, bmi_p, m_edu, p_edu, f_color, asthma)

Yukarıdaki veri kümesindeki sütunlar (değişkenler) aşağıdaki gibidir:

  • age (yıllardaki çocuğun yaşı) - sürekli
  • gender - ikili (1 = erkek; 0 = kadın)
  • bmi_p (BMI yüzdelik) - sürekli
  • m_edu (annenin en yüksek eğitim seviyesi) - sıra (0 = liseden daha az; 1 = lise diploması; 2 = lisans derecesi; 3 = bakalorya derecesi)
  • p_edu (baba en yüksek eğitim seviyesi) - sıra (m_edu ile aynı)
  • f_color (favori ana renk) - nominal ("mavi", "kırmızı" veya "sarı")
  • asthma (çocuk astım durumu) - ikili (1 = astım; 0 = astım yok)

Bu örneğin amacı, 6 potansiyel belirleyici değişkenlerin (listesinden bir modeli tahmin çocuk astım durumunu oluşturmak için kement faydalanmak için age, gender, bmi_p, m_edu, p_edu, ve f_color). Açıkçası, örneklem büyüklüğü burada bir sorun, ancak glmnetsonuç ikili olduğunda (1 = astım ) farklı değişken türlerinin (yani sürekli, sıralı, nominal ve ikili) nasıl ele alınacağı hakkında daha fazla bilgi edinmeyi umuyorum. ; 0 = astım yok).

Bu nedenle, Rastım durumunu tahmin etmek için LASSO'yu yukarıdaki verilerle kullanan bu sahte örnek için açıklamalar ile birlikte örnek bir komut dosyası hazırlamaya istekli olan var mı? Her ne kadar çok temel olsa da, ben biliyorum ve muhtemelen CV'deki birçok kişi bunu çok takdir edecektir!


2
Verileri gerçek bir R nesnesinin dputbir ayağı olarak kaydettiyseniz, daha fazla şans elde edebilirsiniz ; okurların üzerine krema koyup sakın kek yapmayın! Eğer uygun veri çerçevesini R içinde oluşturursanız, diyelim foo, sonra çıktısını soruda düzenleyin dput(foo).
Gavin Simpson

@ GavinSimpson teşekkürler! Bir veri çerçevesi ile yazı güncellendi, bu yüzden umarım donmadan kek yemeye başladım! :)
Matt Reichenbach

2
BMI yüzdelik oranını kullanarak bir anlamda fizik yasalarına meydan okuyorsunuz. Obezite, bireyleri, mevcut deneğe ne kadar benzer olduğuna göre ölçülmeyen fiziksel ölçümlere (uzunluk, hacim, ağırlık) göre etkiler;
Frank Harrell,

3
BMI yüzdelik oranının kullanmayı tercih ettiğim bir ölçüm olmadığı konusunda hemfikirim; Bununla birlikte, CDC yönergeleri boy ve kiloya ek olarak yaş ve cinsiyet dikkate alındığında 20 yaşından küçük çocuklar ve ergenler için BMI'ye oranla BMI yüzdelik oranının (aynı zamanda oldukça sorgulanabilir bir ölçüdür!) kullanılmasını önerir. Bu değişkenlerin tümü ve veri değerleri bu örnek için tamamen düşünüldü. Bu örnek, büyük verilerle çalıştığım için şu anki çalışmamın hiçbirini yansıtmıyor. Sadece glmnetikili sonucu olan bir eylem örneği görmek istedim .
Matt Reichenbach

MCP, SCAD veya LASSO tarafından cezalandırılan lineer ve lojistik regresyon modellerine uyan ncvreg adlı Patrick Breheny'den bir paket için buraya takın. ( cran.r-project.org/web/packages/ncvreg/index.html )
bdeonovic

Yanıtlar:


100
library(glmnet)

age     <- c(4, 8, 7, 12, 6, 9, 10, 14, 7) 
gender  <- as.factor(c(1, 0, 1, 1, 1, 0, 1, 0, 0))
bmi_p   <- c(0.86, 0.45, 0.99, 0.84, 0.85, 0.67, 0.91, 0.29, 0.88) 
m_edu   <- as.factor(c(0, 1, 1, 2, 2, 3, 2, 0, 1))
p_edu   <- as.factor(c(0, 2, 2, 2, 2, 3, 2, 0, 0))
f_color <- as.factor(c("blue", "blue", "yellow", "red", "red", "yellow", 
                       "yellow", "red", "yellow"))
asthma <- c(1, 1, 0, 1, 0, 0, 0, 1, 1)

xfactors <- model.matrix(asthma ~ gender + m_edu + p_edu + f_color)[, -1]
x        <- as.matrix(data.frame(age, bmi_p, xfactors))

# Note alpha=1 for lasso only and can blend with ridge penalty down to
# alpha=0 ridge only.
glmmod <- glmnet(x, y=as.factor(asthma), alpha=1, family="binomial")

# Plot variable coefficients vs. shrinkage parameter lambda.
plot(glmmod, xvar="lambda")

görüntü tanımını buraya girin

Kategorik değişkenler genellikle etkenlere dönüştürülür, daha sonra kukla değişken bir tahmin matrisi oluşturulur ve sürekli tahminlerle birlikte modele iletilir. Akılda tutulması, glmnet hem sırt ve kement cezaları kullanır, ancak her ikisine de ayarlanabilir.

Bazı sonuçlar:

# Model shown for lambda up to first 3 selected variables.
# Lambda can have manual tuning grid for wider range.

glmmod
# Call:  glmnet(x = x, y = as.factor(asthma), family = "binomial", alpha = 1) 
# 
#        Df    %Dev   Lambda
#   [1,]  0 0.00000 0.273300
#   [2,]  1 0.01955 0.260900
#   [3,]  1 0.03737 0.249000
#   [4,]  1 0.05362 0.237700
#   [5,]  1 0.06847 0.226900
#   [6,]  1 0.08204 0.216600
#   [7,]  1 0.09445 0.206700
#   [8,]  1 0.10580 0.197300
#   [9,]  1 0.11620 0.188400
#  [10,]  3 0.13120 0.179800
#  [11,]  3 0.15390 0.171600
# ...

Katsayılar glmmod'dan çıkarılabilir. Burada seçilen 3 değişken ile gösterilir.

coef(glmmod)[, 10]
#   (Intercept)           age         bmi_p       gender1        m_edu1 
#    0.59445647    0.00000000    0.00000000   -0.01893607    0.00000000 
#        m_edu2        m_edu3        p_edu2        p_edu3    f_colorred 
#    0.00000000    0.00000000   -0.01882883    0.00000000    0.00000000 
# f_coloryellow 
#   -0.77207831 

Son olarak, lambda seçmek için çapraz doğrulama da kullanılabilir.

cv.glmmod <- cv.glmnet(x, y=asthma, alpha=1)
plot(cv.glmmod)

görüntü tanımını buraya girin

(best.lambda <- cv.glmmod$lambda.min)
# [1] 0.2732972

4
bu tam olarak aradığım şey + 1, sahip olduğum tek sorular 1) 0.2732972'nin çapraz doğrulama lambda'sı ile ne yapabilirsiniz? ve 2) glmmod'dan seçilen değişkenler favori renk (sarı), cinsiyet ve babanın eğitimi (lisans derecesi) midir? Çok teşekkürler!
Matt Reichenbach

4
1) Çapraz doğrulama, lambda ve katsayıları seçmek için kullanılır (minimum hata durumunda). Bu makette, yerel min yoktur (çok az obs ile ilgili bir uyarı da vardı); Tüm katsayıların, büzülme cezalarıyla (en iyi modelin sadece kesişebildiği) sıfıra büzüldüğünü ve daha fazla (gerçek) gözlemle tekrar çalıştırıldığını ve lambda aralığını arttırdığını yorumluyorum. 2) Evet, sığır eti (glmmod) [, 10] seçtiğim örnekte, CV için model için lambda seçersiniz veya sonuçların yorumlanması. Sorunuzu çözdüğümü hissediyorsanız Çözülmüş olarak işaretler misiniz? Teşekkürler.
pat

2
Bunun f_colordeğişkeni nasıl ele aldığını sorabilir miyim ? Faktör seviyesi 1 ila 4, 1'den 2'ye kadar olan daha büyük bir adım mı sayılıyor, yoksa hepsi eşit ağırlıkta, yönsüz ve kategorik mi? (Ben sıralanmamış tüm tahmincilerin olduğu bir analize uygulamak istiyorum.)
beroe

3
Satır xfactors <- model.matrix(asthma ~ gender + m_edu + p_edu + f_color)[,-1], f_color kategorisindeki değişkeni kodlar ( as.factorönceki satırlarda bildirildiği şekilde). contrasts.argArgüman sağlanmadıkça , varsayılan R boş değişken kodlamasını kullanmalıdır . Bu, f_color'un tüm seviyelerinin, referans sınıfı olarak kullanılan ve kesişme noktasına emilen ilk hariç hariç, eşit ağırlıklı ve yönsüz olduğu anlamına gelir.
Alex,

1
@Alex model.matrix(asthma ~ gender + m_edu + p_edu + f_color + age + bmi_p)[, -1]yukarıdaki iki satırla aynı sonucu vermez mi? Sürekli değişkenleri birleştirmek için neden fazladan bir adım kullanmalısınız data.frame?
jiggunjer

6

Tercih edilen yöntemim olduğundan enet paketini kullanacağım. Biraz daha esnek.

install.packages('elasticnet')
library(elasticnet)

age <- c(4,8,7,12,6,9,10,14,7) 
gender <- c(1,0,1,1,1,0,1,0,0)
bmi_p <- c(0.86,0.45,0.99,0.84,0.85,0.67,0.91,0.29,0.88)
m_edu <- c(0,1,1,2,2,3,2,0,1)
p_edu <- c(0,2,2,2,2,3,2,0,0)
#f_color <- c("blue", "blue", "yellow", "red", "red", "yellow", "yellow", "red", "yellow")
f_color <- c(0, 0, 1, 2, 2, 1, 1, 2, 1)
asthma <- c(1,1,0,1,0,0,0,1,1)
pred <- cbind(age, gender, bmi_p, m_edu, p_edu, f_color)



enet(x=pred, y=asthma, lambda=0)

4
paylaşım için teşekkürler elasticnet; Bununla birlikte, yukarıdaki Rbetiğin çıktısını ne yapacağımı bilmiyorum . Lütfen açıklar mısın? Şimdiden teşekkürler!
Matt Reichenbach

4

Sadece pat tarafından sağlanan mükemmel örneği genişletmek için. Orijinal problem, sıralı değişkenleri (m_edu, p_edu) ortaya koymuş, düzeyler arasında (0 <1 <2 <3) doğal bir sıra vardır. Pat'in orijinal cevabında, bunların aralarında sıralanmayan nominal kategorik değişkenler olarak ele alındığını düşünüyorum. Yanılıyor olabilirim, ancak bu değişkenlerin modelin kendi iç düzenine saygı gösterecek şekilde kodlanması gerektiğine inanıyorum. Bunlar sıralı faktörler olarak kodlanmışsa (pat'in cevabındaki sırasız faktörler yerine) glmnet biraz farklı sonuçlar verir ... Aşağıdaki kodun sıralı değişkenleri sıralı faktörler olarak doğru şekilde içerdiğini ve biraz farklı sonuçlar verdiğini düşünüyorum:

library(glmnet)

age     <- c(4, 8, 7, 12, 6, 9, 10, 14, 7) 
gender  <- as.factor(c(1, 0, 1, 1, 1, 0, 1, 0, 0))
bmi_p   <- c(0.86, 0.45, 0.99, 0.84, 0.85, 0.67, 0.91, 0.29, 0.88) 
m_edu   <- factor(c(0, 1, 1, 2, 2, 3, 2, 0, 1), 
                  ordered = TRUE)
p_edu   <- factor(c(0, 2, 2, 2, 2, 3, 2, 0, 0), 
                  levels = c(0, 1, 2, 3), 
                  ordered = TRUE)
f_color <- as.factor(c("blue", "blue", "yellow", "red", "red", 
                       "yellow", "yellow", "red", "yellow"))
asthma <- c(1, 1, 0, 1, 0, 0, 0, 1, 1)

xfactors <- model.matrix(asthma ~ gender + m_edu + p_edu + f_color)[, -1]
x        <- as.matrix(data.frame(age, bmi_p, xfactors))

# Note alpha=1 for lasso only and can blend with ridge penalty down to
# alpha=0 ridge only.
glmmod <- glmnet(x, y=as.factor(asthma), alpha=1, family="binomial")

# Plot variable coefficients vs. shrinkage parameter lambda.
plot(glmmod, xvar="lambda")

görüntü tanımını buraya girin


1
sometimes_sci, iyi yakalama - bu, eğitim seviyesi değişkenlerini modellemenin en uygun yoludur. Katkınız için teşekkürler.
Matt Reichenbach

Biri değişkenler için arsa efsanesini nasıl ekler? Örneğin, bu örnekteki kırmızı çizgi nedir?
jiggunjer
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.