时间序列分析:简单指数平滑
1. 朴素方法
使用 $X_{n+h}^{n}$ 表示使用时刻为 $n$ 的数据对 $n+h$ 时刻进行预测的预测值,则一种非常朴素的预测方法是直接使用 $n$ 时刻的值 $x_n$ 作为 $n + 1$ 时刻的预测值,即
\begin{equation}
x_{n+1}^n = x_n
\end{equation}
考虑季节性因素,对于周期为 $S$ 的序列,可以使用上一个周期的值进行预测,即
\begin{equation}
x_{n+1}^n = x_{n+1-S}
\end{equation}
另一种朴素的方法是使用历史的平均值进行预测,即
\begin{equation}
x_{n+1}^n = \frac{\sum\limits_{i=1}^n x_i}{n}
\end{equation}
2. 简单指数平滑
一般来说,一个时间序列在 $t$ 时刻的值与相邻时刻(如 $t-1$ )值的关系较密切,与较远时刻值的关系较弱。在进行预测时,考虑对历史进行加权,较近时刻权值较大,较远时刻权值较小,同时保证所有权值的和为 $1$。
对于 $0 < |\alpha| < 1$,由几何级数,有
\begin{equation}
\sum_{i=0}^\infty (1 – \alpha)^i = \frac{1}{\alpha}
\end{equation}
上式等号两边同乘以 $\alpha$,得
\begin{equation}
\alpha \sum_{i=0}^\infty (1 – \alpha)^i = \sum_{i=0}^\infty \alpha (1 – \alpha)^i = \alpha + \alpha(1-\alpha) + \alpha(1-\alpha)^2 + \cdots = 1
\end{equation}
故可以用 $\alpha (1 – \alpha)^i$ 作为权值对时间序列的历史值进行加权,来进行预测,此时得到预测值 $x_{n+1}$
\begin{equation}
x_{n+1}^n = \alpha x_n + \alpha(1-\alpha) x_{n-1} + \alpha(1-\alpha)^2 x_{n-2} + \cdots \tag{1}
\end{equation}
令 $n = n – 1$,有
\begin{equation}
x_{n}^{n-1} = \alpha x_{n-1} + \alpha(1-\alpha) x_{n-2} + \alpha(1-\alpha)^2 x_{n-3} + \cdots \tag{2}
\end{equation}
式 $(2)$ 等号两边同乘以 $(1-\alpha)$,得
\begin{equation}
(1-\alpha)x_{n}^{n-1} = \alpha(1-\alpha) x_{n-1} + \alpha(1-\alpha)^2 x_{n-2} + \alpha(1-\alpha)^3 x_{n-3} + \cdots \tag{3}
\end{equation}
注意到式 $(3)$ 等号右边的部分也出现在式 $(1)$ 中,此时式 $(1)$ 可以写成
\begin{equation}
x_{n+1}^n = \alpha x_n + (1-\alpha)x_{n}^{n-1} \tag{4}
\end{equation}
3. 一个例子
3.1. 查看数据
获取并绘制伦敦年降雨量数据和 ACF 如图 1、图 2 所示。
data <- scan("http://robjhyndman.com/tsdldata/hurst/precip1.dat", skip=1) data.ts <- ts(data, start=c(1813)) plot(data.ts) acf(data.ts)
由图 2 可见序列没有显著自相关。
绘制直方图和 Q-Q Plot 如图 3、图 4。
hist(data.ts) qqnorm(data.ts) qqline(data.ts)
可见降水量分布类似正态分布,QQ Plot 在两端有一些系统性偏差。
尝试使用 ARIMA 模型进行建模
library(forecast) auto.arima(data.ts)
输出结果为
Series: data.ts ARIMA(0,0,0) with non-zero mean Coefficients: mean 24.8239 s.e. 0.4193 sigma^2 estimated as 17.76: log likelihood=-285.25 AIC=574.49 AICc=574.61 BIC=579.7
可见得到的模型是一个 $24.8239$ 的常数。
3.2. 简单预测
使用如下代码进行下一年降水量的预测:
forcast.simple <- function(data, alpha) { values <- NULL values[1] <- data[1] for (i in 1:length(data)) { values[i+1] <- alpha * data[i] + (1 - alpha) * values[i] } return(values) } forecast.values <- forcast.simple(data, 0.2) tail(forecast.values, n=1)
输出为 25.3094062064236
。
上面直接使用 $\alpha = 0.2$。为了选择更好的 $\alpha$,以 SSE 为评价标准,尝试一系列的 $\alpha$ 值,找到预测 SSE 最小的 $\alpha$ 值:
sse <- NULL n <- length(data.ts) alphas <- seq( .001, .999, by=0.001) for (i in 1:length(alphas)) { forecast.values <- forecast.values <- forcast.simple(data, alphas[i]) sse[i] <- sum((data.ts[1:n] - forecast.values[1:n])^2) } plot(sse ~ alphas)
输出图像如图 5 所示:
可见得到最小 SSE 的 $\alpha$ 值较小,使用 alphas[which.min(sse)]
查看最佳 $\alpha$ 值为 0.024
。
3.3. 使用 HoltWinters 函数
除了像上面手动计算最佳 $\alpha$,也可以直接使用现成的函数拟合:
HoltWinters(data.ts, beta=FALSE, gamma=FALSE)
输出为
Holt-Winters exponential smoothing without trend and without seasonal component. Call: HoltWinters(x = data.ts, beta = FALSE, gamma = FALSE) Smoothing parameters: alpha: 0.02412151 beta : FALSE gamma: FALSE Coefficients: [,1] a 24.67819
这里得到的 $\alpha$ 为 0.02412151
,与前面的结果一致。