使用MuMIn::dredge进行glmer模型比较时能否纳入无主效应的交互项?
解决方法:绕过dredge的边际性约束
默认情况下,MuMIn包的dredge()函数会严格遵循边际性原则——也就是当模型包含交互项时,必须同时包含该交互项的所有组成主效应,这是统计建模的常规规范,但如果你确实需要生成违反这一原则的模型组合,可以通过以下方式实现:
方法1:修改dredge的参数设置
要让dredge()允许生成不含主效应但包含对应交互项的模型,需要两步操作:
- 显式构建全局模型:把所有你想考虑的主效应和交互项逐一列出来,不要用
*符号(*会自动展开主效应+交互项,且dredge会默认维护边际性)。 - 关闭边际性检查:调用
dredge()时设置marginality = FALSE。
示例代码:
library(lme4) library(MuMIn) # 显式列出所有候选固定效应项(主效应+所有交互项) global_mod <- glmer( response ~ a + b + c + d + b:c + b:d + c:d + b:c:d + (1|e), data = your_dataset, family = your_family # 替换为你的分布族,比如binomial、poisson等 ) # 调用dredge,关闭边际性约束 model_set <- dredge(global_mod, marginality = FALSE)
这样生成的模型集合就会包含所有可能的组合,比如你提到的response ~ a + b + b:c + (1|e)或response ~ a + c + b:c + a:b:c + (1|e)这类违反边际性的模型。
方法2:手动生成所有模型组合(备选)
如果不想依赖dredge(),可以用combn()生成所有项的组合,再循环拟合模型。这种方法更灵活,但需要自己处理拟合失败的情况:
library(lme4) # 定义所有候选固定效应项 candidate_terms <- c("a", "b", "c", "d", "b:c", "b:d", "c:d", "b:c:d") # 生成所有非空的项组合 all_combinations <- unlist( lapply(1:length(candidate_terms), function(k) combn(candidate_terms, k, simplify = FALSE)), recursive = FALSE ) # 循环拟合每个模型(注意处理收敛问题) model_list <- lapply(all_combinations, function(terms) { formula <- as.formula(paste("response ~", paste(terms, collapse = " + "), "+ (1|e)")) tryCatch( glmer(formula, data = your_dataset, family = your_family), error = function(e) NULL # 跳过拟合失败的模型 ) }) # 过滤掉拟合失败的模型 model_list <- Filter(Negate(is.null), model_list) # 计算AIC等指标用于比较 aic_scores <- sapply(model_list, AIC)
重要提醒
从统计角度来说,不含主效应的交互项解释性很差——交互项的本质是反映主效应之间的依赖关系,缺少主效应时,交互项的系数无法准确反映变量间的真实关联,甚至会导致结果误导。除非你有非常明确的理论依据支持这种建模方式,否则不建议这么做。
内容的提问来源于stack exchange,提问作者user23089125
相关产品推荐
相关产品推荐

