基于DataFrame列表预测结果使用ggplot与facet_wrap绘图的问题
问题解决方案
你当前的代码无法运行的核心原因有两点:
pred1是仅包含预测值向量的列表,没有和year、group、value等原始变量做关联,ggplot无法读取绘图所需的维度变量- ggplot的第一个参数要求传入数据框结构,不能直接传入列表类型的
pred1
正确实现步骤
1. 绑定预测值与原始数据,合并为统一数据框
你已经拆分了分组子数据集table_list,训练得到了一一对应的model_list,直接用purrr的map2_df遍历两个列表,绑定预测值后自动合并为总数据框即可:
# 加载所需包 library(purrr) library(ggplot2) # 遍历每个分组的数据集和对应模型,生成预测值并合并为总表 pred_total <- map2_df(table_list, model_list, function(sub_dat, sub_mod) { # 为当前分组的数据集新增预测值列 sub_dat$pred_smoker <- predict.glm(sub_mod, type = "response") return(sub_dat) })
如果你需要基于female=1的新数据集dat_new生成预测结果,只要先按相同的分组规则拆分dat_new,再做同样的遍历操作即可:
# 拆分female=1的新数据集,拆分规则和训练集保持一致 dat_new_list <- dat_new %>% group_by(year, group) %>% group_split() # 生成新数据集的预测结果总表 pred_new_total <- map2_df(dat_new_list, model_list, function(new_sub_dat, sub_mod) { new_sub_dat$pred_smoker <- predict.glm(sub_mod, newdata = new_sub_dat, type = "response") return(new_sub_dat) })
2. 调用ggplot绘图
直接传入合并后的总数据框,即可正常按group分面绘图:
# 用原始数据+预测值绘图,可将预测值映射为点的颜色 ggplot(pred_total, aes(x = year, y = value)) + geom_point(aes(color = pred_smoker), alpha = 0.6) + facet_wrap(~ group)
内容的提问来源于stack exchange,提问作者Stata_user
相关产品推荐
相关产品推荐

