È possibile adattare GLMM multilivello con una distribuzione di Poisson (con sovra dispersione) utilizzando R in più modi. Pochi R
pacchetti sono: lme4
, MCMCglmm
, arm
, ecc Un riferimento bello vedere è Gelman e Hill (2007)
Darò un esempio di come fare questo usando il rjags
pacchetto in R
. È un'interfaccia tra R
e JAGS
(come OpenBUGS
o WinBUGS
).
log θ i j = β 0 + β 1 T r e a t m e n t i + δ i j δ i j ∼ N ( 0 , σ 2 ϵ ) i = 1 … I ,
nio j∼ P o i s s o n ( θio j)
logθio j= β0+ β1 T r e a t me n tio+ δio j
δio j∼ N( 0 , σ2ε)
T r e a t m e n t i = 0 o 1 , … , Ji = 1 ... I,j = 1 … J
T r e a t me n tio= 0 o 1 , … , J- 1 se l' it h l'osservazione appartiene al gruppo di trattamento 1 , o, 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:δio jrate models
JAGS
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 R
codice 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 rjags
e JAGS
, consultare la pagina di John Myles White