本文結構:php
時間序列,就是按時間順序排列的,隨時間變化的數據序列。
生活中各領域各行業太多時間序列的數據了,銷售額,顧客數,訪問量,股價,油價,GDP,氣溫。。。python
隨機過程的特徵有均值、方差、協方差等。
若是隨機過程的特徵隨着時間變化,則此過程是非平穩的;相反,若是隨機過程的特徵不隨時間而變化,就稱此過程是平穩的。
下圖所示,左邊非穩定,右邊穩定。 bash
非平穩時間序列分析時,若致使非平穩的緣由是肯定的,能夠用的方法主要有趨勢擬合模型、季節調整模型、移動平均、指數平滑等方法。
若致使非平穩的緣由是隨機的,方法主要有ARIMA(autoregressive integrated moving average)及自迴歸條件異方差模型等。markdown
ARIMA (Auto Regressive Integrated Moving Average) 能夠用來對時間序列進行預測,常被用於需求預測和規劃中。函數
能夠用來對付 ‘隨機過程的特徵隨着時間變化而非固定’ 且 ‘致使時間序列非平穩的緣由是隨機而非肯定’ 的問題。不過,若是是從一個非平穩的時間序列開始, 首先須要作差分,直到獲得一個平穩的序列。post
模型的思想就是從歷史的數據中學習到隨時間變化的模式,學到了就用這個規律去預測將來。學習
ARIMA(p,d,q)模型,其中 d 是差分的階數,用來獲得平穩序列。測試
AR是自迴歸, p爲相應的自迴歸項。大數據
MA爲移動平均,q爲相應的移動平均項數。flex
ARIMA(p,d,q)模型是ARMA(p,q)模型的擴展。
ARIMA(p,d,q)模型能夠表示爲:
其中L 是滯後算子(Lag operator),d in Z, d>0。
AR:
當前值只是過去值的加權求和。
MA:
過去的白噪音的移動平均。
ARMA:
AR和MA的綜合。
ARIMA:
和ARMA的區別,就是公式左邊的x變成差分算子,保證數據的穩定性。
差分算子就是:
令 wt 爲:
則 ARIMA 就能夠寫成:
輸入歷史數據,預測將來時間點的數據。
本文參考了:時間序列實例
另外推薦你們看這篇,36大數據上有一個python版講的不錯,裏面對穩定性的定量檢驗的講解比較詳細:時間序列預測全攻略-附帶Python代碼
ARIMA模型運用的基本流程有幾下幾步:
使用ARIMA模型對裙子長度預測
skirts <- scan("http://robjhyndman.com/tsdldata/roberts/skirts.dat", skip=5)
str(skirts) head(skirts) boxplot(skirts) length(skirts)
skirts_ts <- ts(skirts, start=c(1886), frequency=1)
1)查看時間序列對應的時間
skirts_ts
2)畫出時間序列圖
plot.ts(skirts_ts)
從圖可知:女人裙子邊緣的直徑作成的時間序列數據,從 1866 年到 1911 年在平均值上是不平穩的
1)作時間序列的一階差分
skirts_diff <- diff(skirts_ts, differences = 1) plot.ts(skirts_diff)
從一階差分的圖中能夠看出,數據還是不平穩的,繼續差分
2)作時間序列的二階差分
skirts_diff2 <- diff(skirts_ts, differences = 2) plot.ts(skirts_diff2)
二次差分後的時間序列在均值和方差上看起來是平穩了
尋找 ARIMA(p,d,q)中合適的 p 值和 q
1)自相關圖ACF
acf(skirts_diff2, lag.max = 20)
acf(skirts_diff2, lag.max = 20, plot = F)
自相關圖顯示滯後1階自相關值基本沒有超過邊界值,雖然5階自相關值超出邊界,那麼極可能屬於偶然出現的,而自相關值在其餘上都沒有超出顯著邊界, 並且咱們能夠指望 1 到 20 之間的會偶爾超出 95%的置信邊界。 自相關圖5階後結尾
2)偏相關圖PACF
pacf(skirts_diff2, lag.max = 20)
pacf(skirts_diff2, lag.max = 20, plot = F)
偏自相關值選1階後結尾
故咱們的ARMIA模型爲armia(1,2,5
3)使用auto.arima()函數,自動獲取最佳的ARIMA模型
library(forecast)
auto.arima(skirts_ts, ic=c("aicc", "aic", "bic"), trace = T)
Best model: ARIMA(1,2,0)
1)arima(1, 2, 0)模型
(skirts_arima <- arima(skirts_ts, order = c(1, 2, 0)))
aic = 391.33
2)arima(1, 2, 5)模型
(skirts_arima <- arima(skirts_ts, order = c(1, 2, 5)))
aic = 381.6
AIC是赤池消息準則SC是施瓦茨準則,當兩個數值最小時,則是最優滯後分佈的長度。咱們進行模型選擇時,AIC值越小越好。因此arima(1, 2, 5)模型較好
(skirts_forecast <- forecast.Arima(skirts_arima, h=5, level = c(99.5)))
plot.forecast(skirts_forecast)
觀察 ARIMA 模型的預測偏差是不是平均值爲 0 且方差爲常數的正態分佈,同時也要觀察連續預測偏差是否自相關
1)檢驗預測偏差的自相關性
tsdiag(skirts_arima)
下面第一個圖表表明估計模型偏差的繪圖。圖中豎線的長度比較類似,都處在穩定範圍以內,即估計的模型沒產生不符合要求的偏差分佈。
第二張繪圖,顯示估計的模型沒形成偏差之間的任何關係。這是符合數據生成時每一個數據都是獨立的這個前提的。因而可知,這ACF圖符合檢測要求。
第三張圖,也就是Ljung-Box 指標。這個指標可對每個時間序列的延遲進行顯著性的評估。斷定技巧是,P-value點的高度越高,咱們的模型越可信。
acf(skirts_forecast$residuals, lag.max = 20)
Box.test(skirts_forecast$residuals, lag=20, type = "Ljung-Box")
p-value = 0.9871
相關圖顯示出在滯後1-20階中樣本自相關值都沒有超出顯著置信邊界,並且Ljung-Box檢驗的p值爲0.99,因此咱們推斷在滯後1-20階(lags1-20)中沒明顯證聽說明預測偏差是非零自相關的。
Acf檢驗說明:殘差沒有明顯的自相關性,Ljung-Box測試顯示:全部的P-value>0.05,說明殘差爲白噪聲。
2)判斷預測偏差是不是平均值爲零且方差爲常數的正態分佈
作預測偏差的時間曲線圖和直方圖(具備正態分佈曲線)
預測偏差的均值是否爲0
plot.ts(skirts_forecast$residuals)
自定義判斷預測偏差的方差是正態分佈的函數
plotForecastErrors <- function(forecasterrors){ #畫預測偏差的直方圖 hist(forecasterrors, col="red", freq = F) #畫方差是預測偏差數據的方差,平均值是0的正態分佈數據的線 mysd <- sd(forecasterrors) mynorm <- rnorm(10000, mean = 0, sd = mysd) myhist <- hist(mynorm, plot = F) points(myhist$mids, myhist$density, type="l", col="blue", lwd=2) } plotForecastErrors(skirts_forecast$residuals)
下圖顯示時間序列的直方圖顯示預測誤大體是正態分佈的且平均值接近於0。所以,把預測偏差看做平均值爲0方差爲服從零均值、方差不變的正態分佈是合理的。
既然依次連續的預測偏差看起來不是相關,並且服從零均值、方差不變的正態分佈,那麼對於裙子直徑的數據,ARIMA(1,2,5)看起來是能夠提供很是合適預測的模型。
1.ARIMA建模的步驟
2.決定ARIMA參數的方法
d是差分的階數,幾階後就能夠保證穩定:
modelfit,計算出來的參數是 1,1,1 ,但可能 2,1,1 預測效果更好,那就用後者。
或者用AIC比較倆模型。