R中lmer模型拟合值赋值到数据列时出现长度不兼容错误
线性混合效应模型拟合值赋值报错解决方案
问题背景
我尝试使用ggplot2绘制线性混合效应模型的结果,目前无法实现个体数据点的绘制。由于我在模型中纳入了前测作为协变量,且前测的条件均值存在一定差异,模型输出的估计均值与样本均值相差较大,可通过如下测试图直观查看:
我需要绘制个体数据点的调整后数值,但在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
相关产品推荐
相关产品推荐

