Regresi logistik bayes yang teratur dalam JAGS

13

Ada beberapa makalah matematika-berat yang menggambarkan Bayesian Lasso, tapi saya ingin menguji, kode JAGS benar yang bisa saya gunakan.

Bisakah seseorang memposting sampel kode BUGS / JAGS yang mengimplementasikan regresi logistik yang diatur? Skema apa pun (L1, L2, Elasticnet) akan bagus, tetapi Lasso lebih disukai. Saya juga bertanya-tanya apakah ada strategi implementasi alternatif yang menarik.

Jack Tanner
sumber

Jawaban:

19

Karena regularisasi L1 setara dengan Laplace (eksponensial ganda) sebelum koefisien yang relevan, Anda dapat melakukannya sebagai berikut. Di sini saya memiliki tiga variabel independen x1, x2, dan x3, dan y adalah variabel target biner. Pemilihan parameter regularisasi λ dilakukan di sini dengan meletakkan hyperprior di atasnya, dalam hal ini hanya seragam pada rentang ukuran yang baik.

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
}

Mari kita coba menggunakan dclonepaket di 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)

Dan inilah hasilnya, dibandingkan dengan regresi logistik yang tidak diregulasi:

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

Dan kita dapat melihat bahwa ketiga bparameter memang telah menyusut ke nol.

Saya tidak tahu banyak tentang prior untuk hyperparameter dari distribusi Laplace / parameter regularisasi, saya minta maaf untuk mengatakan. Saya cenderung menggunakan distribusi seragam dan melihat posterior untuk melihat apakah itu terlihat cukup baik, misalnya, tidak menumpuk di dekat titik akhir dan cukup memuncak di tengah tanpa masalah kemiringan yang mengerikan. Sejauh ini, itulah yang biasanya terjadi. Memperlakukannya sebagai parameter varians dan menggunakan rekomendasi (s) oleh distribusi Gelman Prior untuk parameter varians dalam model hierarkis juga berfungsi untuk saya.

Jbowman
sumber
1
Kamu yang terbaik! Saya akan membiarkan pertanyaan terbuka untuk sementara waktu jika seseorang memiliki implementasi lain. Untuk satu, tampaknya indikator biner dapat digunakan untuk memaksakan variabel inklusi / pengecualian. Ini mengimbangi kenyataan bahwa di bawah pemilihan variabel Bayesian Lasso sebenarnya tidak terjadi, karena beta dengan eksponensial ganda sebelumnya tidak akan memiliki posisi yang persis nol.
Jack Tanner
bsaya