R語言 時間序列之ARIMA模型
阿新 • • 發佈:2019-01-08
自迴歸移動平均模型(arima)
ARMA模型是對不含季節變動的平穩序列進行建模。ARIMA模型的本質和ARMA是一樣的,只是ARIMA針對不平穩的序列進行建模的,將ARMA模型裡的序列值進行差分就可以。
定階以及引數說明acf值 | pcf值 | 模型 |
拖尾(逐漸為0) | p階截尾 | ARIMA(p,d,0) |
q階截尾 | 拖尾 | ARIMA(0,d,q) |
拖尾 | 拖尾 | ARIMA(p,d,q) |
以尼羅河資料為例子
plot(Nile)
abline(reg = lm(Nile ~ time(Nile)))
由時序圖可以知道,尼羅河資料有明顯遞減趨勢,故該序列不平穩。接著對尼羅河資料進行差分,forecast包中的ndiffs()可以幫助判斷差分幾次
ndiffs(Nile) Nile_diff <- diff(Nile, lag = 1) > ndiffs(Nile) # 差分次數 [1] 1 # 純隨機性檢驗 Box.test(Nile_diff, type = "Ljung-Box") > Box.test(Nile_diff, type = "Ljung-Box") # 顯然該序列是白噪聲序列,應該停止分析,但由於本人不想再找非白噪聲序列,還是用該序列來分析,在殘差分析中出現問題了 Box-Ljung test data: Nile_diff X-squared = 16.492, df = 1, p-value = 4.885e-05 par(mfrow = c(2, 2)) plot(Nile, main = '差分前') plot(Nile_diff, main = '差分後') abline(reg = lm(Nile_diff ~ time(Nile_diff))) acf(Nile_diff, main = '差分後acf') pacf(Nile_diff, main = '差分後pacf')
差分後的時序圖在均值為0附近波動,不隨時間的改變而改變,自相關圖顯示自相關係數在滯後1階後就快速的減為0,一階差分後該序列平穩,那麼該序列可以定階為ARIMA(0, 1, 1)
1. 定階
Nile.arima <- arima(Nile_diff, order = c(0,1,1),method = "ML")
Nile.pre <- forecast(Nile.arima, h = 10) # 預測
plot(Nile.pre)
2. 模型估計
模型引數檢驗包括兩個檢驗:引數的顯著性檢驗和殘差的正態性和無關性檢驗(調查預測誤差是否是平均值為零且方差為常數的正態分佈(服從零均值、方差不變的正態分佈))。Nile.arima <- arima(Nile_diff, order = c(0,1,1),method = "ML")
> Nile.arima
Call:
arima(x = Nile_diff, order = c(0, 1, 1), method = "ML")
Coefficients:
ma1
-1.0000
s.e. 0.0254
sigma^2 estimated as 28268: log likelihood = -643.58, aic = 1291.16
> -1.0000/0.0254
[1] -39.37008
係數除以標準差值為-39.37008絕對值遠遠大於1.96,則才序列的引數顯著2)殘差正態性
# 方法一qq圖
qqnorm(Nile.arima$residuals)
qqline(Nile.arima$residuals)
# 正態性檢驗法
shapiro.test(Nile.arima$residuals)
> shapiro.test(Nile.arima$residuals)
Shapiro-Wilk normality test
data: Nile.arima$residuals
W = 0.9902, p-value = 0.6876
不管是從qq還是w檢驗法都可以看出,殘差滿足正態性
3)無關性檢驗也稱為殘差的白噪聲檢驗,由前面白噪聲的定義可知,殘差(=估計值-真實值)應為不相關的序列。常用LB統計量來檢驗殘差。
> Box.test(Nile.arima$residuals, type = "Ljung-Box")
Box-Ljung test
data: Nile.arima$residuals
X-squared = 16.171, df = 1, p-value = 5.786e-05
LB檢驗可以知道,殘差不滿足無關性# Ps: p值大,說明為純隨機序列。p值小,非純隨機序列, par(mfrow = c(1, 2))
plot.ts(Nile.arima$residuals)
abline(reg = lm(Nile.arima$residuals ~ time(Nile.arima$residuals)))
acf(Nile.arima$residuals)
預測殘差是均值為0,異方差綜合以上,該模型應該優化