为什么运行glmer移除2.5sd残差离群值时出现“bad data”错误?
报错核心原因及对应排查方向
- 最常见原因:初始模型拟合时自动剔除的缺失值行,导致残差长度与原始数据集行数不匹配
glmer()拟合模型时会默认自动删除数据中包含自变量、因变量、随机效应分组变量缺失值的行,最终拟合用的数据集行数会少于原始ldt的行数,因此你提取到的resid(acc.glmer)的长度是剔除缺失值后的行数,和原始ldt的行数不一致,用这个长度不匹配的逻辑向量去索引原始ldt时,就会产生无效索引,最终触发bad 'data'报错。
如果其他数据集没有缺失值、拟合初始模型时没有被自动剔除行,就不会出现这个问题。 - 筛选后的数据集存在无效样本/分组
你筛选出来的子数据集可能存在以下问题:- 因变量
correct_answer某一类别完全被筛除,二项分布拟合需要同时存在0和1的观测 - 随机效应分组(
Participant/word)某一组只剩1个及以下观测,无法估计随机效应方差 - 固定效应
condition某一水平的观测完全被筛除,无法估计对应回归系数
- 因变量
- 逻辑索引存在NA值
如果acc.glmer的残差存在NA值,abs(scale(resid(acc.glmer)))<2.5的结果也会出现NA,用带NA的逻辑向量索引数据集会产生NA行,glmer无法识别这类无效行。
解决方法
你可以先将初始模型用到的无缺失值数据集单独提出来,再做筛选,示例代码如下:
# 先拟合初始模型 acc.glmer <- glmer(correct_answer ~ condition + (1|Participant) + (1|word), data = ldt, family="binomial") # 提取初始模型实际用到的无缺失值数据集 model_data <- model.frame(acc.glmer) # 加入残差筛选条件,得到过滤后的数据集 filtered_data <- model_data[abs(scale(resid(acc.glmer))) < 2.5, ] # 拟合新模型 acc.glmer1 <- glmer(correct_answer ~ condition + (1|Participant) + (1|word), data = filtered_data, family="binomial")
内容的提问来源于stack exchange,提问作者Katerina
相关产品推荐
相关产品推荐

