使用dplyr管道按LSOA分组预测未来5个时间点数据
按LSOA分组预测时间序列的dplyr实现方案
核心思路
借助dplyr的分组嵌套能力,结合forecast包的时间序列建模工具,为每个LSOA组单独拟合模型并生成未来5年的预测结果,全程用管道流实现。
完整可运行代码
假设你的数据集名为ts_data,包含LSOA(分组标识)、Date(日期列)、Value(数值列):
library(dplyr) library(tidyr) library(forecast) library(lubridate) # 预处理:统一日期格式,按分组和日期排序 processed_data <- ts_data %>% mutate(Date = ymd(Date)) %>% arrange(LSOA, Date) # 分组建模+预测全流程 forecast_results <- processed_data %>% group_by(LSOA) %>% nest() %>% mutate( # 为每组创建时间序列对象(frequency=1对应年度数据,按需调整:季度用4,月度用12) ts_obj = map(data, ~ ts(.x$Value, frequency = 1)), # 自动拟合最优ARIMA模型(可替换为ets()等其他模型) model = map(ts_obj, auto.arima), # 生成未来5年预测,h=5指定预测时间点数量 forecast = map(model, forecast, h = 5), # 将预测结果转为数据框格式 forecast_df = map(forecast, as.data.frame) ) %>% # 展开嵌套的预测结果,合并分组信息 unnest(forecast_df) %>% # 生成对应预测日期(按原始数据最后日期往后推5年) mutate( Forecast_Date = map2(data, 5, ~ seq(last(.x$Date), by = "year", length.out = .y + 1)[-1]) %>% unlist() ) %>% # 按需选择输出列 select(LSOA, Forecast_Date, Point.Forecast, Lo.80, Hi.80, Lo.95, Hi.95)
关键细节说明
- 时间序列频率设置:
ts()函数的frequency参数必须匹配你的数据周期,错设会导致模型拟合失效。 - 模型替换:如果不想用ARIMA,把
auto.arima换成ets(指数平滑)或其他时间序列模型即可,语法完全兼容。 h参数的作用:forecast(model, h = 5)里的h就是你需要的预测时长,这里直接设为5对应未来5年,精准匹配需求。- 日期对齐:通过
seq()生成的日期序列,确保每个预测值对应正确的年份,避免出现日期和预测值不匹配的问题。
常见问题排查
- 嵌套操作报错时,检查每个LSOA组的观测值数量,至少需要3-5个数据点才能拟合有效模型。
- 日期生成异常时,确认
Date列是标准日期格式,用ymd()/mdy()等函数统一转换后再操作。
内容的提问来源于stack exchange,提问作者Jacob Baisley
相关产品推荐
相关产品推荐

