常用時序預測模型的R實現 二

準備知識

這個系列偏重實踐。要學飛行,第一步是瞭解飛行前做什麼準備以及什麼狀態的飛機可以放心上去飛,想造飛機了再去了解發動機怎麼工作氣動外形有何影響。類似的,實現預測模型,第一步則是瞭解常用的數據預處理方法以求能讓模型跑起來,學會判斷模型好壞以保證預測結果是靠譜可用的。具體怎樣優化模型不在這個系列裏詳談。

數據預處理

在Python的世界裏,Pandas就自帶很方便的時間戳轉換, resample, slicing之類,基本是標準化的數據處理庫。在R裏有所不同,常用的時間序列類有ts, zoo, xts,還有一大堆不同的時間格式。xts是zoo的subclass所以能做zoo的一切,兩者基本結構都是帶時間戳的矩陣,而且基本能接受任何格式的時間戳。ts僅接受時間軸上均勻分佈的點,而且需要指定起點時間和週期長度,而zoo和xts能接受不均勻的分佈。xts在這個系列裏僅用於把不那麼好預處理的數據轉爲ts格式,不作詳細討論。以下是ts最關鍵的初始化代碼:

ts(1:10, frequency = 7, start = c(12, 2))

這行意思是什麼呢?1:10是數據序列,frequency是指定這個數據序列的週期是7(每個週期裏有7個值),start裏接受的兩個參數,第一個數12是說這個序列的初始週期序號爲12,第二個數2是說這個序列的第一個值是週期中的第2個值。打印出來是什麼情況呢?

> print( ts(1:10, frequency = 7, start = c(12, 2)), calendar = TRUE)
   p1 p2 p3 p4 p5 p6 p7
12     1  2  3  4  5  6
13  7  8  9 10

這裏用了calendar模式以突出序列的第一個值是週期中的第二位。再看個更貼近生活的例子:

x <- ts(Weekly,start=c(2010,48),frequency=52)

Weekly這個序列裏存着銷售數據,是從2010年的第四十八週開始記錄的,記錄頻率是每週一次,也即這一列中的每一行都是一週的銷售量。爲何要用ts這個類?因爲autoplot, forecast等類都以它作爲輸入格式。比如可以用剛纔的x得到時序圖:

autoplot(x)

注意觀察時序圖中曲線是不是從2010年的最後一個月開始的?銷量的確直到2011年纔開始爲正值,但序列卻已經開始了。類似的無腦方法還有很多,比如按不同週期標註不同顏色從而可以在同一個週期長度上比較不同週期觀測值的:

ggseasonplot(x) #這裏放個彩蛋,這個函數可以加一個參數 polar = TRUE,看看變多帥了?對於週期長的序列尤其好用


還有觀察週期中每個時位數值變化範圍的

ggsubseriesplot(x)

如果需要slice到特定時間域怎麼辦呢?有個window函數很好使:

> x_sub = window(x, start=2017)
> autoplot(x_sub)

怎樣判斷到底是否存在季節性

時序數據有季節性的很多,像電力消耗,降雨量,氣溫。有時候甚至存在週期套週期的情況,術語叫multiseasonal。比如零售業銷售數據,不同季節因爲氣溫、節假日體現出周而復始年年相似的模式,但這個大的週期裏,每個禮拜又因爲工作日和週末的關係存在週期性,而小到每一天,又由於作息導致存在24小時的週期律。

有些時序數據中週期性卻不那麼顯著。比如股票。比如Apple,每年發佈新款的時間是固定的,那段時間大概要漲一漲,但誰也不知道下一個新款是不是依然那麼受歡迎?又或者不巧碰倒金融危機?很多外部噪聲可以破壞掉內生的規律。好在有一種專用的圖表就是用來檢視週期性的,叫ACF,Auto Correlation Function。它的原理是拿當下的時間序列和lag N的序列做比較,看相關係數爲多少,N=1的時候就是和往前移一個時位形成的序列比,N=2和往前移兩位比,如此遞推。

lagged<-lag(x_sub,-5)

lag函數可以用於取得lag後的序列,注意第二個參數是往前推的相位,如果爲負值就成了往後推了


有了ACF函數,就不需要自己一個個相位去做比較,它全部一錘子買賣搞定:

> ggAcf(x_sub)

大於0.5就是比較強的correlation了,算比較顯著的週期性。注意不要和Acf函數混淆,Acf是從lag=0開始的,也就是自己和自己比,那correlation當然是1了,會導致整個圖的scale變得頭重腳輕。

還有值得一提的一個函數是ggPacf,也就是auto correlation function前面加了個partial。這個函數考慮到了不同的lag值可能被共同的變量影響了。比如4周的週期必然導致8周、12周也都顯著。排除掉這個因素,繪製pacf會得到如下結果

> ggPacf(x_sub)

殘值和白噪聲

殘值即residual,是預測值和實際值之間的差別。在判斷一個模型好壞時,一個標準是殘值是否爲白噪聲,也就是說不再含有任何可以被模型學到的信息(趨勢,週期性)。怎樣的殘值是白噪呢?如果它是個均值爲零的隨機正態分佈就基本可以判斷是白噪。均值不爲零其實關係也不大,只要把預測值shift一下就好了。在Python裏這些都要自己寫,但在R裏又有個強大的函數把這事情幹了,

> fit <- auto.arima(x_sub)
> checkresiduals(fit)

	Ljung-Box test

data:  Residuals from ARIMA(0,1,1)(0,0,1)[52]
Q* = 112.62, df = 102, p-value = 0.222

Model df: 2.   Total lags used: 104

auto.arima是在建立預測模型,具體怎麼幹的下一篇再講。運行結果既包括那個Ljung-Box test又包括如下圖表:


圖表顯示的,正是白噪聲。而Ljung-Box test裏最重要的一項結果就是p-value=0.222,它代表的也即是殘值確實爲白噪(p<0.05則說明非白噪了)

以上爲準備知識。下一篇開始正式介紹預測模型。

上一篇 常用時序預測模型之背景            下一篇 常用時序預測模型之ETS


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