使用purrr::map执行线性回归预测时返回多行而非一行的问题求助
用purrr::pmap解决分组线性回归的多值预测问题
问题根源
你之前的代码中,map(model, get_prediction, pred_vals = 1:3) 是把全局的1:3向量传给每个模型,导致每个模型都对这3个值做预测,自然返回3行结果。而rowwise()报错是因为在按行处理时,没有正确把预测值包装成符合要求的结构,导致predict函数接收到的是单个数值而非匹配模型要求的输入格式。
用pmap的解决方案
pmap的核心优势就是可以按行匹配多个列的参数,正好对应每组的模型和对应的预测值集合。直接上可运行的代码:
library(tidyverse) # 自定义预测函数:接收模型和预测值向量,返回带预测结果的 tibble get_prediction <- function(model, pred_disp) { # 必须构造和模型自变量名一致的新数据框 new_data <- tibble(disp = pred_disp) tibble( pred_mpg = predict(model, newdata = new_data), disp = pred_disp ) } # 完整流程:分组嵌套 → 训练模型 → 生成预测 mtcars_grouped <- mtcars %>% group_by(cyl) %>% nest() %>% mutate( # 为每组训练 mpg ~ disp 的线性模型 model = map(data, ~lm(mpg ~ disp, data = .x)), # 为每组指定要预测的disp值(这里是1:3) pred_disp = list(1:3), # 用pmap按行配对model和pred_disp,生成预测 predictions = pmap(list(model, pred_disp), get_prediction) ) # 展开预测结果查看最终输出 mtcars_grouped %>% unnest(predictions)
关键说明
- 参数配对:
pmap(list(model, pred_disp), get_prediction)会逐行取model列的模型对象和pred_disp列的预测值向量,一起传入get_prediction函数,确保每组模型只处理自己的预测值集合。 - 结构化输出:让预测函数返回
tibble,而非单纯的数值向量,后续用unnest展开时能自动和原分组的cyl字段对应,避免数据混乱。 - 新数据框构造:
predict函数要求newdata是数据框,且变量名必须和模型中的自变量完全一致(这里是disp),这也是容易忽略的细节点。
内容的提问来源于stack exchange,提问作者one
相关产品推荐
相关产品推荐

