R语言与数据分析之八:时间序列--霍尔特指数平滑法

时间:2023-08-08 21:27:08

上篇我和小伙伴们分享了简单指数平滑法,简单指数平滑法仅仅能预測那些处于恒定水平和没有季节变动的时间序列,今天和大家分享非恒定水平即有增长或者减少趋势的。没有季节性可相加模型的时间序列预測算法---霍尔特指数平滑法(Holt)。

Holt 指数平滑法预计当前时间的水平和斜率。其平滑水平是由两个參数控制。alpha:预计当前点水平。beta:预计当前点趋势部分斜率。两个參数都介于0-1之间。当參数越接近0,大部分最近的观測值的权值将较小。

我们以1866年到1911年每年女士裙子直径为案例,我们首先录入数据并绘制出该序列:

skirts <- scan("http://robjhyndman.com/tsdldata/roberts/skirts.dat",skip=5)
skirtsseries <- ts(skirts,start=c(1866))
plot.ts(skirtsseries)

R语言与数据分析之八:时间序列--霍尔特指数平滑法

观察上图可见该序列从1866年的600涨到了1880年的1050,后面又下降到1911年的520。再次使用R中的HoltWinters()进行霍尔特指数平滑预測(gamma=FALSE),并绘出预測和观測值的曲线图。来观看预測结果

skirtsseriesforecasts <- HoltWinters(skirtsseries, gamma=FALSE)
plot(skirtsseriesforecasts)

R语言与数据分析之八:时间序列--霍尔特指数平滑法

整体看来,预測的效果还不错(黑色为原始序列,红色为预測值)。虽然他们对观測值有一点点延迟。相同我们也能够通过变量skirtsseriesforecasts$SSE查看样本内误差平方和

R语言与数据分析之八:时间序列--霍尔特指数平滑法

相关预測值如上图,alpha值为0.84;beta预測值为1.0。这些都是很高的值。充分显示了不管是水平上还是趋势的斜率上,当前值对时间序列上的近期的观測值的依赖关系比較重,这种结果也符合我们的预期,由于时间序列的水平和斜率在整个时间段内发生了巨大的变化。此外我们能够通过HoltWinters()函数中的“l.start”和“b.start”的參数指定水平和趋势的初始值。常见的设定水平初始值为时间序列的第一个值(608),斜率的初始值则是其第二个值减去第一个值(9),则设定例如以下:

HoltWinters(skirtsseries, gamma=FALSE, l.start=608, b.start=9)

相同採用forecast包预測未来时间节点的值,如果我们预測未来19期的数据。详细实现和结果展演示样例如以下:

library("forecast")
skirtsseriesforecasts2 <- forecast.HoltWinters(skirtsseriesforecasts, h=19)
plot.forecast(skirtsseriesforecasts2)

R语言与数据分析之八:时间序列--霍尔特指数平滑法

上图中预測部分使用蓝色的线条标识出来,深灰色的阴影区域为80%。浅灰色阴影区为95%的预測区间。

为了检验预測效果。我们相同检验延迟1-20阶中的预測误差是否非零自相关。相同继续採用Ljung-Box检验:

acf(skirtsseriesforecasts2$residuals, lag.max=20)
Box.test(skirtsseriesforecasts2$residuals, lag=20, type="Ljung-Box")

R语言与数据分析之八:时间序列--霍尔特指数平滑法

相关图呈现样本内预測误差在滞后5阶时超过置信边界,其它都为超过,我们觉得存在一定的偶尔因素。

R语言与数据分析之八:时间序列--霍尔特指数平滑法

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaG93YXJkZ2U=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

Ljung-Box检验时,p =0.4749,意味着置信度仅仅有53%这种值不足以拒绝“预測误差在1-20阶是非零自相关,则我们接受预測误差在1-20阶是非零自相关的。

相同我们验证測试误差是否符合零均值正态分布,我们画出时间预測误差图和一个附上正态曲线预測误差分布的直方图(这部分借用上次咱自己写的plotForecastErrors函数):

plot.ts(skirtsseriesforecasts2$residuals)
source("plotForecastErrors.R")
plotForecastErrors(skirtsseriesforecasts2$residuals)

R语言与数据分析之八:时间序列--霍尔特指数平滑法

可见预測误差在整个时间段内是方差大致不变的。

R语言与数据分析之八:时间序列--霍尔特指数平滑法

由预測误差直方图可见预測误差是零均值的正态分布。