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

R中lmer模型拟合值赋值到数据列时出现长度不兼容错误

线性混合效应模型拟合值赋值报错解决方案

问题背景

我尝试使用ggplot2绘制线性混合效应模型的结果,目前无法实现个体数据点的绘制。由于我在模型中纳入了前测作为协变量,且前测的条件均值存在一定差异,模型输出的估计均值与样本均值相差较大,可通过如下测试图直观查看:
testplot
我需要绘制个体数据点的调整后数值,但在R环境下实现时遇到问题,尝试调用fitted()函数获取模型拟合值,运行如下代码时抛出错误:

CI_post <- lmer(
  post.diff ~ 
    pre.diff +
    group * course 
  + (1|bib) 
  + (1|school), 
  data = dat, 
  REML = FALSE)

dat$fitted <- fitted(CI_post)

报错信息如下:

Error: Assigned data `fitted(CI_post)` must be compatible with existing data.
x Existing data has 156 rows.
x Assigned data has 154 rows.
ℹ Only vectors of size 1 are recycled.

根因说明

该报错是因为lmer()建模时会自动剔除所有包含模型涉及变量缺失值的观测行:原始数据集dat共156行,其中有2行在post.diff/pre.diff/group/course/bib/school这几个模型用到的变量中存在缺失值,建模时被自动排除,因此生成的拟合值只有154条,无法直接赋值到156行的原数据集中。

解决方案

  • 方案1:提前筛选无缺失值的观测子集建模
    先提取模型变量无缺失的子集,再用该子集建模,后续赋值不会出现行数不匹配问题,适合不需要保留原数据集全部行的场景:
    # 筛选模型涉及变量均无缺失的观测
    dat_valid <- dat[complete.cases(dat[, c("post.diff", "pre.diff", "group", "course", "bib", "school")]), ]
    # 用筛选后的数据集建模
    CI_post <- lmer(
      post.diff ~ pre.diff + group * course + (1|bib) + (1|school), 
      data = dat_valid, 
      REML = FALSE
    )
    # 赋值拟合值
    dat_valid$fitted <- fitted(CI_post)
    
  • 方案2:匹配拟合值回原数据集
    如果你需要保留原数据集的所有行,可以通过模型的na.action属性定位被剔除的行,将拟合值填充到对应位置,被剔除的行拟合值留空:
    # 先在原数据集生成全NA的拟合值列
    dat$fitted <- NA
    # 将拟合值填充到建模时用到的观测对应的位置
    dat$fitted[-as.numeric(na.action(CI_post))] <- fitted(CI_post)
    

内容的提问来源于stack exchange,提问作者Cmagelssen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:24:03