如何用lapply按组拟合回归并在原数据集生成预测值
R语言使用lapply实现分组回归并新增预测值列
你的原始循环逻辑可以直接迁移为lapply实现,以下是两种常用写法:
写法1:完全对标原始循环逻辑
直接遍历每个分组ID,填充原数据集的预测值列:
# 生成示例数据 data <- data.frame(x = rnorm(100), y = rnorm(100), id = rep(c('a', 'b', 'c', 'd'), 25)) # 初始化预测值列(可选,提前定义避免作用域问题) data$pred <- NA invisible(lapply(unique(data$id), function(i) { sub_data <- subset(data, id == i) model <- lm(y ~ x, data = sub_data) # 使用<<-超赋值运算符修改外层的data对象 data$pred[data$id == i] <<- predict(model, sub_data) }))
说明:invisible用来隐藏lapply默认返回的列表,避免控制台输出无用内容。
写法2:无副作用的函数式写法
不直接修改外层变量,通过合并lapply返回的分组结果得到最终数据集,稳定性更高:
data <- data.frame(x = rnorm(100), y = rnorm(100), id = rep(c('a', 'b', 'c', 'd'), 25)) # lapply返回每个分组的建模结果+预测值 pred_res <- lapply(unique(data$id), function(i) { sub_data <- subset(data, id == i) model <- lm(y ~ x, data = sub_data) return(transform(sub_data, pred = predict(model, sub_data))) }) # 按行合并所有分组的结果 data <- do.call(rbind, pred_res)
说明:该写法不需要处理作用域问题,也方便单独调试每个分组的建模结果。
内容的提问来源于stack exchange,提问作者Masa_K
相关产品推荐
相关产品推荐

