7.2 趋势法
霍尔特的线性趋势法
Holt (1957) 将简单指数平滑法扩展到可以预测具有趋势的数据。该方法包含一个预测方程和两个平滑方程(一个用于水平,一个用于趋势): \[\begin{align*} \text{Forecast equation}&& \hat{y}_{t+h|t} &= \ell_{t} + hb_{t} \\ \text{Level equation} && \ell_{t} &= \alpha y_{t} + (1 - \alpha)(\ell_{t-1} + b_{t-1})\\ \text{Trend equation} && b_{t} &= \beta^*(\ell_{t} - \ell_{t-1}) + (1 -\beta^*)b_{t-1}, \end{align*}\] 其中 \(\ell_t\) 表示在 \(t\) 时刻该时间序列的水平的估计值,\(b_t\) 表示该时间序列在 \(t\) 时刻的趋势(斜率)的估计,\(\alpha\) 是水平 \(0\le\alpha\le1\) 的平滑参数,\(\beta^*\) 是趋势 \(0\le\beta^*\le1\) 的平滑参数。(我们将其表示为 \(\beta^*\) 而不是 \(\beta\),其原因将在 7.5 节中进行解释。)
与简单的指数平滑一样,这里的水平方程表明 \(\ell_t\) 是观测值 \(y_t\) 和 \(t\) 时刻的向前一步训练预测值的加权平均值,这里由 \(\ell_{t-1} + b_{t-1}\) 给出。趋势方程表明,\(b_t\) 是基于 \(\ell_{t} - \ell_{t-1}\) 和前一个趋势的估计值 \(b_{t-1}\) 在 \(t\) 时刻的估计值的加权平均值。
这里的预测函数不再平坦,而是有趋势的。向前 \(h\) 步预测值等于上一次估计的水平值加上前一个估计的趋势值的 \(h\) 倍。因此,预测值是一个关于 \(h\) 的线性函数。
示例:航空乘客
<- window(ausair, start=1990)
air <- holt(air, h=5) fc
在表 7.3 中,我们展示了Holt方法在澳大利亚航空公司年度客运量中的应用。平滑参数 \(\alpha\) 和 \(\beta^*\) 以及初始值 \(\ell_0\) 和 \(b_0\) 通过最小化 7.1 节中的一步训练误差的SSE来估计。
年份 | 时间 | 观测值 | 水平 | 斜率 | 预测值 |
---|---|---|---|---|---|
\(t\) | \(y_t\) | \(\ell_t\) | \(b_t\) | \(\hat{y}_{t|t-1}\) | |
1989 | 0 | 15.57 | 2.102 | ||
1990 | 1 | 17.55 | 17.57 | 2.102 | 17.67 |
1991 | 2 | 21.86 | 21.49 | 2.102 | 19.68 |
1992 | 3 | 23.89 | 23.84 | 2.102 | 23.59 |
1993 | 4 | 26.93 | 26.76 | 2.102 | 25.94 |
1994 | 5 | 26.89 | 27.22 | 2.102 | 28.86 |
1995 | 6 | 28.83 | 28.92 | 2.102 | 29.33 |
1996 | 7 | 30.08 | 30.24 | 2.102 | 31.02 |
1997 | 8 | 30.95 | 31.19 | 2.102 | 32.34 |
1998 | 9 | 30.19 | 30.71 | 2.101 | 33.29 |
1999 | 10 | 31.58 | 31.79 | 2.101 | 32.81 |
2000 | 11 | 32.58 | 32.80 | 2.101 | 33.89 |
2001 | 12 | 33.48 | 33.72 | 2.101 | 34.90 |
2002 | 13 | 39.02 | 38.48 | 2.101 | 35.82 |
2003 | 14 | 41.39 | 41.25 | 2.101 | 40.58 |
2004 | 15 | 41.60 | 41.89 | 2.101 | 43.35 |
2005 | 16 | 44.66 | 44.54 | 2.101 | 44.00 |
2006 | 17 | 46.95 | 46.90 | 2.101 | 46.65 |
2007 | 18 | 48.73 | 48.78 | 2.101 | 49.00 |
2008 | 19 | 51.49 | 51.38 | 2.101 | 50.88 |
2009 | 20 | 50.03 | 50.61 | 2.101 | 53.49 |
2010 | 21 | 60.64 | 59.30 | 2.102 | 52.72 |
2011 | 22 | 63.36 | 63.03 | 2.102 | 61.40 |
2012 | 23 | 66.36 | 66.15 | 2.102 | 65.13 |
2013 | 24 | 68.20 | 68.21 | 2.102 | 68.25 |
2014 | 25 | 68.12 | 68.49 | 2.102 | 70.31 |
2015 | 26 | 69.78 | 69.92 | 2.102 | 70.60 |
2016 | 27 | 72.60 | 72.50 | 2.102 | 72.02 |
\(h\) | \(\hat{y}_{t+h|t}\) | ||||
1 | 74.60 | ||||
2 | 76.70 | ||||
3 | 78.80 | ||||
4 | 80.91 | ||||
5 | 83.01 |
\(\beta^*\) 取值非常小意味着斜率几乎不随时间变化。
阻尼趋势方法
Holt线性方法产生的预测值可以显示出未来的趋势(增加或减少)。经验表明,这些方法通常会产生过度预测,尤其是对于更长远的预测而言。受此启发,Gardner & McKenzie (1985) 引入了一个参数,可以在未来某些时刻“平缓”趋势。包含平缓趋势的方法已被证明是十分成功的,并且可以说是当许多时间系列需要自动预测时最受欢迎的方法。
除了平滑参数 \(\alpha\) 和 \(\beta^*\) (在Holt方法中,取值介于0和1之间),该方法还包含一个阻尼参数 \(0<phi<1\): \[\begin{align*} \hat{y}_{t+h|t} &= \ell_{t} + (\phi+\phi^2 + \dots + \phi^{h})b_{t} \\ \ell_{t} &= \alpha y_{t} + (1 - \alpha)(\ell_{t-1} + \phi b_{t-1})\\ b_{t} &= \beta^*(\ell_{t} - \ell_{t-1}) + (1 -\beta^*)\phi b_{t-1}。 \end{align*}\] 如果 \(\phi=1\),则该方法与Holt线性方法相同。对于 \(0\) 和 \(1\) 之间的取值, \(\phi\) 平缓了趋势,使其在将来某个时间接近一个常数。事实上,对于任意 \(0<\phi<1\) ,随着 \(h\rightarrow\infty\),预测值收敛到 \(\ell_T+\phi b_T/(1-\phi)\)。这意味着短期预测值有一定的趋势,而长期预测值则保持不变。
实际上,\(\phi\) 很少小于0.8,因为阻尼对于较小的值具有非常强的影响。\(\phi\) 的值接近1意味着包含阻尼系数的模型无法与不包含阻尼系数的模型区分开来。由于这些原因,我们通常限定 \(\phi\) 的最小值为0.8,最大值为0.98。
示例:航空乘客(续)
图 7.3 显示了由Holt的线性趋势法和衰减趋势法生成的2017-2031年的预测。
<- holt(air, h=15)
fc <- holt(air, damped=TRUE, phi = 0.9, h=15)
fc2 autoplot(air) +
autolayer(fc$mean, series="Holt's method") +
autolayer(fc2$mean, series="Damped Holt's method") +
ggtitle("Holt方法预测") +
xlab("年份") + ylab("澳大利亚航空旅客(百万)") +
guides(colour=guide_legend(title="预测"))+
theme(text = element_text(family = "STHeiti"))+
theme(plot.title = element_text(hjust = 0.5))

图 7.3: 预测在澳大利亚注册的航空公司年乘客总数(单位:百万)。对于阻尼趋势法,\(\phi=0.90\).
我们将阻尼参数设置为相对较低的数值 \((\phi=0.90)\),以夸大阻尼的影响来进行比较。通常,我们会和其他参数一起估计 \(\phi\)。我们还使用了相当大的预测范围(\(h=15\))来突出显示阻尼趋势与线性趋势之间的差异。在实践中,我们通常不会希望仅用27年的数据预测这么多年。
例子:亚洲绵羊
在这个例子中,我们比较了迄今为止我们在预测亚洲绵羊牲畜种群时所使用的三种指数平滑方法的预测性能。该数据跨越1970–2007年的时间段,如图 7.4 所示。
autoplot(livestock) +
xlab("年份") + ylab("亚洲绵羊牲畜量(百万)")+
theme(text = element_text(family = "STHeiti"))+
theme(plot.title = element_text(hjust = 0.5))

图 7.4: 年度亚洲绵羊牲畜数量(百万头)
我们将使用时间序列交叉验证来比较三种方法的一步预测精度。
<- tsCV(livestock, ses, h=1)
e1 <- tsCV(livestock, holt, h=1)
e2 <- tsCV(livestock, holt, damped=TRUE, h=1)
e3 # 比较MSE:
mean(e1^2, na.rm=TRUE)
#> [1] 178.3
mean(e2^2, na.rm=TRUE)
#> [1] 173.4
mean(e3^2, na.rm=TRUE)
#> [1] 162.6
# 比较MAE:
mean(abs(e1), na.rm=TRUE)
#> [1] 8.532
mean(abs(e2), na.rm=TRUE)
#> [1] 8.803
mean(abs(e3), na.rm=TRUE)
#> [1] 8.024
无论你比较MAE还是MSE值,阻尼Holt方法都是最好的。所以我们将继续使用该方法并将其应用于整个数据集以获取未来几年的预测。
<- holt(livestock, damped=TRUE)
fc # 估计参数:
"model"]]
fc[[#> Damped Holt's method
#>
#> Call:
#> holt(y = livestock, damped = TRUE)
#>
#> Smoothing parameters:
#> alpha = 0.9999
#> beta = 3e-04
#> phi = 0.9798
#>
#> Initial states:
#> l = 223.35
#> b = 6.9046
#>
#> sigma: 12.84
#>
#> AIC AICc BIC
#> 427.6 429.7 438.7
若平滑参数法斜率的估计值基本为零,表明趋势不随时间变化。若 \(\alpha\) 的值非常接近1,则表明该水平对每个新的观察值都有很强的影响。
autoplot(fc) +
xlab("年份") + ylab("亚洲绵羊牲畜量(百万)")+
ggtitle('基于阻尼Holt方法的预测') +
theme(text = element_text(family = "STHeiti"))+
theme(plot.title = element_text(hjust = 0.5))

图 7.5: 亚洲绵羊的预测:比较非季节性方法的预测表现。
由此产生的预测看起来十分合理,趋势逐渐增大,而且预测区间相对较大,反映了历史数据的变化。预测区间是使用 7.5 节中所描述的方法计算出来的。
在这个例子中,选择方法的过程相对容易,因为通过比较MSE和MAE都选择了相同的方法(阻尼Holt方法)。但是,有时不同的度量精度会选择不同的预测方法,然后需要决定我们更喜欢使用哪种预测方法。由于预测任务可能因多种因素(预测范围的长度,测试集的大小,预测误差的度量,数据频率等)而异,因此对于所有预测方案而言,不可能有一种方法比其他所有方法表现都好。我们对预测方法的要求始终是合理的预测,这通常应该根据手头的任务进行评估。