如何在含多个tsibble的tibble中批量构建ARIMA模型并预测?
批量构建ARIMA模型并预测的解决方案
原代码的问题
你的map调用存在两个核心问题:
- 传入
ARIMA的参数错误:你直接用了整个data_ts列,而非遍历过程中的单个tsibble元素(应该用.x指代当前迭代的元素) ARIMA语法不符合fable包要求:需要用公式形式指定时间序列变量,或者结合model()函数完成建模
正确实现步骤
以下是适配你数据结构的完整批量建模+预测流程:
1. 批量训练ARIMA模型
用purrr::map遍历每个data_ts中的tsibble,借助fable的自动模型选择功能训练最优ARIMA模型:
new_test_data <- new_test_data %>% mutate( # 为每个tsibble训练自动ARIMA模型 arima_model = map(data_ts, ~ .x %>% model(ARIMA(value))) )
如果需要自定义ARIMA参数(比如指定p=1、d=1、q=1),可以修改为:
new_test_data <- new_test_data %>% mutate( arima_model = map(data_ts, ~ .x %>% model(ARIMA(value ~ pdq(1,1,1)))) )
2. 批量生成预测
指定预测期数(比如未来4个时间步),结合fabletools::forecast批量生成预测结果:
new_test_data <- new_test_data %>% mutate( # 生成未来4个时间周期的预测 arima_forecast = map(arima_model, ~ forecast(.x, h = 4)) )
3. 展开预测结果(可选)
如果需要把嵌套的预测结果转换成扁平结构,方便后续分析:
forecast_results <- new_test_data %>% select(`Formula ID`, `Formula Name`, arima_forecast) %>% unnest(arima_forecast)
完整可运行示例
结合你的初始数据,模拟多数据集场景的完整代码:
library(tidyverse) library(tsibble) library(lubridate) library(fable) library(fabletools) library(purrr) # 生成初始数据 data <- tibble(Date=yearweek(mdy("5/6/2022","5/14/2022","5/21/2022")), value=c(3,5,7)) # 注意:tsibble必须指定时间索引,原代码遗漏了该参数 ts_data <- tsibble(data, index = Date) # 模拟70个数据集的场景(这里用2个示例) new_test_data <- tibble( `Formula ID` = c(1, 2), `Formula Name` = c("Flubber", "Gloop"), data = list(data, data %>% mutate(value = value * 2)), data_ts = list(ts_data, tsibble(data %>% mutate(value = value * 2), index = Date)) ) # 批量建模+预测 new_test_data <- new_test_data %>% mutate( arima_model = map(data_ts, ~ .x %>% model(ARIMA(value))), arima_forecast = map(arima_model, ~ forecast(.x, h = 4)) ) # 展开并查看结果 forecast_results <- new_test_data %>% select(`Formula ID`, `Formula Name`, arima_forecast) %>% unnest(arima_forecast) print(forecast_results)
关键注意事项
- tsibble必须明确指定时间索引:原代码中
ts_data <- tsibble(data)会报错,需要补充index = Date参数 fable::ARIMA的自动模型选择功能适合批量处理大量数据集,无需手动调参- 如果需要加入外部协变量,可以在公式中补充,比如
ARIMA(value ~ pdq(1,1,1) + x1 + x2)
内容的提问来源于stack exchange,提问作者Shawn Way
相关产品推荐
相关产品推荐

