使用fabletools Middle-out方法做分组时间序列预测遇错求助
问题解决:fabletools middle_out 预测报错处理
核心问题分析
报错根源集中在三点:
- 混合加载fpp2(依赖
forecast包)与fpp3生态工具,引发函数命名冲突 middle_out的参数使用不符合fabletools规范- 数据层级结构与模型预测的兼容性问题
修复后完整代码
# 仅加载fpp3生态核心包,避免版本冲突 library(tsibble) library(dplyr) library(fable) library(fabletools) library(fpp3) # 生成可复现的示例数据 set.seed(42) n <- 6 data_example <- data.frame( Date = seq.Date(as.Date("2020-12-01"), as.Date("2021-05-01"), "month"), No_ = sample(1800:1830, n, replace=TRUE), Category = rep(LETTERS[1:3], n), Quantity = sample(18:24, n, replace=TRUE) ) # 数据预处理:转换为tsibble并构建层级结构 sell_full <- data_example %>% mutate(Month = yearmonth(Date)) %>% group_by(No_, Category, Month) %>% summarise(Quant = sum(Quantity), .groups = 'drop') %>% as_tsibble(key = c(No_, Category), index = Month) %>% # 构建层级:总销量 -> Category -> 单品No_ aggregate_key(Category / No_, Quant = sum(Quant)) %>% fill_gaps(Quant = 0, .full = TRUE) # 构建模型并指定middle_out中层节点 fit <- sell_full %>% model(ets = ETS(Quant ~ error("A") + trend("A") + season("A"))) %>% middle_out(split = Category) # 直接指定中层变量名,而非数字索引 # 生成6个月预测 fc <- forecast(fit, h = "6 months", level = 95) # level为置信区间百分比,1无意义,改为95
关键修复点说明
- 清理依赖包:移除
fpp2、forecast、reshape等与fpp3生态冲突的包,仅保留fpp3体系工具 - 修正
middle_out参数:split需指定中层变量名(Category),数字索引在层级结构中易引发定位错误 - 调整置信区间参数:原代码
level=1无效,置信区间需设置为0-100的百分比值 - 避免lambda参数冲突:若需自动Box-Cox转换,应在模型公式中声明,而非在
forecast()中传递:model(ets = ETS(box_cox(Quant, lambda = "auto") ~ error("A") + trend("A") + season("A")))
报错原因拆解
method="mo"报错:forecast()不支持该参数,middle-out策略已通过middle_out()函数提前指定,无需重复声明- vctrs类型冲突:混合加载fpp2与fpp3导致
BoxCox函数调用逻辑混乱,agg_vec与double类型无法兼容 key_data缺失报错:属于错误参数使用,middle-out模型无需额外指定key_data,问题源于split参数的错误设置
内容的提问来源于stack exchange,提问作者Federico Silvestri
相关产品推荐
相关产品推荐

