Aşırı dağınık poisson sonuçları için çok seviyeli bir modeli nasıl takabilirim?


32

Ben R kullanarak Poisson dağılımlı (fazla dağılımlı) çok seviyeli bir GLMM'ye uymak istiyorum. Şu anda lme4 kullanıyorum ancak yakın zamanda quasipoissonailenin çıkarıldığını fark ettim .

Başka bir yerde, gözlem başına bir seviye ile rastgele bir kesişme ekleyerek binom dağılımları için ilave aşırı dağılım modelleyebileceğinizi görmüştüm. Bu, poisson dağılımı için de geçerli midir?

Bunu yapmanın daha iyi bir yolu var mı? Tavsiye edeceğiniz başka paketler var mı?

Yanıtlar:


22

Çok düzeyli GLMM'yi, R'yi çeşitli şekillerde kullanarak bir Poisson dağılımına (aşırı dağılıma sahip) yerleştirebilirsiniz. Birkaç Rpaketler şunlardır: lme4, MCMCglmm, armvb İyi bir referanstır görmek Gelman ve Tepesi (2007)

Bunu rjagspaketi kullanarak yapmanın bir örnek vereceğim R. RVe JAGS(gibi OpenBUGSveya WinBUGS) arasında bir arayüzdür .

log θ i j = β 0 + β 1 t r E , bir T m e n t ı + δ i j δ i j ~ N ( 0 , σ 2 ϵ ) i = 1 Ben ,

nbenj~PObenssOn(θbenj)
günlükθbenj=β0+β1 Trebirtmentben+δbenj
δbenj~N-(0,σε2)
T r E , bir T m e n t ı
ben=1...ben,j=1...J
Trebirtmentben=0 veya 1,...,J-1 Eğer benth gözlem tedavi grubuna aittir 1veya 2,...,J

Yukarıdaki kodun içindeki bölümü, dağılma modellerini içerir. Fakat sizi, bireyler arasındaki (bireylerin gerçekten bağımsız olduğuna inanmıyorsunuz) ve bireyler arasındaki (tekrarlanan önlemler) modellemekten alıkoyacak kimse yoktur. Ayrıca, rate parametresi, içinde olduğu gibi başka bir sabit tarafından ölçeklenebilir . Daha fazla referans için lütfen Gelman ve Hill'e (2007) bakınız. İşte basit model için kod:δbenjrate 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)
}

İşte Ro kullanımını uygulamak için kodu (Adını ki: 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])

Parametrelerinizin posterleri ile oynatabilirsiniz ve daha kesin modelleme yapmak için daha fazla parametre sunabilirsiniz ( bunu düşünmeyi seviyoruz ). Temel olarak fikri anladınız.

Kullanımıyla ilgili daha fazla ayrıntı için rjagsve JAGSlütfen bkz John Myles White'ın sayfasını


Teşekkürler!! Daha son zamanlarda bayesian analizine bakmaya başladım ve hala kavramasını biraz zor buluyorum. Sanırım bu konuda daha fazla şey öğrenmek için bir fırsat.
George Michaelides

1
Neden gama dağılımı değil?
Patrick McCann

2
@Patrick kesinlikle bunu yapabilirsiniz. Fakat ortalamanın kaydını tuttuğumdan beri normal disp etkisini tercih ediyorum. Günlük normal dağılım, gama dağılımına benzer dağılımları modellemenin başka bir yoludur. HTH.
suncoolsu

20

Dispersiyonu hesaba katmak için lme4 paketini bırakmanıza gerek yok; sadece gözlem numarası için rastgele bir etki ekleyin. Bahsedilen BUGS / JAGS çözümleri sizin için büyük olasılıkla sizin için büyük olasılıkla ve sizin için uygun değilse, karşılaştırma için lme4 sonuçlarına uyması kolay olmalıdır.

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)

Burada tartışılmaktadır: http://article.gmane.org/gmane.comp.lang.r.lme4.devel/4727 gayri resmi ve akademik olarak Elston ve diğ. (2001) .


Bir model iki sıra değişkenden, bir sürekli değişken (tümü sabit efektler) ve bir gruplama değişkeninden (rastgele etki) 3. dereceden etkileşimlerden oluşuyorsa ve ayrıca ölçülen deneklerin sayısı, gözlemler veya kayıtların sayısına eşitse Veri kümesi? Modelde bunu nasıl örtmeliyim?
Ladislav Nao

7

GlmmADMB paketinin tam olarak aradığınızı olduğunu düşünüyorum.

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

Ancak, bayes bakış açısına göre, MCMCglmm paketini veya BUGS / JAGS yazılımını kullanabilirsiniz, çok esnektirler ve bu tür bir modele uyabilirsiniz. (ve sözdizimi R'ye yakındır)

@Randel sayesinde EDIT

glmmADMBVe R2admbpaketlerini kurmak istiyorsanız , yapmanız daha iyidir:

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

Paketin şu anda install.packages("glmmADMB",repos="http://glmmadmb.r-forge.r-project.org/repos")plus ile yüklenmesi gerektiğine inanıyorum install.packages('R2admb').
Randel

5

Şimdiye kadar iyi öneriler. İşte bir tane daha. Paketin rhierNegbinRwişlevini kullanarak hiyerarşik bir negatif binom regresyon modelini yerleştirebilirsiniz bayesm.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.