如何在GLM中添加随机效应:河流变量建模疑问
泊松模型中添加河流地点作为随机效应的正确方法
问题背景
你的数据集包含两个河流地点(river列以0/1标识),希望在泊松模型中将该地点变量设为随机效应,但当前使用glm的代码将其作为固定效应加入后,出现完全共线无法估计第二个水平的问题,且效果和虚拟变量一致。
你当前尝试的代码:
model = glm(formula = taeni_number ~ 0 + dum_grass + dum_gravel + dum_multi + factor(river), data=data, family=poisson(link="log"))
数据集结构:
structure(list(dum_grass = c(0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L), dum_gravel = c(1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L), dum_multi = c(0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L), taeni_number = c(0L, 0L, 0L, 0L, 1L, 1L, 1L, 2L, 0L, 0L, 2L, 0L, 1L, 3L, 0L, 0L, 0L, 1L, 8L, 34L, 5L, 11L, 19L, 7L, 0L, 1L, 2L, 0L, 1L, 0L, 14L, 19L, 10L, 15L, 8L, 3L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 3L, 1L, 1L, 2L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 4L, 9L, 5L, 8L, 8L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 6L, 15L, 2L, 2L, 9L, 3L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 2L, 0L, 1L, 2L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 6L, 1L, 1L, 4L, 1L)), class = "data.frame", row.names = c(NA, -108L))
问题原因
你当前的操作存在本质问题:glm()函数只能拟合固定效应广义线性模型,无法处理随机效应。把river作为固定效应加入时,由于你去掉了模型截距(~0+...),再加上dum_grass/dum_gravel/dum_multi这三个互斥的虚拟变量(每行仅有一个1),与factor(river)的两个水平组合后,会出现完全共线,导致第二个水平无法估计。
正确解决方案:使用混合效应模型
要在泊松模型中加入随机效应,需要用支持混合效应的函数,比如lme4包中的glmer()函数,它可以拟合广义线性混合模型(GLMM)。
步骤1:安装并加载lme4包
如果还没安装,先执行:
install.packages("lme4")
然后加载包:
library(lme4)
步骤2:拟合带随机效应的泊松模型
使用(1|river)表示将river作为随机截距变量,公式如下:
model_glmm = glmer(formula = taeni_number ~ dum_grass + dum_gravel + dum_multi + (1|river), data = data, family = poisson(link = "log"))
代码解释
(1|river):表示每个河流地点有一个独立的随机截距,即假设不同河流的基线计数存在随机差异,而不是固定的分组效应。- 不需要手动去掉截距(
~0+),默认的截距会被随机效应吸收,避免共线问题。 - 模型会估计固定效应(
dum_grass/dum_gravel/dum_multi的系数)以及随机效应的方差(衡量河流间的差异程度)。
补充:检验随机效应的显著性
如果需要验证随机效应是否有意义,可以用似然比检验比较带随机效应和不带的模型:
# 拟合仅含固定效应的泊松模型 model_glm = glm(taeni_number ~ dum_grass + dum_gravel + dum_multi, data = data, family = poisson(link = "log")) # 似然比检验 anova(model_glm, model_glmm, test = "Chisq")
如果检验结果的p值显著,说明随机效应确实能提升模型拟合效果。
内容的提问来源于stack exchange,提问作者Djingleberg
相关产品推荐
相关产品推荐

