我正在测试不同生境和耻辱类型植物柱头上花粉粒数量的差异。
我的样本设计包括两个栖息地,每个栖息地有10个站点
在每个站点,我有多达3种耻辱类型(湿,干和半干),并且对于每种耻辱类型,我有不同数量的植物物种,每种植物物种的个体数量不同(代码)。
所以,我最终得到了嵌套设计如下:habitat / site / stigmatype / stigmaspecies / code
由于它是一项描述性研究,因此不同网站之间的耻辱类型,耻辱种类和代码会有所不同。
我的响应变量(n)是每株植物每个柱头的pollengrains(log10 + 1)的数量,平均因为我每株植物收集了3个柱头。
数据不适合泊松分布,因为(i)不是整数,(ii)方差远高于平均值(比率= 911.0756)。所以,我适合作为negative.binomial。
选择模型后,我有:
m4a<-glmer(n ~ habitat*stigmatype +
(1 | stigmaspecies /代码),家庭= negative.binomial(2))
> summary(m4a)
Generalized linear mixed model fit by maximum likelihood ['glmerMod']
Family: Negative Binomial(2) ( log )
Formula: n ~ habitat * stigmatype + (1 | stigmaspecies/code)
AIC BIC logLik deviance
993.9713 1030.6079 -487.9856 975.9713
Random effects:
Groups Name Variance Std.Dev.
code:stigmaspecies (Intercept) 1.034e-12 1.017e-06
stigmaspecies (Intercept) 4.144e-02 2.036e-01
Residual 2.515e-01 5.015e-01
Number of obs: 433, groups: code:stigmaspecies, 433; stigmaspecies, 41
Fixed effects:
Estimate Std. Error t value Pr(>|z|)
(Intercept) -0.31641 0.08896 -3.557 0.000375 ***
habitatnon-invaded -0.67714 0.10060 -6.731 1.68e-11 ***
stigmatypesemidry -0.24193 0.15975 -1.514 0.129905
stigmatypewet -0.07195 0.18665 -0.385 0.699885
habitatnon-invaded:stigmatypesemidry 0.60479 0.22310 2.711 0.006712 **
habitatnon-invaded:stigmatypewet 0.16653 0.34119 0.488 0.625491
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) hbttn- stgmtyps stgmtypw hbttnn-nvdd:stgmtyps
hbttnn-nvdd -0.335
stgmtypsmdr -0.557 0.186
stigmatypwt -0.477 0.160 0.265
hbttnn-nvdd:stgmtyps 0.151 -0.451 -0.458 -0.072
hbttnn-nvdd:stgmtypw 0.099 -0.295 -0.055 -0.403 0.133
两个问题:
我一直在使用:
qqnorm(resid(m4a))
hist(resid(m4a))
plot(fitted(m4a),resid(m4a))
虽然qqnorm()
和hist()
似乎没问题,但第3张图上存在异方差的趋势。这是我的最后一个问题:
答案 0 :(得分:7)
检查glmer中过度离散的一种简单方法是:
> library("blmeco")
> dispersion_glmer(your_model) #it shouldn't be over
> 1.4
为了解决过度离散,我通常会添加观察水平随机因子
对于模型验证,我通常从这些图开始......但是这取决于你的特定模型......
par(mfrow=c(2,2))
qqnorm(resid(your_model), main="normal qq-plot, residuals")
qqline(resid(your_model))
qqnorm(ranef(your_model)$id[,1])
qqline(ranef(your_model)$id[,1])
plot(fitted(your_model), resid(your_model)) #residuals vs fitted
abline(h=0)
dat_kackle$fitted <- fitted(your_model) #fitted vs observed
plot(your_data$fitted, jitter(your_data$total,0.1))
abline(0,1)
希望这有点帮助......
欢呼声
答案 1 :(得分:1)
对于那些可能通过谷歌搜索找到它的人来说,只是Q1的附加功能:blmco
dispersion_glmer
函数似乎已过时。为此,最好使用@Ben_Bolker函数:
overdisp_fun <- function(model) {
rdf <- df.residual(model)
rp <- residuals(model,type="pearson")
Pearson.chisq <- sum(rp^2)
prat <- Pearson.chisq/rdf
pval <- pchisq(Pearson.chisq, df=rdf, lower.tail=FALSE)
c(chisq=Pearson.chisq,ratio=prat,rdf=rdf,p=pval)
}
来源:https://bbolker.github.io/mixedmodels-misc/glmmFAQ.html#overdispersion。
突出显示的概念:
请注意以下常见的警告:这是对超分散参数的近似估计。
PS。为什么过时了?
lme4
软件包现在包括residuals
函数,并且Pearson residuals are supposedly more robust for this type of calculation比偏差残差还大。 blmeco::dispersion_glmer
将偏差残差与u
求和,求和,除以残差自由度,然后取值(函数)的平方根:
dispersion_glmer <- function (modelglmer)
{
n <- length(resid(modelglmer))
return(sqrt(sum(c(resid(modelglmer), modelglmer@u)^2)/n))
}
blmeco
解决方案提供的偏差/ df比比Bolker函数高得多。由于Ben是lme4
软件包的作者之一,因此,尽管我没有资格合理化统计原因,但我会更加相信他的解决方案。
x <- InsectSprays
x$id <- rownames(x)
mod <- lme4::glmer(count ~ spray + (1|id), data = x, family = poisson)
blmeco::dispersion_glmer(mod)
# [1] 1.012649
overdisp_fun(mod)
# chisq ratio rdf p
# 55.7160734 0.8571704 65.0000000 0.7873823