如何为含缺失值的数据集添加lmer模型的拟合值?
解决lmer拟合值与原数据行数不匹配的问题
核心原因
lmer拟合模型时会自动删除包含缺失值的观测(列表删除法),导致fitted(mlm1)的行数比原数据少,直接赋值就会触发行数不匹配的报错。
具体解决方案
方法1:用predict直接匹配原数据(推荐)
直接调用predict()并指定原数据为newdata,函数会自动对原数据中因缺失值被排除的行返回NA,完美匹配原数据行数:
data_similar_school$fitted <- predict(mlm1, newdata = data_similar_school)
方法2:利用模型的na.action属性还原
模型的na.action记录了被删除的行索引,可以通过它将拟合值还原到原数据维度:
# 获取拟合值,反向填充缺失位置为NA fitted_full <- naresid(mlm1, fitted(mlm1)) # 赋值到原数据 data_similar_school$fitted <- fitted_full
或者手动处理:
fitted_vals <- fitted(mlm1) # 创建和原数据同长度的向量,初始为NA fitted_full <- rep(NA, nrow(data_similar_school)) # 将拟合值填充到模型保留的行位置 fitted_full[-mlm1@na.action] <- fitted_vals data_similar_school$fitted <- fitted_full
方法3:手动添加ID进行匹配
如果上述方法失效,可以给原数据添加唯一行ID,再通过ID关联拟合值:
# 给原数据添加唯一行ID data_similar_school$row_id <- seq_len(nrow(data_similar_school)) # 提取模型使用的数据集,添加拟合值和对应ID model_df <- model.frame(mlm1) model_df$fitted <- fitted(mlm1) model_df$row_id <- data_similar_school$row_id[-mlm1@na.action] # 左连接回原数据 data_similar_school <- merge(data_similar_school, model_df[, c("row_id", "fitted")], by = "row_id", all.x = TRUE)
内容的提问来源于stack exchange,提问作者m45ha
相关产品推荐
相关产品推荐

