Come posso adattare un modello multilivello per risultati di dispersione eccessivamente dispersi?


32

Voglio montare un GLMM multilivello con una distribuzione di Poisson (con sovra dispersione) usando R. Al momento sto usando lme4 ma ho notato che recentemente la quasipoissonfamiglia è stata rimossa.

Ho visto altrove che è possibile modellare l'eccessiva dispersione additiva per le distribuzioni binomiali aggiungendo un'intercettazione casuale con un livello per osservazione. Questo vale anche per la distribuzione di Poisson?

C'è un modo migliore per farlo? Ci sono altri pacchetti che consiglieresti?

Risposte:


22

È possibile adattare GLMM multilivello con una distribuzione di Poisson (con sovra dispersione) utilizzando R in più modi. Pochi Rpacchetti sono: lme4, MCMCglmm, arm, ecc Un riferimento bello vedere è Gelman e Hill (2007)

Darò un esempio di come fare questo usando il rjagspacchetto in R. È un'interfaccia tra Re JAGS(come 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 ,

nijPoisson(θij)
logθij=β0+β1 Treatmenti+δij
δijN(0,σϵ2)
T r e a t m e n t i = 0  o  1 , , J
i=1I,j=1J
Treatmenti=0 or 1,,J1 if the ith observation belongs to treatment group 1, or, 2,,J

La parte nel codice sopra i modelli sovraispersione. Ma nessuno ti impedisce di modellare la correlazione tra individui (non credi che gli individui siano veramente indipendenti) e all'interno degli individui (misure ripetute). Inoltre, il parametro rate può essere ridimensionato da un'altra costante come in . Vedere Gelman and Hill (2007) per ulteriori riferimenti. Ecco il codice per il modello semplice:δijrate 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)
}

Ecco il Rcodice per implementarlo usarlo (diciamo che è chiamato 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])

Puoi giocare con i parametri dei tuoi parametri e puoi introdurre più parametri per renderti più preciso ( ci piace pensarlo ). Fondamentalmente, hai avuto l'idea.

Per maggiori dettagli sull'uso di rjagse JAGS, consultare la pagina di John Myles White


Grazie!! Solo di recente ho iniziato a esaminare l'analisi bayesiana e trovo ancora un po 'difficile da capire. Immagino che questa sia un'opportunità per saperne di più.
George Michaelides,

1
Perché non dispersione gamma?
Patrick McCann,

2
@Patrick puoi sicuramente farlo. Ma dal momento che sto prendendo il registro del mezzo preferisco il normale effetto disp. Una distribuzione normale dei registri è un altro modo per modellare distribuzioni simili alla distribuzione gamma. HTH.
suncoolsu,

20

Non è necessario lasciare il pacchetto lme4 per tenere conto della sovradispersione; includi solo un effetto casuale per il numero di osservazione. Le soluzioni BUGS / JAGS citate probabilmente sono eccessive per te e, in caso contrario, dovresti avere i risultati lme4 facili da adattare per il confronto.

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)

Questo è discusso qui: http://article.gmane.org/gmane.comp.lang.r.lme4.devel/4727 in modo informale e accademico di Elston et al. (2001) .


Che cosa succede se un modello è composto da due variabili nominali, una variabile continua (tutte come effetti fissi) e una variabile di raggruppamento (effetto casuale) con interazioni di terzo ordine e, inoltre, il numero di soggetti misurati è uguale al numero di osservazioni o registrazioni nella set di dati? Come devo coprire questo nel modello?
Ladislav Naďo,

7

Penso che il pacchetto glmmADMB sia esattamente quello che stai cercando.

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

Ma dal punto di vista bayesiano puoi usare il pacchetto MCMCglmm o il software BUGS / JAGS , sono molto flessibili e puoi adattarti a questo tipo di modello. (e la sintassi è vicina a quella R)

MODIFICA grazie a @randel

Se si desidera installare l' glmmADMBe R2admbpacchetti è meglio fare:

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

Credo che attualmente il pacchetto debba essere installato tramite install.packages("glmmADMB",repos="http://glmmadmb.r-forge.r-project.org/repos")Plus install.packages('R2admb').
Randel,

5

Buoni suggerimenti finora. Eccone un altro. È possibile adattare un modello di regressione binomiale negativo gerarchico utilizzando la rhierNegbinRwfunzione del bayesmpacchetto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.