Regresión generalizada ponderada en BUGS, JAGS

10

En Rpodemos "ponderar previamente" una glmregresión a través del parámetro de pesos . Por ejemplo:

glm.D93 <- glm(counts ~ outcome + treatment, family = poisson(), weights=w)

¿Cómo se puede lograr esto en una JAGSo BUGSmodelo?

Encontré un artículo discutiendo esto, pero ninguno de ellos proporciona un ejemplo. Me interesan principalmente los ejemplos de regresión logística y Poisson.

usuario28937
fuente
+1 muy buena pregunta! Le pregunté a algunos especialistas bayesianos y solo dicen que en algunos casos (ponderaciones según la covariable categórica), puede calcular la distribución posterior de los parámetros para cada categoría y luego combinarlos en una media ponderada. Sin embargo, no me dieron una solución general, ¡así que estaría realmente interesado si existe o no!
Curioso

Respuestas:

7

Puede que sea tarde ... pero,

Tenga en cuenta 2 cosas:

  • No se recomienda agregar puntos de datos, ya que cambiaría los grados de libertad. Las estimaciones medias de efecto fijo podrían estimarse bien, pero se debe evitar toda inferencia con tales modelos. Es difícil "dejar que los datos hablen" si los cambia.
  • Por supuesto, solo funciona con pesos con valores enteros (no puede duplicar 0,5 puntos de datos), que no es lo que se hace en la regresión más ponderada (lm). En general, se crea un pesaje basado en la variabilidad local estimada a partir de réplicas (por ejemplo, 1 / so 1 / s ^ 2 en una 'x' dada) o en función de la altura de respuesta (por ejemplo, 1 / Y o 1 / Y ^ 2, en una 'x' dada).

En Jags, Bugs, Stan, proc MCMC, o en Bayesian en general, la probabilidad no es diferente que en la frecuente lm o glm (o cualquier modelo), ¡¡¡es lo mismo !! Simplemente cree una nueva columna "ponderación" para su respuesta y escriba la probabilidad como

y [i] ~ dnorm (mu [i], tau / peso [i])

O un poisson ponderado:

y [i] ~ dpois (lambda [i] * peso [i])

Este código Bugs / Jags sería simplemente el truco. Obtendrás todo correcto. No olvide continuar multiplicando la parte posterior de tau por el peso, por ejemplo, al hacer predicciones e intervalos de confianza / predicción.

Pierre Lebrun
fuente
Si lo hacemos como se indica, cambiamos la media y la varianza. ¿Por qué no es y [i] * peso [i] ~ dpois (lambda [i] * peso [i])? Eso solo ajustaría la varianza. El problema aquí es que y [i] * weight [i] podría ser de tipo real.
user28937
de hecho, la regresión ponderada cambia la media (¡porque el pesaje lleva a la regresión a acercarse a los puntos que tienen muchos pesos!) y la varianza ahora es una función de los pesos (por lo tanto, no es un modelo homoscedastic). La varianza (o precisión) tau ya no tiene significado, pero tau / peso [i] puede interpretarse exactamente como la precisión del modelo (para una "x" dada). No recomendaría la multiplicación de los datos (y) por los pesos ... espere si esto es precisamente algo que quiere hacer, pero no entiendo su modelo en este caso ...
Pierre Lebrun
Estoy de acuerdo con usted, no cambia la media en el ejemplo normal: y [i] ~ dnorm (mu [i], tau / peso [i]), pero lo hace en el segundo, ya que lambda [i] * peso [ i] se convierte en el "nuevo" lambda para dpois y esto ya no coincidirá con y [i]. Tengo que corregirme debería ser: ty [i] * exp (weight [i]) ~ dpois (lambda [i] * weight [i]). La idea con la multiplicación en el caso de Poisson es que queremos ajustar la varianza, pero también ajustar la media, entonces, ¿no necesitamos corregir la media?
user28937
Si necesita ajustar la varianza de forma independiente, ¿tal vez un modelo binomial negativo puede ser útil en lugar de un Poisson? Agrega un parámetro de inflación / deflación de varianza al Poisson. Excepto que es muy similar.
Pierre Lebrun
Pierre buena idea. También pensé en la representación continua de la distribución de Poisson
user28937
4

Primero, vale la pena señalar que glmno realiza una regresión bayesiana. El parámetro 'pesos' es básicamente una abreviatura de "proporción de observaciones", que se puede reemplazar con un muestreo ascendente de su conjunto de datos de manera adecuada. Por ejemplo:

x=1:10
y=jitter(10*x)
w=sample(x,10)

augmented.x=NULL
augmented.y=NULL    
for(i in 1:length(x)){
    augmented.x=c(augmented.x, rep(x[i],w[i]))
    augmented.y=c(augmented.y, rep(y[i],w[i]))
}

# These are both basically the same thing
m.1=lm(y~x, weights=w)
m.2=lm(augmented.y~augmented.x)

Entonces, para agregar peso a los puntos en JAGS o BUGS, puede aumentar su conjunto de datos de manera similar a la anterior.

David Marx
fuente
2
esto no funcionará, los pesos son usualmente números reales, no enteros
Curioso el
Esto no le impide aproximarlos con enteros. Mi solución no es perfecta, pero funciona aproximadamente. Por ejemplo, dados los pesos (1/3, 2/3, 1), puede aumentar la muestra de la segunda clase por un factor de dos y la tercera clase por un factor de tres.
David Marx
0

Intenté agregar al comentario anterior, pero mi representante es demasiado bajo.

Debería

y[i] ~ dnorm(mu[i], tau / weight[i])

No ser

y[i] ~ dnorm(mu[i], tau * weight[i])

en JAGS? Estoy ejecutando algunas pruebas que comparan los resultados de este método en JAGS con los resultados de una regresión ponderada a través de lm () y solo puedo encontrar la conformidad con este último. Aquí hay un ejemplo simple:

aggregated <- 
  data.frame(x=1:5) %>%
  mutate( y = round(2 * x + 2 + rnorm(length(x)) ),
          freq = as.numeric(table(sample(1:5, 100, 
                 replace=TRUE, prob=c(.3, .4, .5, .4, .3)))))
x <- aggregated$x
y <- aggregated$y
weight <- aggregated$freq
N <- length(y)

# via lm()
lm(y ~ x, data = aggregated, weight = freq)

y comparar con

lin_wt_mod <- function() {

  for (i in 1:N) {
    y[i] ~ dnorm(mu[i], tau*weight[i])
    mu[i] <- beta[1] + beta[2] * x[i]
  }

  for(j in 1:2){
    beta[j] ~ dnorm(0,0.0001)
  }

  tau   ~ dgamma(0.001, 0.001)
  sigma     <- 1/sqrt(tau)
}

dat <- list("N","x","y","weight")
params <- c("beta","tau","sigma")

library(R2jags)
fit_wt_lm1 <- jags.parallel(data = dat, parameters.to.save = params,
              model.file = lin_wt_mod, n.iter = 3000, n.burnin = 1000)
fit_wt_lm1$BUGSoutput$summary
metrikrn
fuente
Independientemente de la reputación, los comentarios no deben darse como respuestas.
Michael R. Chernick