如何从多个lme4模型对象中准确获取预测值并匹配原数据集?
如何为分组拟合的混合效应模型匹配预测值与原数据集?
你当前用ldply(MxM1, as.data.frame(predict))$value提取预测值的方法存在风险:dlply按recipe分组时,会按分组水平的顺序(A→B→C)处理每个子数据集,返回的预测值也是先A组所有值、再B组、再C组。如果原数据集的行顺序刚好是先所有A组记录,再B组、再C组,那结果是对的,但如果原数据集中recipe的顺序是混杂的(比如A、B、A、C...),预测值就会和观测值完全错位。
推荐解决方案:分组处理时直接绑定预测值
最稳妥的方式是在dlply的分组函数中,直接将预测值添加到子数据集里,再合并回完整数据集,这样能保证每一行的观测值和预测值一一对应:
library(lme4) library(plyr) data(cake) # 分组拟合模型,同时为每个子数据集添加预测值 MxM1 <- plyr::dlply(cake, "recipe", function(x) { # 拟合模型 model <- lmer(angle ~ 1 + (1|replicate) + temperature, data = x) # 为当前子数据集添加预测值列 x$pred <- predict(model) # 返回带预测值的子数据集 return(x) }) # 合并所有分组数据,得到带预测值的完整数据集 cake_with_pred <- ldply(MxM1)
验证匹配正确性
你可以通过查看合并后的数据集,对比前几行的angle和pred,或者检查分组内的顺序是否与原数据一致:
# 查看合并后的数据前6行 head(cake_with_pred) # 验证原数据与合并后数据的行顺序是否一致(如果原数据是按recipe分组排列的) all.equal(cake$angle, cake_with_pred$angle)
备选方案:基于分组标识匹配已有的模型预测值
如果你已经拟合好了MxM1模型列表,也可以通过分组和组内行号来精准匹配预测值:
# 从模型列表中提取预测值,并保留分组信息 pred_df <- do.call(rbind, lapply(names(MxM1), function(rec) { data.frame( recipe = rec, pred = predict(MxM1[[rec]]), # 为每个分组内的行添加序号 row_in_group = seq_len(nrow(subset(cake, recipe == rec))) ) })) # 为原数据集添加组内行号 cake$row_in_group <- ave(seq(nrow(cake)), cake$recipe, FUN = seq_along) # 通过recipe和row_in_group合并,确保预测值匹配正确 cake_with_pred <- merge(cake, pred_df, by = c("recipe", "row_in_group")) # 按原数据集的顺序重新排序 cake_with_pred <- cake_with_pred[order(seq(nrow(cake))), ]
内容的提问来源于stack exchange,提问作者Ahir Bhairav Orai
相关产品推荐
相关产品推荐

