You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么运行glmer移除2.5sd残差离群值时出现“bad data”错误?

报错核心原因及对应排查方向

  • 最常见原因:初始模型拟合时自动剔除的缺失值行,导致残差长度与原始数据集行数不匹配
    glmer()拟合模型时会默认自动删除数据中包含自变量、因变量、随机效应分组变量缺失值的行,最终拟合用的数据集行数会少于原始ldt的行数,因此你提取到的resid(acc.glmer)的长度是剔除缺失值后的行数,和原始ldt的行数不一致,用这个长度不匹配的逻辑向量去索引原始ldt时,就会产生无效索引,最终触发bad 'data'报错。
    如果其他数据集没有缺失值、拟合初始模型时没有被自动剔除行,就不会出现这个问题。
  • 筛选后的数据集存在无效样本/分组
    你筛选出来的子数据集可能存在以下问题:
    1. 因变量correct_answer某一类别完全被筛除,二项分布拟合需要同时存在0和1的观测
    2. 随机效应分组(Participant/word)某一组只剩1个及以下观测,无法估计随机效应方差
    3. 固定效应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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 08:18:04