基于R语言tidy范式实现多模型的最优选择与新数据预测
解决方案:为每个国家选择最优模型并进行新数据预测
第一步:整理R平方数据,选出每个国家的最优模型
你已经算出了每个模型的R平方值,现在需要把这些数据转换成更易处理的长格式,然后为每个国家筛选出R²最高的模型:
library(tidyverse) library(modelr) library(gapminder) library(broom) # 把宽格式的R平方数据转为长格式,方便按模型分组比较 r_sq_long <- r_sq %>% pivot_longer( cols = starts_with("r.sq"), names_to = "model", values_to = "r_squared", # 把列名从r.sq1转换为model1,和by_country里的模型列名匹配 names_transform = list(model = ~str_replace(., "r.sq", "model")) ) # 按国家分组,选出R平方最大的模型;with_ties=FALSE避免多个模型R²相同时的重复结果 best_models_meta <- r_sq_long %>% group_by(country, continent) %>% slice_max(r_squared, n = 1, with_ties = FALSE) %>% ungroup()
接下来,把这个最优模型的元数据和你之前的by_country数据集合并,提取出对应的模型对象:
# 合并数据并动态提取最优模型对象 by_country_with_best <- by_country %>% left_join(best_models_meta, by = c("country", "continent")) %>% # 根据model列的名称,提取对应列中的模型对象 mutate(best_model = pmap(list(country, model), function(cntry, mod) { by_country %>% filter(country == cntry) %>% pull(!!sym(mod)) %>% pluck(1) }))
第二步:用最优模型对新数据进行预测
首先确保你的新数据结构和训练数据一致(包含year、gdpPercap、pop这些特征),下面是一个示例新数据的构造和预测流程:
# 构造示例新数据:每个国家2020年的假想数据 new_data <- gapminder %>% distinct(country, continent) %>% mutate( year = 2020, gdpPercap = runif(n(), 1000, 100000), # 随机生成GDP数据 pop = rnorm(n(), mean = 5e6, sd = 1e7) # 随机生成人口数据 ) # 合并数据并生成预测结果 final_predictions <- by_country_with_best %>% left_join(new_data, by = c("country", "continent")) %>% # 用map2把每个最优模型和对应的新数据传入predict函数,返回数值型预测结果 mutate(predicted_lifeExp = map2_dbl(best_model, cur_data(), ~predict(.x, newdata = .y))) %>% # 保留关键结果列,方便查看 select(country, continent, best_model_name = model, r_squared, predicted_lifeExp)
补充说明
- 如果存在多个模型R²相同的情况,你可以调整
slice_max的参数,比如设置with_ties=TRUE,后续可以选择取多个模型的平均预测值,或者根据其他指标(比如AIC)进一步筛选。 - 若需要保留更多预测细节(比如置信区间),可以用
broom::augment()函数替代predict(),它会返回包含原始数据、预测值和置信区间的完整数据集。
内容的提问来源于stack exchange,提问作者Yuriy Barvinchenko
相关产品推荐
相关产品推荐

