时间序列分析:简单指数平滑
Contents [show]
1. 朴素方法
使用 Xnn+h 表示使用时刻为 n 的数据对 n+h 时刻进行预测的预测值,则一种非常朴素的预测方法是直接使用 n 时刻的值 xn 作为 n+1 时刻的预测值,即
xnn+1=xn
考虑季节性因素,对于周期为 S 的序列,可以使用上一个周期的值进行预测,即
xnn+1=xn+1−S
另一种朴素的方法是使用历史的平均值进行预测,即
xnn+1=n∑i=1xin
2. 简单指数平滑
一般来说,一个时间序列在 t 时刻的值与相邻时刻(如 t−1 )值的关系较密切,与较远时刻值的关系较弱。在进行预测时,考虑对历史进行加权,较近时刻权值较大,较远时刻权值较小,同时保证所有权值的和为 1。
对于 0<|α|<1,由几何级数,有
∞∑i=0(1–α)i=1α
上式等号两边同乘以 α,得
α∞∑i=0(1–α)i=∞∑i=0α(1–α)i=α+α(1−α)+α(1−α)2+⋯=1
故可以用 α(1–α)i 作为权值对时间序列的历史值进行加权,来进行预测,此时得到预测值 xn+1
xnn+1=αxn+α(1−α)xn−1+α(1−α)2xn−2+⋯
令 n=n–1,有
xn−1n=αxn−1+α(1−α)xn−2+α(1−α)2xn−3+⋯
式 (2) 等号两边同乘以 (1−α),得
(1−α)xn−1n=α(1−α)xn−1+α(1−α)2xn−2+α(1−α)3xn−3+⋯
注意到式 (3) 等号右边的部分也出现在式 (1) 中,此时式 (1) 可以写成
xnn+1=αxn+(1−α)xn−1n
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
。
上面直接使用 α=0.2。为了选择更好的 α,以 SSE 为评价标准,尝试一系列的 α 值,找到预测 SSE 最小的 α 值:
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 的 α 值较小,使用 alphas[which.min(sse)]
查看最佳 α 值为 0.024
。
3.3. 使用 HoltWinters 函数
除了像上面手动计算最佳 α,也可以直接使用现成的函数拟合:
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
这里得到的 α 为 0.02412151
,与前面的结果一致。