如何基于df_z为分国家的行式线性回归模型添加预测值
基于分组LM模型生成未来预测值的实现方案
问题背景
我有三个通过以下代码生成的数据集:
library(dplyr) library(tidyr) # 模拟数据 countries = LETTERS[1:3] mat_x = matrix(runif(27, 0, 100), nrow = 3) colnames(mat_x) = 2012:2020 df_x = bind_cols(country = countries, mat_x) mat_y = matrix(runif(27, 0, 100), nrow = 3) colnames(mat_y) <- paste0("Y", 2012:2020) df_y = bind_cols(country = countries, mat_y) mat_z = matrix(runif(27, 0, 100), nrow = 3) colnames(mat_z) <- paste0("Y", 2021:2029) df_z = bind_cols(country = countries, mat_z)
其中df_x是响应变量,df_y是回归变量,df_z是回归变量的未来值。
我已经完成了数据格式转换、合并,以及按country分组嵌套并构建每个国家的lm(y ~ x)模型,代码如下:
# 转换df_x为长格式 df_x_long <- df_x %>% pivot_longer(-country, names_to = "year", values_to = "x") %>% mutate(across(year, as.numeric)) # 转换df_y为长格式 df_y_long <- df_y %>% select(country, starts_with("Y")) %>% pivot_longer(-country, names_to = "year", values_to = "y") %>% mutate(year = as.numeric(gsub("^Y", "", year))) # 合并数据 df_xy_long <- inner_join(df_x_long, df_y_long, by = c("country", "year")) # 嵌套并建模 df_xy_nested <- df_xy_long %>% group_by(country) %>% nest() %>% rowwise() %>% mutate(model = list(lm(y ~ x, data = data))) %>% ungroup()
现在需要基于每个国家的LM模型,使用df_z中的数据生成2021-2029年的预测值。
实现步骤
1. 转换df_z为长格式
将宽格式的df_z转换为长格式,确保变量名与模型输入匹配:
df_z_long <- df_z %>% pivot_longer(-country, names_to = "year", values_to = "x") %>% mutate(year = as.numeric(gsub("^Y", "", year)))
2. 嵌套未来数据并与模型数据集合并
按country分组嵌套未来数据,再和已有的模型数据合并,保证每个国家的模型对应其未来数据:
df_z_nested <- df_z_long %>% group_by(country) %>% nest(future_data = everything()) # 合并模型与未来数据 df_model_future <- df_xy_nested %>% left_join(df_z_nested, by = "country")
3. 逐行生成预测值
使用rowwise()逐行处理每个国家的模型和未来数据,调用predict()生成预测结果,并将预测值与原始未来数据绑定:
df_predictions <- df_model_future %>% rowwise() %>% mutate( # 生成预测值 predictions = list(predict(model, newdata = future_data)), # 合并预测值与未来数据 predicted_data = list( future_data %>% mutate(predicted_y = predictions) ) ) %>% ungroup()
4. 展开嵌套结果(可选)
如果需要扁平格式的预测结果,使用unnest()展开嵌套的predicted_data列:
df_predictions_flat <- df_predictions %>% select(country, predicted_data) %>% unnest(predicted_data)
最终的df_predictions_flat包含每个国家2021-2029年的year、x(未来回归变量值)和predicted_y(预测的响应变量值)。
内容的提问来源于stack exchange,提问作者Saïd Maanan
相关产品推荐
相关产品推荐

