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

将分组tsibble转换为fable时的索引转换与可视化问题

问题:fable索引转换为时间索引并保留预测分布

背景

针对部门D、地点M的每小时退货量,基于《预测原理与实践》第3版的复杂季节性方法建模:

  • 数据仅保留工作日8:00-17:00时段,转换为以Appt_Slot为时间索引的分组tsibble
  • 拆分数据集:最后50个观测(对应5天数据)作为测试集,剩余数据用于建模
  • 为适配傅里叶项,将训练集按分组建立行号索引t,构建含预约量的谐波回归ARIMA模型
  • 用测试集生成预测结果(fable对象),但该对象以t为索引,无法直接与历史时间序列可视化

核心问题

直接使用update_tsibble()转换索引会将fable转为普通tsibble,丢失预测分布信息(如置信区间),导致绘图时出现美学映射错误,无法同时展示历史数据与预测结果。

解决方案

步骤1:关联时间索引与预测结果

从测试集中提取对应的Appt_Slot,与fable对象通过分组键和行号t关联,替换索引并保留fable属性:

# 假设:
# test_data:保留Appt_Slot的测试集tsibble(含Department、Location、Appt_Slot、t列)
# fable_pred:生成的预测fable对象(含Department、Location、t、.mean、.lower、.upper等列)

fable_pred_time <- fable_pred %>%
  # 关联测试集的时间索引
  left_join(test_data %>% select(Department, Location, Appt_Slot, t),
            by = c("Department", "Location", "t")) %>%
  # 移除行号索引t
  select(-t) %>%
  # 重新声明为fable对象,保留预测分布
  as_fable(
    response = Return_Volume,  # 替换为你的响应变量名
    distribution = distribution(Return_Volume),
    key = c(Department, Location),
    index = Appt_Slot
  )

步骤2:可视化历史数据与预测结果

结合训练集、测试集和更新后的fable对象绘图:

library(ggplot2)

training_data %>%
  ggplot(aes(x = Appt_Slot, y = Return_Volume)) +
  # 绘制历史训练数据
  geom_line(color = "gray50") +
  # 绘制测试集实际数据
  geom_line(data = test_data, color = "steelblue") +
  # 绘制预测均值
  geom_line(data = fable_pred_time, aes(y = .mean), color = "firebrick", linewidth = 1) +
  # 绘制预测置信区间
  geom_ribbon(data = fable_pred_time, aes(ymin = .lower, ymax = .upper), fill = "firebrick", alpha = 0.2) +
  # 按部门和地点分面
  facet_wrap(~Department + Location) +
  labs(x = "预约时段", y = "退货量", title = "每小时退货量预测")

关键说明

  • as_fable()是核心操作:它能在替换索引后,重新保留fable对象的预测分布属性,避免转换为普通tsibble
  • 关联时需确保分组键(Department、Location)和行号t完全匹配,防止索引错位

内容的提问来源于stack exchange,提问作者TK Tandy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 00:53:10