ARIMA--R實現


第一步.對原始數據進行分析

一.ARIMA預測時間序列

指數平滑法對於預測來說是非常有幫助的,而且它對時間序列上面連續的值之間相關性沒有要求。但是,如果你想使用指數平滑法計算出預測區間,那麼預測誤差必須是不相關的, 而且必須是服從零均值、 方差不變的正態分佈。即使指數平滑法對時間序列連續數值之間相關性沒有要求,在某種情況下,我們可以通過考慮數據之間的相關性來創建更好的預測模型。自迴歸移動平均模型( ARIMA) 包含一個確定(explicit)的統計模型用於處理時間序列的不規則部分,它也允許不規則部分可以自相關。

 

二.確定數據的差分

ARIMA 模型爲平穩時間序列定義的。 因此, 如果你從一個非平穩的時間序列開始,首先你就需要做時間序列差分直到你得到一個平穩時間序列。如果你必須對時間序列做 d 階差分才能得到一個平穩序列,那麼你就使用ARIMA(p,d,q)模型,其中 d 是差分的階數。 

我們以每年女人裙子邊緣的直徑做成的時間序列數據爲例。從 1866 年到 1911 年在平均值上是不平穩的。 隨着時間增加, 數值變化很大。  

下面是.dat數據:

 

下面進入預測。先導入數據:

> skirts <- scan("http://robjhyndman.com/tsdldata/roberts/skirts.dat",skip=5)      #導入在線數據,並跳過前5行

Read 46 items     #R控制檯顯示內容,表示共讀取46行數據

> skirts<- ts(skirts,start = c(1866))   #設定時間1866開始

> plot.ts(skirts)       #畫出圖

 

我們可以通過鍵入下面的代碼來得到時間序列(數據存於“skirtsts”) 的一階差分, 並畫出差分序列的圖:

> skirtsdiff<-diff(skirts,differences=1)    #一階差分

> plot.ts(skirtsdiff)    #畫圖

 

 

從一階差分的圖中可以看出,數據仍是不平穩的。我們繼續差分。

> skirtsdiff2<-diff(skirts,differences=2)

> plot.ts(skirtsdiff2)

 

二次差分(上面)後的時間序列在均值和方差上確實看起來像是平穩的, 隨着時間推移,時間序列的水平和方差大致保持不變。因此,看起來我們需要對裙子直徑進行兩次差分以得到平穩序列。

第二步,找到合適的ARIMA模型

 如果你的時間序列是平穩的,或者你通過做 n 次差分轉化爲一個平穩時間序列, 接下來就是要選擇合適的 ARIMA模型,這意味着需要尋找 ARIMA(p,d,q)中合適的 p 值和 q 值。爲了得到這些,通常需要檢查[平穩時間序列的(自)相關圖和偏相關圖。 

 我們使用 R 中的“acf()”和“pacf” 函數來分別(自) 相關圖和偏相關圖。“acf()”和“pacf 設定“plot=FALSE” 來得到自相關和偏相關的真實值。 

> acf(skirtsdiff2,lag.max=20)

> acf(skirtsdiff2,lag.max=20,plot=FALSE)

 

Autocorrelations of series ‘skirtsdiff2’, by lag

0 1 2 3 4 5 6 7 8 9 10 11 12 
1.000 -0.303 0.096 0.009 0.102 -0.453 0.173 -0.025 -0.039 0.073 -0.094 0.133 -0.089 
13 14 15 16 17 18 19 20 
-0.027 -0.102 0.207 -0.260 0.114 0.101 0.011 -0.090

 

 

自相關圖顯示滯後1階自相關值基本沒有超過邊界值,雖然5階自相關值超出邊界,那麼很可能屬於偶然出現的,而自相關值在其他上都沒有超出顯著邊界,而且我們可以期望 1 到 20 之間的會偶爾超出 95%的置信邊界。  

> pacf(skirtsdiff2,lag.max=20)

> pacf(skirtsdiff2,lag.max=20,plot=FALSE)

 

Partial autocorrelations of series ‘skirtsdiff2’, by lag

1 2 3 4 5 6 7 8 9 10 11 12 13 
-0.303 0.005 0.043 0.128 -0.439 -0.110 0.073 0.028 0.128 -0.355 0.095 0.052 -0.094 
14 15 16 17 18 19 20 
-0.103 -0.034 -0.021 -0.002 0.074 0.020 -0.034

 

偏自相關值選5階。

故我們的ARMIA模型爲armia(1,2,5)

> skirtsarima<-arima(skirts,order=c(1,2,5))

> skirtsarima

 

Call:
arima(x = skirts, order = c(1, 2, 5))

SSeries: skirts

ARIMA(1,2,5) 

Coefficients:
ar1 ma1 ma2 ma3 ma4 ma5
-0.4345 0.2762 0.1033 0.1472 0.0267 -0.8384
s.e. 0.1837 0.2171 0.2198 0.2716 0.1904 0.2888

sigma^2 estimated as 206.1: log likelihood = -183.8, aic = 381.6

 所以,相應的評價標準的值:

sigma^2 estimated as 206.1:  log likelihood=-183.8

AIC=381.6   AICc=384.71   BIC=394.09

預測後5年裙子的邊緣直徑

>  skirtsarimaforecast<-forecast(skirtsarima,h=5,level=c(99.5))

>  skirtsarimaforecast

 

  R控制檯的輸出爲:  

          Point Forecast Lo 99.5 Hi 99.5

1912    548.5762  507.1167  590.0357
1913    545.1793  459.3292  631.0295
1914    540.9354  396.3768  685.4940
1915    531.8838  316.2785  747.4892
1916    529.1296  233.2625  824.9968

輸入下面指令,得到殘差圖像:

> plot.forecast(skirtsarimaforecast$residuals)  

R學習日記——時間序列分析之ARIMA模型預測

第三步,檢驗

在指數平滑模型下, 觀察 ARIMA 模型的預測誤差是否是平均值爲 0 且方差爲常數的正態分佈(服從零均值、方差不變的正態分佈) 是個好主意,同時也要觀察連續預測誤差是否(自)相關。  

> acf(skirtsarimaforecast$residuals,lag.max=20)

輸入下面指令:

> Box.test(skirtsarimaforecast$residuals, lag=20, type="Ljung-Box")

R控制檯輸出:   

     Box-Ljung test

data: skirtsarimaforecast$residuals
X-squared = 8.5974, df = 20, p-value = 0.9871

既然相 關圖顯示出在滯後1 - 20階( lags 1 - 20 )中樣本自相關值都沒有超出顯著(置信)邊界,而且Ljung-Box檢驗的p值爲0.99,所以我們推斷在滯後1-20階(lags1-20)中沒明顯證據說明預測 誤差是非零自相關的。 

爲了調查預測誤差是否是平均值爲零且方差爲常數的正態分佈(服從零均值、方差不變的正態分布),我們可以做預測誤差的時間曲線圖和直方圖(具有正態分佈曲線)

> plot.ts(skirtsarimaforecast$residuals)

下面我參考了這裏http://blog.csdn.net/howardge/article/details/42002733,不過還是沒成功

爲了更具體的展現,我們需要藉助少量的代碼,首先構建函數plotForecastErrors:(我自己也沒弄懂)

複製代碼
plotForecastErrors <- function(forecasterrors)   
{   
    # make a red histogram of the forecast errors:   
    mysd <- sd(forecasterrors)   
    hist(forecasterrors, col="red", freq=FALSE)   

    # freq=FALSE ensures the area under the histogram = 1  
    # generate normally distributed data with mean 0 and standard deviation mysd  
    mynorm <- rnorm(10000, mean=0, sd=mysd)   
    myhist <- hist(mynorm, plot=FALSE)   

    # plot the normal curve as a blue line on top of the histogram of forecast errors:  
    points(myhist$mids, myhist$density, type="l", col="blue", lwd=2)      
}  
複製代碼

 

繼續輸入:

>source("plotForecastErrors.R")    #這裏沒成功

> plotForecastErrors(skirtsarimaforecast$residuals)   #顯示不存在前面的函數,沒解決呢
R學習日記——時間序列分析之ARIMA模型預測

上圖預測中的時間曲線圖顯示出對着時間增加,方差大致爲常數(大致不變)(儘管上半部分的時間序

列方差看起來稍微高一些)。時間序列的直方圖顯示預測誤大致是正態分佈的且平均值接近於 0(服從零均值的正態分佈的)。因此,把預測誤差看作平均值爲0方差爲常數正態分佈(服從零均值、方差不變的正態分佈)是合理的。 

 

既然依次連續的預測誤差看起來不是相關,而且看起來是平均值爲 0 方差爲常數的正態分佈(服從零均值、方差不變的正態分佈),那麼對於裙子直徑的數據, ARIMA(1,2,5)看起來是可以提供非常合適預測的模型。 

 

 

 

注:如果在R界面輸入畫圖指令,但是找不到圖形,可以從R控制檯的”窗口”選項選擇“R Graphics”,既可以調出所畫圖形。

 文章出處:https://www.cnblogs.com/babyfei/p/7484422.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章