การถดถอยโลจิสติกแบบเบย์ปกติใน JAGS


14

มีเอกสารทางคณิตศาสตร์มากมายที่อธิบาย Bayesian Lasso แต่ฉันต้องการทดสอบและแก้ไขรหัส JAGS ที่ฉันสามารถใช้ได้

ใครบางคนสามารถโพสต์ตัวอย่างรหัส BUGS / JAGS ที่ใช้การถดถอยโลจิสติกปกติ? รูปแบบใด ๆ (L1, L2, Elasticnet) จะดี แต่ Lasso เป็นที่ต้องการ ฉันยังสงสัยว่ามีกลยุทธ์การใช้งานทางเลือกที่น่าสนใจหรือไม่

คำตอบ:


19

เนื่องจากการทำให้เป็นมาตรฐาน L1 เทียบเท่ากับ Laplace (เลขชี้กำลังสองเท่า) ก่อนค่าสัมประสิทธิ์ที่เกี่ยวข้องคุณสามารถทำได้ดังนี้ ที่นี่ฉันมีสามตัวแปรอิสระ x1, x2 และ x3 และ y เป็นตัวแปรเป้าหมายไบนารี การเลือกพารามิเตอร์การทำให้เป็นมาตรฐานทำได้ที่นี่โดยการใส่ไฮเพอร์ไพรซ์ลงบนมันในกรณีนี้ให้มีขนาดที่เท่ากันλ

model {
  # Likelihood
  for (i in 1:N) {
    y[i] ~ dbern(p[i])

    logit(p[i]) <- b0 + b[1]*x1[i] + b[2]*x2[i] + b[3]*x3[i]
  }

  # Prior on constant term
  b0 ~ dnorm(0,0.1)

  # L1 regularization == a Laplace (double exponential) prior 
  for (j in 1:3) {
    b[j] ~ ddexp(0, lambda)  
  }

  lambda ~ dunif(0.001,10)
  # Alternatively, specify lambda via lambda <- 1 or some such
}

มาลองใช้dcloneแพ็คเกจใน R กันเถอะ

library(dclone)

x1 <- rnorm(100)
x2 <- rnorm(100)
x3 <- rnorm(100)

prob <- exp(x1+x2+x3) / (1+exp(x1+x2+x3))
y <- rbinom(100, 1, prob)

data.list <- list(
  y = y,
  x1 = x1, x2 = x2, x3 = x3,
  N = length(y)
)

params = c("b0", "b", "lambda")

temp <- jags.fit(data.list, 
                 params=params, 
                 model="modela.jags",
                 n.chains=3, 
                 n.adapt=1000, 
                 n.update=1000, 
                 thin=10, 
                 n.iter=10000)

และนี่คือผลลัพธ์เมื่อเปรียบเทียบกับการถดถอยโลจิสติกที่ไม่สม่ำเสมอ:

> summary(temp)

<< blah, blah, blah >> 

1. Empirical mean and standard deviation for each variable,
   plus standard error of the mean:

          Mean     SD Naive SE Time-series SE
b[1]   1.21064 0.3279 0.005987       0.005641
b[2]   0.64730 0.3192 0.005827       0.006014
b[3]   1.25340 0.3217 0.005873       0.006357
b0     0.03313 0.2497 0.004558       0.005580
lambda 1.34334 0.7851 0.014333       0.014999

2. Quantiles for each variable: << deleted to save space >>

> summary(glm(y~x1+x2+x3, family="binomial"))

  << blah, blah, blah >>

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)  0.02784    0.25832   0.108   0.9142    
x1           1.34955    0.32845   4.109 3.98e-05 ***
x2           0.78031    0.32191   2.424   0.0154 *  
x3           1.39065    0.32863   4.232 2.32e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

<< more stuff deleted to save space >>

และเราจะเห็นได้ว่าbพารามิเตอร์ทั้งสามนั้นถูกย่อลงจนเหลือศูนย์

ฉันไม่ค่อยรู้อะไรเกี่ยวกับ priors สำหรับ hyperparameter ของการแจกแจง Laplace / พารามิเตอร์ normalization ฉันขอโทษที่จะพูด ฉันมักจะใช้การแจกแจงแบบสม่ำเสมอและมองไปที่ด้านหลังเพื่อดูว่ามันมีความประพฤติดีพอสมควรหรือไม่เช่นไม่พะเนินใกล้จุดสิ้นสุด จนถึงตอนนี้ก็เป็นกรณีปกติ การปฏิบัติต่อมันเป็นพารามิเตอร์ความแปรปรวนและการใช้ข้อเสนอแนะโดย Gelman การแจกแจงก่อนหน้าสำหรับพารามิเตอร์ความแปรปรวนในตัวแบบลำดับชั้นทำงานให้ฉันเช่นกัน


1
คุณเก่งที่สุด! ฉันจะเปิดคำถามทิ้งไว้ซักครู่ในกรณีที่บางคนมีการนำไปใช้อีกครั้ง สำหรับหนึ่งดูเหมือนว่าตัวบ่งชี้ไบนารีสามารถใช้เพื่อกำหนดการรวม / แยกตัวแปร สิ่งนี้ชดเชยความจริงที่ว่าภายใต้การเลือกตัวแปร Bayesian Lasso ไม่ได้เกิดขึ้นจริงเนื่องจาก betas ที่มีเลขชี้กำลังสองเท่าก่อนหน้านี้จะไม่มี posteriors ที่มีค่าเท่ากับศูนย์
Jack Tanner

ผม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.