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"))
对一打鸡蛋的价格的预测,并用 Box-Cox 变换施加正约束。

图 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
    a <- 50
    b <- 400
    # Transform data and fit model
    fit <- log((eggs-a)/(b-eggs)) %>%
      ets(model="AAN", damped=FALSE)
    fc <- forecast(fit, h=50)
    # Back-transform forecasts
    fc[["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
    # Plot result on original scale
    autoplot(fc) +
      xlab("时间") +
      theme(text = element_text(family = "STHeiti"))
对一打鸡蛋价格的预测,并将其限制在50至400之间。

图 12.4: 对一打鸡蛋价格的预测,并将其限制在50至400之间。

这里没有进行偏差调整,因此预测值是预测分布的中位数。因为分位数在单调递增的变换过程中被保留,因此这些变换的预测区间具有与变换尺度相同的覆盖概率。

经过转换,预测区间在50以上。由于这种人为(和不现实的)约束,预测分布变得非常偏斜。