Regresión logística bayesiana regularizada en JAGS

13

Hay varios documentos matemáticos que describen el lazo bayesiano, pero quiero probar el código JAGS correcto que puedo usar.

¿Alguien podría publicar código BUGS / JAGS de muestra que implemente la regresión logística regularizada? Cualquier esquema (L1, L2, Elasticnet) sería genial, pero se prefiere Lasso. También me pregunto si hay estrategias de implementación alternativas interesantes.

Jack Tanner
fuente

Respuestas:

19

λ

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
}

¡Probémoslo usando el dclonepaquete en 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)

Y aquí están los resultados, en comparación con una regresión logística no regularizada:

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

Y podemos ver que los tres bparámetros se han reducido a cero.

No sé mucho sobre los antecedentes del hiperparámetro de la distribución de Laplace / el parámetro de regularización, lamento decirlo. Tiendo a usar distribuciones uniformes y miro a la parte posterior para ver si se ve razonablemente bien comportada, por ejemplo, no apilada cerca de un punto final y casi alcanzó su punto máximo en el medio sin problemas de asimetría horribles. Hasta ahora, ese ha sido típicamente el caso. Tratarlo como un parámetro de varianza y usar las recomendaciones de Gelman Las distribuciones previas para parámetros de varianza en modelos jerárquicos también me funcionan.

jbowman
fuente
1
¡Eres la mejor! Dejaré la pregunta abierta por un momento en caso de que alguien tenga otra implementación. Por un lado, parece que los indicadores binarios se pueden utilizar para imponer la inclusión / exclusión variable. Esto compensa el hecho de que, bajo Bayesian Lasso, la selección de variables no ocurre realmente, ya que las betas con el doble exponencial anterior no tendrán posteriores que sean exactamente cero.
Jack Tanner
Bien, yo también hago eso. Es similar a crear un previo con una masa de punto en 0, luego usar el truco de ceros para muestrearlo (el previo ensiyoluego se convierte en una mezcla de un punto de masa en 0 y un doble exponencial), aunque el código es diferente. Me interesará ver qué hacen otras personas, +1 a la pregunta.
jbowman