Processing math: 100%

时间序列分析:简单指数平滑

1. 朴素方法

  使用 Xnn+h 表示使用时刻为 n 的数据对 n+h 时刻进行预测的预测值,则一种非常朴素的预测方法是直接使用 n 时刻的值 xn 作为 n+1 时刻的预测值,即

xnn+1=xn

考虑季节性因素,对于周期为 S 的序列,可以使用上一个周期的值进行预测,即

xnn+1=xn+1S

  另一种朴素的方法是使用历史的平均值进行预测,即

xnn+1=ni=1xin

2. 简单指数平滑

  一般来说,一个时间序列在 t 时刻的值与相邻时刻(如 t1 )值的关系较密切,与较远时刻值的关系较弱。在进行预测时,考虑对历史进行加权,较近时刻权值较大,较远时刻权值较小,同时保证所有权值的和为 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α)xn1+α(1α)2xn2+

n=n1,有

xn1n=αxn1+α(1α)xn2+α(1α)2xn3+

(2) 等号两边同乘以 (1α),得

(1α)xn1n=α(1α)xn1+α(1α)2xn2+α(1α)3xn3+

注意到式 (3) 等号右边的部分也出现在式 (1) 中,此时式 (1) 可以写成

xnn+1=αxn+(1α)xn1n

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)
data <- scan("http://robjhyndman.com/tsdldata/hurst/precip1.dat", skip=1) data.ts <- ts(data, start=c(1813)) plot(data.ts) acf(data.ts)
data <- scan("http://robjhyndman.com/tsdldata/hurst/precip1.dat", skip=1)
data.ts <- ts(data, start=c(1813))
plot(data.ts)
acf(data.ts)

图 1

图 2

由图 2 可见序列没有显著自相关。

  绘制直方图和 Q-Q Plot 如图 3、图 4。

hist(data.ts)
qqnorm(data.ts)
qqline(data.ts)
hist(data.ts) qqnorm(data.ts) qqline(data.ts)
hist(data.ts)

qqnorm(data.ts)
qqline(data.ts)

图 3

图 4

可见降水量分布类似正态分布,QQ Plot 在两端有一些系统性偏差。

  尝试使用 ARIMA 模型进行建模

library(forecast)
auto.arima(data.ts)
library(forecast) auto.arima(data.ts)
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
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
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)
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)
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)
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)
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 所示:

图 5

可见得到最小 SSE 的 α 值较小,使用 alphas[which.min(sse)] 查看最佳 α 值为 0.024

3.3. 使用 HoltWinters 函数

  除了像上面手动计算最佳 α,也可以直接使用现成的函数拟合:

HoltWinters(data.ts, beta=FALSE, gamma=FALSE)
HoltWinters(data.ts, beta=FALSE, gamma=FALSE)
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
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
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,与前面的结果一致。