¿Cómo ajusto un modelo multinivel para resultados de Poisson sobredispersos?

32

Quiero ajustar un GLMM multinivel con una distribución de Poisson (con sobredispersión) usando R. En este momento estoy usando lme4 pero noté que recientemente la quasipoissonfamilia fue eliminada.

He visto en otras partes que puede modelar la sobredispersión aditiva para distribuciones binomiales agregando una intercepción aleatoria con un nivel por observación. ¿Esto se aplica también a la distribución de Poisson?

Hay una mejor manera de hacerlo? ¿Hay otros paquetes que recomendarías?

George Michaelides
fuente

Respuestas:

22

Puede ajustar GLMM multinivel con una distribución de Poisson (con sobredispersión) usando R de múltiples maneras. Unos Rpaquetes son: lme4, MCMCglmm, arm, etc. Una referencia buena para ver que es Gelman y Hill (2007)

Daré un ejemplo de esto usando el rjagspaquete in R. Es una interfaz entre Ry JAGS(me gusta OpenBUGSo WinBUGS).

log θ i j = β 0 + β 1 T r e a t m e n t i + δ i j δ i jN ( 0 , σ 2 ϵ ) i = 1 ... I ,

norteyojPAGSoyossonorte(θyoj)
Iniciar sesiónθyoj=β0 0+β1 Trmiunatmetrominortetyo+δyoj
δyojnorte(0 0,σϵ2)
yo=1...yo,j=1...J
Trmiunatmetrominortetyo=0 0 o 1,...,J-1 Si el yoth la observación pertenece al grupo de tratamiento 12,...,J

La parte en el código anterior modela la sobredispersión. Pero no hay nadie que le impida modelar la correlación entre individuos (no cree que los individuos sean realmente independientes) y dentro de los individuos (medidas repetidas). Además, el parámetro de velocidad puede ser escalado por alguna otra constante como en . Consulte Gelman y Hill (2007) para obtener más referencias. Aquí está el código para el modelo simple:δyojrate modelsJAGS

data{
        for (i in 1:I){         
            ncount[i,1] <- obsTrt1[i]
            ncount[i,2] <- obsTrt2[i]
                ## notice I have only 2 treatments and I individuals 
    }                               
}

model{
    for (i in 1:I){ 
        nCount[i, 1] ~ dpois( means[i, 1] )
        nCount[i, 2] ~ dpois( means[i, 2] )

        log( means[i, 1] ) <- mu + b * trt1[i] + disp[i, 1]
        log( means[i, 2] ) <- mu + b * trt2[i] + disp[i, 2]

        disp[i, 1] ~ dnorm( 0, tau)
        disp[i, 2] ~ dnorm( 0, tau)

    }

    mu  ~ dnorm( 0, 0.001)
    b   ~ dnorm(0, 0.001)
    tau ~ dgamma( 0.001, 0.001)
}

Aquí está el Rcódigo para implementar el uso que (dicen que se denomina: overdisp.bug)

dataFixedEffect <- list("I"       = 10,
                        "obsTrt1" = obsTrt1 , #vector of n_i1
                        "obsTrt2" = obsTrt2,  #vector of n_i2
                        "trt1"    = trt1,     #vector of 0
                        "trt2"    = trt2,     #vector of 1
                       )

initFixedEffect <- list(mu = 0.0 , b = 0.0, tau = 0.01)

simFixedEffect <- jags.model(file     = "overdisp.bug",
                             data     = dataFixedEffect,
                             inits    = initFixedEffect,
                             n.chains = 4,
                             n.adapt  = 1000)

sampleFixedEffect <- coda.samples(model          = simFixedEffect,
                                  variable.names = c("mu", "b", "means"),
                                  n.iter         = 1000)

meansTrt1 <- as.matrix(sampleFixedEffect[ , 2:11])
meansTrt2 <- as.matrix(sampleFixedEffect[ , 12:21])

Puede jugar con las partes posteriores de sus parámetros y puede introducir más parámetros para que su modelado sea más preciso ( nos gusta pensar esto ). Básicamente, te haces una idea.

Para obtener más detalles sobre el uso rjagsy JAGS, consulte la página de John Myles White

suncoolsu
fuente
¡¡Gracias!! Hace poco comencé a analizar el análisis bayesiano y todavía me resulta un poco difícil de comprender. Supongo que esta es una oportunidad para aprender un poco más al respecto.
George Michaelides
1
¿Por qué no la dispersión gamma?
Patrick McCann
2
@Patrick definitivamente puedes hacer eso. Pero como estoy tomando un registro de la media, prefiero el efecto disp normal. Una distribución normal logarítmica es otra forma de modelar distribuciones similares a la distribución gamma. HTH.
suncoolsu
20

No es necesario dejar el paquete lme4 para tener en cuenta la sobredispersión; solo incluya un efecto aleatorio para el número de observación. Las soluciones BUGS / JAGS mencionadas son probablemente excesivas para usted, y si no lo son, debería tener los resultados lme4 fáciles de ajustar para comparar.

data$obs_effect<-1:nrow(data)
overdisp.fit<-lmer(y~1+obs_effect+x+(1|obs_effect)+(1+x|subject_id),data=data,family=poisson)

Esto se discute aquí: http://article.gmane.org/gmane.comp.lang.r.lme4.devel/4727 de manera informal y académica por Elston et al. (2001) .

Patrick McCann
fuente
¿Qué sucede si un modelo consta de dos variables nominales, una variable continua (todas como efectos fijos) y una variable de agrupación (efecto aleatorio) con interacciones de tercer orden y, además, el número de sujetos medidos es igual al número de observaciones o registros en el conjunto de datos? ¿Cómo debo cubrir esto en el modelo?
Ladislav Naďo
7

Creo que el paquete glmmADMB es exactamente lo que estás buscando.

install.packages ("glmmADMB", repos = "http://r-forge.r-project.org")

Pero desde el punto de vista bayesiano, puede usar el paquete MCMCglmm o el software BUGS / JAGS , son muy flexibles y puede adaptarse a este tipo de modelo. (y la sintaxis está cerca de la R)

EDITAR gracias a @randel

Si desea instalar los paquetes glmmADMBy R2admb, es mejor hacerlo:

install.packages("glmmADMB", repos="http://glmmadmb.r-forge.r-project.org/repos"‌​)   
install.packages("R2admb")
dickoa
fuente
Creo que actualmente el paquete debe instalarse a través de install.packages("glmmADMB",repos="http://glmmadmb.r-forge.r-project.org/repos")plus install.packages('R2admb').
Randel
5

Buenas sugerencias hasta ahora. Aquí hay uno más. Puede ajustar un modelo jerárquico de regresión binomial negativa utilizando la rhierNegbinRwfunción del bayesmpaquete.

Ari B. Friedman
fuente