ARIMA模型
自回歸移動平均模型(ARIMA)包含一個確定(explicit)的統計模型用于處理時間序列的不規則部分,它允許不規則部分可以自相關。
數據準備
> library(zoo)
> library(xts)
> library(TTR)
> kings <- scan("http://robjhyndman.com/tsdldata/misc/kings.dat",skip=3)
Read 42 items
> kingstimeseries <- ts(kings)
> plot.ts(kingstimeseries)
數據差分
如果從一個非平穩的時間序列開始, 那么首先就需要做時間序列差分直到得到一個平穩時間序列。如果必須對時間序列做 d 階差分才能得到一個平穩序列,那么就使用 ARIMA(p,d,q) 模型,其中 d 是差分的階數。
> kingstimeseriesdiff1 <- diff(kingstimeseries, differences=1)
> plot.ts(kingstimeseriesdiff1)
從一階差分的圖中可以看出,數據已經是平穩的。如果不平穩就需要繼續差分。所以對于英國國王去世年齡時間序列選擇 ARIMA(p,1,q) 的模型。
尋找 ARIMA 模型
通常我們需要檢查平穩時間序列的自相關圖和偏相關圖,也就是尋找 ARIMA(p,d,q) 中合適的 p 值和 q 值。
> acf(kingstimeseriesdiff1, lag.max=20)
> acf(kingstimeseriesdiff1, lag.max=20, plot=F)
Autocorrelations of series ‘kingstimeseriesdiff1’, by lag
0 1 2 3 4 5 6 7 8 9 10
1.000 -0.360 -0.162 -0.050 0.227 -0.042 -0.181 0.095 0.064 -0.116 -0.071
11 12 13 14 15 16 17 18 19 20
0.206 -0.017 -0.212 0.130 0.114 -0.009 -0.192 0.072 0.113 -0.093
可以看出在滯后 1 階的自相關值超出了置信邊界,但是其他所有在滯后1-20 階的自相關值都沒有超出置信邊界。
> pacf(kingstimeseriesdiff1, lag.max=20)
> pacf(kingstimeseriesdiff1, lag.max=20, plot=F)
Partial autocorrelations of series ‘kingstimeseriesdiff1’, by lag
1 2 3 4 5 6 7 8 9 10 11
-0.360 -0.335 -0.321 0.005 0.025 -0.144 -0.022 -0.007 -0.143 -0.167 0.065
12 13 14 15 16 17 18 19 20
0.034 -0.161 0.036 0.066 0.081 -0.005 -0.027 -0.006 -0.037
顯示在滯后 1,2 和 3 階時的偏自相關系數超出了置信邊界,為負值,且在等級上隨著滯后階數的增加而緩慢減少。
> library(forecast)
> kings.arima <- arima(kingstimeseries, order=c(1, 2, 3))
> summary(kings, arima)
Min. 1st Qu. Median Mean 3rd Qu. Max.
13.00 44.00 56.00 55.29 67.75 86.00
模型預測
> kingsarimaforecast <- forecast(kings.arima, h=5)
> kingsarimaforecast
Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
43 66.86843 47.05546 86.68139 36.56711 97.16974
44 69.46189 48.05746 90.86632 36.72664 102.19714
45 69.33508 47.11732 91.55285 35.35594 103.31423
46 69.79963 46.62460 92.97466 34.35648 105.24278
47 70.13562 46.03435 94.23689 33.27591 106.99533
> plot(kingsarimaforecast)
模型誤差檢驗
在指數平滑模型下, 觀察 ARIMA 模型的預測誤差是否服從零均值、方差不變的正態分布,同時也可以觀察連續預測誤差是否(自)相關。 同時對國王去世年齡使用 ARIMA(1,1,3) 模型后所產生的預測誤差做(自)相關圖,和 Ljung-Box 檢驗
acf(kingsarimaforecast$residuals, lag.max=20)
> Box.test(kingsarimaforecast$residuals, lag=20, type="Ljung-Box")
Box-Ljung test
data: kingsarimaforecast$residuals
X-squared = 10.141, df = 20, p-value = 0.9655
ARIMA 模型自動預測
> kings.arima1 <- auto.arima(kingstimeseries)
> summary(kings.arima1)
Series: kingstimeseries
ARIMA(0,1,1)
Coefficients:
ma1
-0.7218
s.e. 0.1208
sigma^2 estimated as 236.2: log likelihood=-170.06
AIC=344.13 AICc=344.44 BIC=347.56
Training set error measures:
ME RMSE MAE MPE MAPE MASE ACF1
Training set 0.9712931 14.99836 11.92162 -10.40664 29.5176 0.7496724 0.05350284
> kings.arima_new <- arima(kingstimeseries, order=c(0, 1, 1))
> summary(kings.arima_new)
Call:
arima(x = kingstimeseries, order = c(0, 1, 1))
Coefficients:
ma1
-0.7218
s.e. 0.1208
sigma^2 estimated as 230.4: log likelihood = -170.06, aic = 344.13
Training set error measures:
ME RMSE MAE MPE MAPE MASE ACF1
Training set 0.9712931 14.99836 11.92162 -10.40664 29.5176 0.7496724 0.05350284
> kingsarimaforecast <- forecast(kings.arima_new, h=5)
> kingsarimaforecast
Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
43 67.75063 48.29647 87.20479 37.99806 97.50319
44 67.75063 47.55748 87.94377 36.86788 98.63338
45 67.75063 46.84460 88.65665 35.77762 99.72363
46 67.75063 46.15524 89.34601 34.72333 100.77792
47 67.75063 45.48722 90.01404 33.70168 101.79958
> plot(kingsarimaforecast)
> acf(kingsarimaforecast$residuals, lag.max=20)
> Box.test(kingsarimaforecast$residuals, lag=20, type="Ljung-Box")
Box-Ljung test
data: kingsarimaforecast$residuals
X-squared = 13.584, df = 20, p-value = 0.8509
指數平滑模型
它對時間序列上面連續的值之間相關性沒有要求,指數平滑法可以用于時間序列數據的短期預測。
簡單指數平滑法
適用于沒有季節性變化且處于恒定水平以及沒有明顯趨勢的時間序列的預測。
獲取數據(數據來源為倫敦每年降雨量),通過 ts 函數轉換為時間序列.。
> rain <- scan("http://robjhyndman.com/tsdldata/hurst/precip1.dat", skip=1)
Read 100 items
> rainseries <- ts(rain, start=c(1813))
> plot.ts(rainseries)
> rainseriesHW <- HoltWinters(rainseries, beta=F, gamma=F)
> plot(rainseriesHW)
預測未來 5 年的降水量
> library(forecast)
> rainseriesforecasts <- forecast(rainseriesHW, h=5)
> plot(rainseriesforecasts)
藍線是預測 1913-1920 間的降雨量,深灰色陰影區域為 80% 的預測區間,淺灰色陰影區域為 95% 的預測區間。 forecast 提供了預測誤差的統計指標(residuals),來評估預測是否有改進的可能性:如果預測誤差是相關的,則很可能是簡單指數平滑預測可以被另外一種預測技術優化。
> acf(rainseriesforecasts$residuals[!is.na(rainseriesforecasts$residuals)], lag.max=20, plot=T)
可以發現自相關系數在第 3 期的時候達到了置信界限。為了驗證在滯后 1-20 階時非 0 自相關屬性是否顯著,可以借助 Box.test() 的 Ljung-Box檢驗。
> Box.test(rainseriesforecasts$residuals, lag=20, type="Ljung-Box")
Box-Ljung test
data: rainseriesforecasts$residuals
X-squared = 17.401, df = 20, p-value = 0.6268
統計量為 17.4,并且 P 值是 0.626 這樣的值不足以拒絕預測誤差在 1-20 階是非零自相關。
霍爾特指數平滑法
霍爾特指數平滑法可以用于非恒定水平,沒有季節性可相加模型的時間序列預測。 霍爾特指數平滑法是估計當前時間的水平和斜率。其平滑水平是由兩個參數控制,alpha:估計當前點水平,beta:估計當前點趨勢部分斜率。兩個參數都介于 0-1 之間,當參數越接近 0,大部分近期的觀測值的權值將較小。 數據來源是 1866 年到 1911 年每年女士裙子直徑,將數據通過 ts 函數轉換為時間序列,并畫出時序圖。
> skirts <- scan("http://robjhyndman.com/tsdldata/roberts/skirts.dat",skip=5)
Read 46 items
> skirtsseries <- ts(skirts, start=c(1866))
> plot.ts(skirtsseries)
> skirtsseriesHW <- HoltWinters(skirtsseries, gamma=F)
> skirtsseriesHW
Holt-Winters exponential smoothing with trend and without seasonal component.
Call:
HoltWinters(x = skirtsseries, gamma = F)
Smoothing parameters:
alpha: 0.8383481
beta : 1
gamma: FALSE
Coefficients:
[,1]
a 529.308585
b 5.690464
> plot(skirtsseriesHW)
相關預測值中 alpha 值為 0.8383,beta預測值為 1.0,這些都是非常高的值,充分顯示了無論是水平上還是趨勢的斜率上,當前值對時間序列上的最近的觀測值的依賴關系比較重,這樣的結果也符合我們的預期,因為時間序列的水平和斜率在整個時間段內發生了巨大的變化。 總體來看,預測的效果也還不錯(紅色為預測值)。
預測未來 5 年的數據值,并畫出預測結果。
> skirtsseriesforecasts <- forecast(skirtsseriesHW, h=5)
> plot(skirtsseriesforecasts)
為了檢驗預測效果,我們同樣檢驗延遲 1-20 階中的預測誤差是否非零自相關,繼續采用 Ljung-Box 檢驗。
> acf(skirtsseriesforecasts$residuals[!is.na(skirtsseriesforecasts$residuals)], lag.max=20, plot=T)
相關圖呈現樣本內預測誤差在滯后 5 階時超過置信邊界,其他都沒有超過,我們認為存在一定的偶爾因素。
> Box.test(skirtsseriesforecasts$residuals, lag=20, type="Ljung-Box")
Box-Ljung test
data: skirtsseriesforecasts$residuals
X-squared = 19.731, df = 20, p-value = 0.4749
p =0.4749,意味著置信度只有 53% 這樣的值不足以拒絕預測誤差在 1-20 階是非零自相關,則我們接受預測誤差在 1-20 階是非零自相關的。
Holt-Winters 指數平滑法
有增長或者降低趨勢并且存在季節性波動的時間序列的預測方法。 Holt-Winters 算法中提供了 alpha、beta 和 gamma 來分別對應當前點的水平、趨勢部分和季節部分,參數的去執法范圍都是 0-1 之間,并且參數接近 0 時,近期的觀測值的影響權重就越小。 數據來源是澳大利亞昆士蘭州海濱紀念商品的月度銷售日子做為分析對象,將數據通過 ts 函數轉換為時間序列,并畫出時序圖。
> souvenir <- scan("http://robjhyndman.com/tsdldata/data/fancy.dat")
Read 84 items
> souvenirtimeseries <- ts(souvenir, frequency=12, start=c(1987, 1))
> plot.ts(souvenirtimeseries)
可以通過取對數來減少極值帶來的影響,消除方差不齊。
> logsouvenirtimeseries <- log(souvenirtimeseries)
> plot.ts(logsouvenirtimeseries)
> souvenirtimeseriesHW <- HoltWinters(logsouvenirtimeseries)
> plot(souvenirtimeseriesHW)
通過 forecast 包來預測未來 12 個月的銷售數據,并畫出預測結果
> souvenirtimeseriesforecasts <- forecast(souvenirtimeseriesHW, h=12)
> plot(souvenirtimeseriesforecasts)
模型非常成功得預測了季節峰值,峰值大約發生在每年的 12 月份。 還可以通過畫相關圖和進行 Ljung-Box 檢驗來檢查樣本內預測誤差在延遲 1-20 階時否是非零自相關的,并以此確定預測模型是否可以再被優化。
> acf(souvenirtimeseriesforecasts$residuals[!is.na(souvenirtimeseriesforecasts$residuals)], lag.max=20, plot=T)
相關圖顯示出在滯后 1-20 階中樣本自相關值都沒有超出顯著(置信)邊界。
> Box.test(souvenirtimeseriesforecasts$residuals, lag=20, type="Ljung-Box")
Box-Ljung test
data: souvenirtimeseriesforecasts$residuals
X-squared = 17.53, df = 20, p-value = 0.6183
Ljung-Box 檢驗的 p 值為 0.6183,所以我們推斷在滯后 1-20 階中沒有明顯證據說明預測誤差是非零自相關的。