12.3 限定预测结果范围
人们通常希望预测值为正,或者要求它们限定在某个指定范围 \([a,b]\) 内。这两种情况都能通过转换相对容易地完成。
正数预测
要施加一个正约束,只需要通过指定 Box-Cox 参数 \(\lambda=0\) 进行对数处理。例如,考虑一打鸡蛋的实际价格(1900-1993;单位美分):
%>%
eggs ets(model="AAN", damped=FALSE, lambda=0) %>%
forecast(h=50, biasadj=TRUE) %>%
autoplot() +
xlab("时间") +
theme(text = element_text(family = "STHeiti"))

图 12.3: 对一打鸡蛋的价格的预测,并用 Box-Cox 变换施加正约束。
由于我们设定biasadj=TRUE
,所以预测值为预测分布的均值。
限定区间范围的预测
要了解如何处理受限于某个区间的数据,可以假设鸡蛋价格被限制在 \(a=50\) 和 \(b=400\) 之间。然后我们可以通过使用 logit 转换将数据从范围 \((a,b)\) 映射到整个实数范围: \[ y = \log\left(\frac{x-a}{b-x}\right), \] 其中 \(x\) 为原始刻度, \(y\) 为转换后的数据。下式是这个转换过程的逆转换等式。 \[ x = \frac{(b-a)e^y}{1+e^y} + a. \] 这不是一个内置的转换,因此我们需要做更多的工作。
# Bounds
<- 50
a <- 400
b # Transform data and fit model
<- log((eggs-a)/(b-eggs)) %>%
fit ets(model="AAN", damped=FALSE)
<- forecast(fit, h=50)
fc # Back-transform forecasts
"mean"]] <- (b-a)*exp(fc[["mean"]])/(1+exp(fc[["mean"]])) + a
fc[["lower"]] <- (b-a)*exp(fc[["lower"]])/(1+exp(fc[["lower"]])) + a
fc[["upper"]] <- (b-a)*exp(fc[["upper"]])/(1+exp(fc[["upper"]])) + a
fc[["x"]] <- eggs
fc[[# Plot result on original scale
autoplot(fc) +
xlab("时间") +
theme(text = element_text(family = "STHeiti"))

图 12.4: 对一打鸡蛋价格的预测,并将其限制在50至400之间。
这里没有进行偏差调整,因此预测值是预测分布的中位数。因为分位数在单调递增的变换过程中被保留,因此这些变换的预测区间具有与变换尺度相同的覆盖概率。
经过转换,预测区间在50以上。由于这种人为(和不现实的)约束,预测分布变得非常偏斜。