時間序列建模問題,如何準確的建立時間序列模型?

新手請教時間序序列建模問題。

這種帶趨勢的序列是否說明序列是非平穩的??

一階差分之後的數據如圖2:

ACF和PACF圖分別為:

看PACF首先想到拿AR(p)建模,由於1,14,15都是顯著不為0的,所以考慮建模為:

r(t)=a0+a1*r(t-1)+a14*r(t-14)+a15*r(t-15)

估計出的方程為:

r(t)= 3519.5907+0.8386*r(t-1)+0.2275*r(t-14)-0.1633*r(t-15)

所有的特徵根模都大於1,又說明該模型是平穩的?

對該模型的殘差使用Ljung-Box進行檢驗,p值為0.7多,說明該模型不充分。

在此我陷入了一個怪圈,很凌亂,存在趨勢的模型是否說明是非平穩的?如果是,為何建立的AR模型又證明是平穩的?

請問,時間序列分析中如何能做到建立合適的模型?

即我為什麼要使用AR,MA,ARMA,ARIMA..等等模型,使用的場景如何確定呢?可以直觀的通過圖像確認或ACF,PACF,AIC這些確認嗎?

如何選擇出好的模型呢?

謝謝!


1. 用眼睛

首先一個時間序列,他可能是有趨勢的,是不平穩的。所以如果不平穩你要做差分,把趨勢的因素抵消掉。這樣,如你的圖2,用眼睛目測就可以認為是一個平穩的時間序列。

2. ACF,PACF觀察是否穩定,並選定模型

當然,目測只是目測,接下來要用ACFPACF來進一步觀察。

ACF(自相關係數)和PACF(偏自相關係數)

對於

AR(p)模型,PACF會在lag=p時截尾,也就是,PACF圖中的值落入寬頻區域中。

MA(q)模型,ACF會在lag=q時截尾,同理,ACF圖中的值落入寬頻區域中。

這是簡單的識別方法。

你可以看到你的圖中,ACF顯然沒有迅速的衰減截尾,而PACF在lag=1時他的值就落入寬頻區域了。所以選用AR(1)模型,對於粗略的模擬,其實lag=14,15可以不用考慮的,當然,考慮也沒啥問題。(舉個例子,如果ACF在lag=3衰減入寬頻區域,那就定MA(3))

3. 擬合該模型

好了,你擬合了模型,比如我用R軟體

mod1&<-arima(x,order=c(1,0,0))

x是你的時間序列名稱,order里的第一項和最後一項代表p和q。

你自認為模擬好了,那你要檢驗模擬的好不好,會不會更好。

你可以通過AIC來做檢驗與比較。

比如,你還模擬了一個模型叫他

,mod2&<-arima(x,order=c(1,0,1))

比較他們的AIC

AIC(mod1)

AIC(mod2)

誰的數值小誰更好。

4. 檢驗該模型擬合後的時間序列殘差是否為白雜訊

好了,假設我們認為mod2更好。我們必須進一步檢驗,你模擬的模型是不是包含了所有的因素,也就是他的除去這個模型,你的時間序列是不是白雜訊(white noise),如果不是,那就說明你還沒有提出所有的因素。

我們先用簡便的方法來看,看這個模型的殘差是不是白雜訊。

輸入 acf(resid(mod2))

然後看顯示圖

你看見,acf的值在lag=1迅速衰減了(decay)了,所以你可以歸結為,他是白雜訊了。白雜訊在lag=1是必須在寬頻區域內,因為他的任意相鄰兩項沒任何關係,所以也不會有什麼自相關係數。

5. 進一步用Ljung-Box方法進行檢驗

原假設H0:自相關係數rho1=rho2=rho3...=0

如果檢驗出來拒絕了原假設(顯著有差別),說明rho不等於0不行!

判斷標準:p值小於0.05,或者卡方值大於3.84或5.99(主要看你選的a)拒絕原假設

如果檢驗出來接受原假設,說明剩餘白雜訊。

判斷標準:p值大於0.05,或者卡方值小於3.84或5.99(主要看你選的a)接受原假設。

具體,輸入:

m&<-floor(sqrt(length(x)))

Box.test(resid(x),lag=m,type=c("Ljung-Box"),fitdf=2)

自由度為p與q之和

m是定義的。你的時間序列n的根號取整。

得出結果,

其實你的結果p=0.7是好啊!大於0.05就接受原假設啦。

接受原假設就說明你的擬合的模型的殘差是白雜訊。

記住,p值是越大越好(0.05界限),z,t,X方這些檢驗值都是越小越好(比如1.96;卡方3.84等等)。

補充一點,特徵根方程根絕對值全部大於單位圓半徑(1)也是一個檢驗時間序列平穩的標準。

再來用實際數據用R語言操作舉個栗子:

我們有一個時間序列的數據 "D1_data.txt"

1.拿到這個時間序列你先目測,上圖通過目測可以認為是一個平穩的時間序列。

R步驟
a&<-read.csv("D:/D1_data.txt") #括弧中的東西取決於你的數據在電腦的哪裡 aa&<-ts(a) #我命名該時間序列為aa plot(aa) #畫出時間序列aa 上圖

2.通過ACF和PACF也就是自相關係數和偏自相關係數來判斷是否穩定。

由於ACF在lag=1之後便落入置信區間;PACF在lag=3之後落入置信區間。

我們認為改時間序列穩定。

R 步驟
layout(1:2) #一次顯示兩張圖
acf(aa) #顯示自相關係數
pacf(aa) #顯示偏自相關係數

3.模型擬合

選擇 ma(1)或者arma(3,1)。

用arima命令來擬合。並用AIC看哪個模型更好,AIC數值越小越好。

R步驟
ma1&<-arima(aa,order = c(0,0,1)) arma13&<-arima(aa,order = c(3,0,1)) AIC(ma1) AIC(arma13) #AIC結果: AIC(ma1) [1] 939.6636 AIC(arma13) [1] 943.8848

ma1優於arma13。

4.看看擬合好的模型的殘差是否為白雜訊

R步驟
acf(resid(ma1)) #ma1的殘差的自相關係數

Ok大功告成!


存在趨勢的序列都是非平穩的,AR等一系列模型是必須建立在平穩的基礎上才有意義…一般時間序列建模的流程是:去除確定性因素(趨勢還有季節性),然後對剩下的隨機因素進行平穩性檢驗,檢驗通過之後進行arima建模,具體的階數你可以用acf,pacf來確定,比較方便的是R裡面的auto.arima直接定階…然後進行模型的擬合與預測…最後就是對殘差進行arch效應檢驗,如果有arch效應,就進一步用波動率模型進行建模…總的來說就是確定性因素的分解—隨機因素的均值建模—波動率建模。


題主的時間序列理論基礎還並不充足,建議多搜集一些系統知識學習一下。

關於AR,MA,ARMA等模型應該怎麼選

要注意對於這幾個模型的選擇絕對不是IC誰高就選誰。正確的流程:1)根據acf和pacf的特點進行選擇。比如題主的圖acf緩慢下行,而pacf只有一個lag significant,這樣對應的model是AR,相反如果pacf decays而acf cuts off,你就該去選MA。每個model都有對應的acf,pacf的特點,根據對應的特點細節去選model,選lag,增加sessional ar ma,驗證殘差等等。2)在1)的基礎上選出的可能性的model中,用IC和殘差的表現來選一個最好的,這時候才用到IC。不談1)來談IC沒有意義。其中還有很多需要注意的點建議題主自己搜索學習一下。

第二點:

有trend代表一定不stationary,但這並不影響模型,在去除趨勢項後,一個時間序列依然可以穩態,這個叫做trend stationary,因此即使有trend,依然可以使用ar等模型來model。

所以不考慮VAR,VECM系統情況下,modelling大致分為以下:

1)model deterministic part

trend,seasonal effect,break trend

2)unit root test

3)model autocorrelated part

AR,ARMA,ARIMA……… 7steps

4)model variance

ATCH GARCH EGARCH TGARCH etc

5)check IGARCH

6)use standardized residual to check mean specification

暫時想起這些


有趨勢項時,原序列的確不是平穩的。

一般來說有趨勢項時,可以考慮做差分。平穩性檢驗除了看圖之外,可以用ADF檢驗,考慮tseries包的adf.test(),H0假設非平穩。

看ACF和PCAF定階的傳統辦法是截尾和拖尾,但很不直觀,也比較粗糙,反正我是沒看準過,不建議使用。

最後,我也知道很不對,但是還是推薦一下forecast包的auto.arima……從差分到定階,到AIC,BIC一步到位。auto.arima的定階標準默認是AIC最小。然後對擬合的ARIMA(p,d,q)做一個殘差的LBQ檢驗就行了。


剛學過時間序列分析,過來說一點:直觀根據acf、pacf的圖確定模型的階數,有太多的個人主觀因素的影響,不確切。

而aic和sbc似乎比較適合後期模型優劣的比較,不合適定階使用。

上面那位介紹的很好,如果我早看到,說不定期末還能多考兩分呢


滿屏的 統計角度的 回答,中看不中用,從 CS 角度強答一發,理解不當之處不妨指正

為何說 中看不中用?

首先,像 AR系列的時間序列模型(ARIMA, ARMAX, ARxxxxxx),只關注預測目標 y 本身的變化,缺乏對其他因素建模的能力,就拿 股價預測 來說,假如我們預測『樂屎』這家公司的股票,說這貨前幾天一直大漲,但今天突然爆出個新聞,樂屎資金鏈徹底斷裂了!王八蛋老闆假藥停欠了一屁股債,跟小姨子跑路了! 你說股價明天跌不跌? 縱使你統計模型把什麼平穩分布,差分,檢驗玩的再6,你能預測准? (感謝 @KevinXU 的補充,這其實是指股價預測里的『技術面』和『基本面』分析 )

包括 馬爾科夫鏈之類的模型,也只是關注了 y 的轉移情況,無法建模其他因素,當然,有不少改良版本,在此不表。

所以,答主,你還不放棄這些花架子的統計模型?還對這些模型有執念么? 老夫奉勸一句,苦海無邊,回頭是岸那

如何更有效地對 時間序列 建模

回到答主的問題,不必拘泥於那些沒用的AR模型,投入機器學習的懷抱吧。機器學習跟統計學習有很大交集,但更側重模型的預測能力

我就直接用現在很火的 RNN 模型(建議用 LSTM 這個變種)來解答你的問題。還用股價預測舉例

  • Step1. 不妨假設你現在的數據是一段時間的股價 {y1,...,yt..., yT },則你可以構建對應的輸入特徵 {x1, ..., xt,..., xT}。說說這個輸入特徵,如果你的數據源豐富,則輸入特徵 xt 可以包含:當天發生的大新聞Θ..Θ,當天是星期幾,這個股票是哪個公司的,等等等;如果你的數據源貧瘠,只有光禿禿的股價 y 這個變數本身,那也沒關係,我們可以用 xt=[yt-1, yt-2,...] 這樣的特徵,即把當前股價前幾天的股價歷史,作為這個 xt
  • Step2. 有了這些 xt 和 yt,你就可以輸入到 RNN 里進行訓練啦,訓練完之後我們得到一個模型f,那麼預測階段,只要輸入 f(..., xt, xt+1, xt+2),就能預測出未來的 yt+3 啦。

至於你問我這個效果好不好?我當然要說:那是非常exciting啊!答主,趕緊學習 Python 和 TensorFlow,拋棄那些雞肋般的統計模型,悶聲發大財去吧。蛤蛤

===== 更新 ====

上面提到的,『只有 y 這個變數本身,那也沒關係,我們可以用 xt=[yt-1, yt-2,...] 這樣的特徵,即把當前股價前幾天的股價歷史,作為這個 xt』,沒展開說,其實更細節的做法是:
Step1. 對 xt 做特徵工程,除了歷史記錄 [yt-1, yt-2,...] 本身外,還可以包含他們的各種統計量(均值、最大最小值、一階差分二階差分,等等等),來豐富 xt 的維度
Step2. 建立模型 f(xt)-&>yt,或者 f(xt-n,...,xt)-&>yt-n,...,yt 訓練並預測

f(xt)-&>yt 這類模型有個最大的缺點,就是把一系列的 (xt,yt)看做獨立的,雖然 xt 里包含了歷史 yt 的信息,但從模型結構上看,無法刻畫標籤 yt 之間的相關性。所以 f(xt-n,...,xt)-&>yt-n,...,yt 更自然些(參考 分類與回歸區別是什麼? - 知乎用戶的回答 - 知乎)

對於@Evan 提到的數據量少 LSTM 效果不好的情形,我覺得可以考慮以下兩點改進:
1. 簡化 LSTM 的結構,比如神經元個數、隱層層數等,本質上是為了減少 LSTM 的非線性程度,防止過擬合
2. 減少 LSTM 的時間步長,比如只用兩步,類似一階馬爾可夫鏈,或者NLP里的 bi-gram。這麼做是讓 LSTM 更關注離預測點最近時刻的數據點,因為數據少么,所以沒必要 long dependency

後續我放一些實驗結果


學渣來答一個。在國外學的時間序列,所以很多概念只知道用英文表示。勿噴。。。

1. 首先拿到數據, 作圖然後觀察確認一點,這個序列是不是stationary?

2. 怎麼判斷stationarity(weak)?

先看 stationarity 的定義

a) constant variance

b) constant mean

c) covariance of two values of the time series only depends on the difference h between two times at which they were recorded

判斷方法: 如果只是拿到數據,不知道其他信息的話,那就是。。用眼睛看。是不是有long term trend and seasonal components,如果兩者有其一,那可以大致肯定不是 stationarity.

根據圖一,肯定有long term trend , 可能有seasonal oscillation.

3. 如果不是stationarity,提供兩種選擇(實際肯定不止兩種,但沒學到。。)

a) classical decomposition (additive/multiplicative) : 這個搜一下吧。

The ultimate goal is to remove non-stationarity influences to recover estimated residual noise (don"t have to be White noise)

接下來,觀察estimated residual noise (題主的圖2和圖3),這個肯定不是white noise , 所以接下來用 ARMA. AR 和MA 只是ARMA的簡化版。 (如果步驟2的結果是stationery,直接用ARMA吧)

比較幾個ARMA模型的優劣可以用AIC的辦法, 一定要看ARMA model residuals, 這個需要像White Noise,否則模型是不合適的。

如果擔心residual of ARMA exhibit heteroscedasticity, 那麼看看sqared ACF 是不是像white noise, 結論是是否的話,用GARCH模型。

b) ARIMA/SARIMA

參數怎麼選見其他回答。。同理,最後得到的recovered residual 應該是white noise.. 如果懷疑 heteroscedasticity. 參見GARCH model

綜上,模型運用是有層級的,有些模型的運用是基於數據必須是stationary 之上的 ,比如ARMA, GARCH。 ARIMA/SARIMA 的使用是差分後的數據必須是stationary的。

題主不要太糾結,用一句名言安慰你一下。每逢開學必聽一遍的話。。

"Essentially, all models are wrong, but some are useful."


1. 帶趨勢的序列一定是非平穩的。平穩序列的時序圖一般是會在某個常數值附近隨機波動,而且波動的範圍有邊界。

2. 證明序列是否為平穩序列有兩種方法,一種就是上面說的圖像法,另一種是單位根檢驗,比如ADF test。

3. 時間序列的建模過程一般是這樣的:首先要判斷序列的平穩性,對於非平穩性的序列可以進行差分或者去趨勢和季節效應,轉變成平穩性序列,接下來對平穩性序列進行arma建模,建模首先是看自相關係數和偏相關係數的特徵,對模型定階,然後估計模型中的未知參數,最後對模型的殘差進行白雜訊檢驗以確定模型。如果有多個模型都通過檢驗,那就運用aic和sbc對模型進行刪選,選值小的。

4. 想要提高模型的擬合程度,我覺得應該結合確定性分析和隨機性分析兩種方法,以充分提取觀察序列中的有效信息。


直接上Recurrent Neural Network.. 逃(


推薦閱讀:

面對有大量缺失值的數據應該怎樣處理比較合理?
如何零基礎學習 R 語言?
R語言數據可視化的包,除了ggplot2,recharts,shiny等包外,還有哪些很值得推薦的包?
如何使用 ggplot2 ?
輔修計算機的學生該怎麼找計算機相關的工作?

TAG:統計學 | 計量經濟 | 計量經濟學 | R編程語言 | 時間序列分析 |