当使用 Rob Hyndman 非常有用的hts 包中的 combinef 函数来预测分层和分组时间序列时,似乎没有办法将最佳组合预测约束为正 - 起始预测可以是正的,但可以通过负数和解过程。
forecast.gts 和 forecast.hts 函数有一个参数来保持预测为正,但是当使用 combinef 本身和通过其他方法获得的预测时,这似乎不是一个选项。
我的这种理解是否正确,如果是,是否有合适的解决方法?
当使用 Rob Hyndman 非常有用的hts 包中的 combinef 函数来预测分层和分组时间序列时,似乎没有办法将最佳组合预测约束为正 - 起始预测可以是正的,但可以通过负数和解过程。
forecast.gts 和 forecast.hts 函数有一个参数来保持预测为正,但是当使用 combinef 本身和通过其他方法获得的预测时,这似乎不是一个选项。
我的这种理解是否正确,如果是,是否有合适的解决方法?
支持并确保初始预测是积极的,但不是最终协调预测的positive=TRUE论据。即使初始预测为正,调节后的预测也可能为负。当您使用 时,您会提供自己的起始预测,因此您可以将它们设为正数。forecast.gtsforecast.htscombinef
可以使用非线性最小二乘协调程序来产生正约束协调预测,但这会慢得多。
如果您使用forecast::combinef().
我个人认为有用的是设置求和矩阵(参见Hyndman 等人的原始出版物,2011 年),然后使用额外的非负约束来解决相关的(加权)最小二乘问题。这将为您提供非负和总和一致的预测。我反复发现这种方法仍然可以在层次结构中的所有级别上产生更好的预测。
这种方法还允许包含等式约束,或者比“更一般”的约束“。我有一些应用程序,其中一些预测需要大于某个数字(因为现有订单),或者需要限制为等于给定值,您可以使用两个不等式约束对其进行建模。
解决(加权)具有线性约束的最小二乘的一种可能工具是R 包中的pcls()函数。(请注意,这比您的用例更通用:允许线性约束,但您和我在上一段中概述的用例只需要框约束。)但是,这当然也没有优化以利用特定结构的潜在预测层次矩阵,因此您的性能可能比使用.mgcvmgcv::pcls()combinef()
一些基于 Rob 将负数设置为零并协调的解决方法的代码
# Re-reconciliate when zero values present
# Extract groups
groups <- hts.obj %>%
aggts() %>%
get_groups()
x=0 #Counter
# Loop until all positive
while(sum(hts.obj[[1]] <0) > 0){
# Generate all time series
hts.obj <- aggts(hts.obj)
# Overwrite negatives by zero
hts.obj[hts.obj<0] <- 0
# Reconcile
hts.obj <- hts.obj %>%
ts() %>%
combinef(groups = groups, keep ="gts")
# Count up
x=x+1
# Break after 10 loops
if(x>=10)break
}
rm("x")
# Overwrite remaining negatives by zero
hts.obj[[1]][hts.obj[[1]]<0] <- 0
在此示例中,预测由 [[1]] 索引 - 这可能会改变。另请注意,覆盖零会导致预测有偏差。