同一数据集拟合多glmer模型后AIC对比出现观测数不一致警告
问题分析与解决办法
你遇到的这个情况其实是glmer(以及大多数R建模函数)的默认行为导致的,核心原因就是模型公式里的交互项引入了缺失值过滤,而非数据集本身不一致。
为什么观测数会不一样?
你的三个模型里,只有m2包含了Y1*A、Y2*A、Y3*A这类交互项。交互项的计算要求参与交互的两个变量(比如Y1和A)同时都没有缺失值——只要其中一个变量在某条观测里是缺失的,这条观测就会被glmer自动排除(行删除法,listwise deletion)。
而m1和m3呢?m1没用到变量A,m3也完全不涉及A,所以它们只会过滤掉X、Y1/Y2/Y3、B/C这些变量里有缺失的观测,不会因为A的缺失而删除行,因此观测数和原始数据集一致。
怎么验证这个结论?
你可以跑几行代码确认:
# 查看变量A的缺失数量 sum(is.na(dataset$A)) # 查看Y1/Y2/Y3和A同时无缺失的观测数 sum(complete.cases(dataset[, c("Y1", "Y2", "Y3", "A")]))
第二个命令的结果应该刚好等于nobs(m2)的150164,这就能实锤是缺失值导致的观测数差异。
怎么解决AIC对比的问题?
要让所有模型在相同观测数下对比AIC,你需要先统一数据集:
- 先提取所有模型涉及到的变量,筛选出这些变量都没有缺失的观测:
# 列出所有模型用到的变量:X、Y1、Y2、Y3、A、B、C clean_data <- dataset[complete.cases(dataset[, c("X", "Y1", "Y2", "Y3", "A", "B", "C")]), ]
- 用这个
clean_data重新拟合三个模型,之后再运行AIC(m1, m2, m3)就不会出现警告了。
另外,你也可以考虑对缺失值进行插补,但插补需要结合你的研究场景谨慎选择方法(比如均值插补、多重插补等),确保结果的合理性。
内容的提问来源于stack exchange,提问作者mto23
相关产品推荐
相关产品推荐

