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

如何消除fable中ETS模型预测区间的负值?

解决fable中STL+ETS预测庇护申请时出现负值的问题

你的核心问题是庇护申请数量属于非负计数数据,但默认ETS模型使用正态分布,导致预测区间出现不符合业务逻辑的负值。以下是两种根本解决思路:

方案1:为ETS模型指定非负计数分布

从模型层面适配数据特性,将ETS的分布设置为适合计数数据的类型,直接避免负值产生:

泊松分布(适用于均值≈方差的计数数据)

stl.fc <- train |>
  model(stlf = decomposition_model(
    STL(value),
    ETS(season_adjust, distribution = "poisson"), # 指定泊松分布
    SNAIVE(season_year)
  )) |>
  forecast(h = TIME_HORIZON)

负二项分布(适用于方差>均值的过度离散计数数据)

如果你的庇护申请数据存在过度离散(比如某些时间段申请量波动极大),改用负二项分布更合适:

stl.fc <- train |>
  model(stlf = decomposition_model(
    STL(value),
    ETS(season_adjust, distribution = "negbin"), # 指定负二项分布
    SNAIVE(season_year)
  )) |>
  forecast(h = TIME_HORIZON)

这种方式从模型假设上匹配非负计数数据,是最合理的根本解决方案,预测值和区间都会自然落在非负范围内。

方案2:截断预测分布至非负区间

如果不想调整模型分布,可在预测后对分布进行截断处理,强制将所有负值部分设为0:

stl.fc <- train |>
  model(stlf = decomposition_model(
    STL(value),
    ETS(season_adjust),
    SNAIVE(season_year)
  )) |>
  forecast(h = TIME_HORIZON) |>
  mutate(
    value = truncate(value, lower = 0) # 截断分布,下限设为0
  )

处理后再调用autoplot,预测区间的下限就会被限制在0以上,不会出现负值。这种方式属于后处理修正,适合快速调整结果的场景。

验证效果

可以通过提取预测分位数确认调整后的结果:

stl.fc |>
  hilo(level = c(80, 95)) |>
  unnest(hilo)

查看输出的lower列,所有值都应≥0。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 07:55:05