1. 程式人生 > >R語言 時間序列之ARIMA模型

R語言 時間序列之ARIMA模型

自迴歸移動平均模型(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. 模型估計

模型引數檢驗包括兩個檢驗:引數的顯著性檢驗和殘差的正態性和無關性檢驗(調查預測誤差是否是平均值為零且方差為常數的正態分佈(服從零均值、方差不變的正態分佈))。 
1)引數估計用估計出的係數除以其的標準差(se)得到的商與T統計量5%的臨界值(1.96)比較,商的絕對值大於1.96,則拒絕原假設,認為係數顯著的不為0,否則認為係數不顯著。係數不顯著的可以去掉,語法為arima(data,order,fixed=c(NA,0,NA…)),fixed為0的位置即為被去掉的引數的位置。
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,異方差綜合以上,該模型應該優化