You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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")))
    

报错原因拆解

  1. method="mo"报错:forecast()不支持该参数,middle-out策略已通过middle_out()函数提前指定,无需重复声明
  2. vctrs类型冲突:混合加载fpp2与fpp3导致BoxCox函数调用逻辑混乱,agg_vec与double类型无法兼容
  3. key_data缺失报错:属于错误参数使用,middle-out模型无需额外指定key_data,问题源于split参数的错误设置

内容的提问来源于stack exchange,提问作者Federico Silvestri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 06:30:49