R中对多数据子集批量执行线性混合模型并合并预测结果的实现方法
R通用代码实现方案
以下代码可完全复现你描述的全流程操作,无需手动逐个生成子集和拟合模型,可直接输出最终合并的预测结果集。
前置准备(复现数据集构造逻辑)
# 加载依赖包 library(lme4) # 加载sleepstudy数据集并新增Days2字段 data(sleepstudy) sleepstudy$Days2 <- rep(10:18, rep(20,9))
方法1:基础for循环实现(逻辑清晰,适合新手理解)
# 获取Days2的唯一升序值 tt <- sort(unique(sleepstudy$Days2)) # 初始化空列表存储每轮的预测结果 pred_list <- list() # 遍历每个阈值完成全流程操作 for (i in seq_along(tt)) { # 生成对应子集 sub_dat <- sleepstudy[sleepstudy$Days2 >= tt[i], ] # 拟合带随机截距的线性混合模型 fit <- lmer(Reaction ~ Days + (1 | Subject), data = sub_dat) # 构造预测用的新数据集 new_dat <- data.frame(Days = tt[i], Subject = unique(sub_dat$Subject)) # 执行预测并存入结果列表 new_dat$Predicted_Response <- predict(fit, newdata = new_dat) pred_list[[i]] <- new_dat } # 合并所有轮次的预测结果得到最终数据集 FinalOutput <- do.call(rbind, pred_list)
方法2:lapply简洁实现(符合R向量编程习惯,代码更精简)
tt <- sort(unique(sleepstudy$Days2)) FinalOutput <- do.call(rbind, lapply(seq_along(tt), function(i) { sub_dat <- sleepstudy[sleepstudy$Days2 >= tt[i], ] fit <- lmer(Reaction ~ Days + (1 | Subject), data = sub_dat) new_dat <- data.frame(Days = tt[i], Subject = unique(sub_dat$Subject)) new_dat$Predicted_Response <- predict(fit, newdata = new_dat) return(new_dat) }))
两种方法输出的FinalOutput结构和数值完全和你手动生成的结果一致,包含Days、Subject、Predicted_Response三个字段。如果需要保留中间的模型、子集对象,只需在循环内额外增加对应存储逻辑即可。
内容的提问来源于stack exchange,提问作者John Majimboni
相关产品推荐
相关产品推荐

