使用glmer进行模型平均时部分模型无输出的技术咨询
嘿,我看到你作为统计新手,在用glmer处理含3个分类解释变量的模型平均时碰到了麻烦——dredge()能算出带交互项的模型AICc,但model.avg()却只有部分模型有输出。结合你的描述,我来分享几个可能的原因和实操解决思路:
模型拟合收敛失败
当dredge()遍历所有变量组合(包括交互项)时,有些复杂模型可能因为数据稀疏、分类水平样本量不均或者迭代次数不足,出现收敛失败的情况。这些拟合失败的模型不会被model.avg()识别,自然没有输出。你可以先检查dredge()返回的结果,看看有没有AICc为NA或者标记conv.fail的行——这些就是出问题的模型。
解决办法:在拟合全局模型时放宽收敛限制,比如:global.model <- glmer( cbind(numerator, denominator) ~ var1 * var2 * var3, data = ae, family = binomial(), control = glmerControl(optCtrl = list(maxfun = 1e5)) # 增加迭代次数 )如果某些分类水平样本量太小,也可以考虑合并水平,降低模型复杂度。
缺失值处理设置的影响
你设置了options(na.action="na.fail"),这意味着只要某个模型对应的变量组合下存在缺失值,程序就会直接报错终止拟合。虽然全局模型能跑通,但子集模型可能因为变量组合的问题碰到缺失值,导致模型无法生成。
解决办法:把缺失值处理改成自动剔除,比如:options(na.action="na.omit") # 或者在glmer里单独指定,不影响全局设置 global.model <- glmer(..., na.action = na.omit)注意这样会改变部分模型的样本量,记得在分析记录里标注这一点。
model.avg()的参数过滤问题
默认情况下model.avg()可能只纳入delta AICc < 2的最优模型,如果有些模型不在这个范围内,你可能误以为它们“无输出”;另外如果不小心给model.avg()加了subset参数,也可能过滤掉部分模型。
解决办法:先查看所有模型的状态,再明确指定纳入范围:# 查看dredge结果里的所有模型 summary(dredge_result) # 纳入所有拟合成功的模型 avg_model <- model.avg(dredge_result, subset = !is.na(AICc), fit = TRUE) summary(avg_model)分类变量编码的问题
分类变量的编码方式(比如默认的哑变量编码)可能在多交互项的情况下导致奇异矩阵,让模型拟合失败。
解决办法:尝试用效应编码替代哑变量编码,比如:# 对所有分类变量设置效应编码 ae$var1 <- factor(ae$var1, contrasts = contr.sum) ae$var2 <- factor(ae$var2, contrasts = contr.sum) ae$var3 <- factor(ae$var3, contrasts = contr.sum)再重新拟合全局模型和运行
dredge()。
另外给你一个小建议:作为初次接触的新手,可以先从无交互项的简单模型开始测试模型平均流程,确认没问题后再逐步加入交互项,这样更容易定位问题出在哪里。
内容的提问来源于stack exchange,提问作者Daisy26

