R语言使用mutate添加lmer模型拟合值时长度不匹配报错如何解决
报错诱因与解决方法
初始报错(pred_dist必须为15或1,不是17192)
诱因
你的数据集myData处于dplyr分组状态,从报错信息可看出你预先按sgroup和group字段对数据做了分组。分组状态下执行mutate()时,运算逻辑是按组独立执行,你当前操作的第一组只有15行,但fitted(model0)返回的是全数据集所有行的拟合结果(共17192个值),长度和分组单组的行数不匹配,因此报错。
解决方法
在执行mutate()前先对数据集取消分组即可:
myData %>% ungroup() %>% mutate(pred_dist = fitted(model0))
后续模型报错(拟合值16794行,原数据17192行)
诱因
你后续构建的model1引入了新的自变量predictor,lmer建模时会默认自动剔除所有自变量、因变量、分组变量中存在缺失值的行,你的数据中predictor列存在398个缺失值,因此建模实际只用了16794行有效数据,fitted(model1)仅返回这16794行的拟合结果,和原数据集17192行的长度不匹配,赋值失败。
解决方法
两种方案可选:
- 建模前手动剔除缺失值,保证建模数据和后续赋值的数据集行数完全一致:
# 提取建模用到的所有字段无缺失的干净数据集 clean_data <- myData %>% drop_na(outcome, predictor, group) # 用干净数据集建模 model1 <- lmer(outcome ~ predictor + (1|group), data=clean_data, REML=FALSE) # 直接赋值拟合值,长度完全匹配 clean_data <- clean_data %>% ungroup() %>% mutate(pred_dist = fitted(model1))
- 不删除原数据行,用
predict()函数指定缺失值保留规则,缺失行的拟合值返回NA,长度和原数据匹配:
myData <- myData %>% ungroup() %>% mutate(pred_dist = predict(model1, newdata = myData, na.action = na.pass))
内容的提问来源于stack exchange,提问作者Pål Bjartan
相关产品推荐
相关产品推荐

