天天看點

用R分析時間序列(time series)資料

時間序列(time series)是一系列有序的資料。通常是等時間間隔的采樣資料。如果不是等間隔,則一般會标注每個資料點的時間刻度。

 下面以time series 普遍使用的資料 airline passenger為例。 這是十一年的每月乘客數量,機關是千人次。

用R分析時間序列(time series)資料

如果想嘗試其他的資料集,可以通路這裡:  https://datamarket.com/data/list/?q=provider:tsdl

可以很明顯的看出,airline passenger的資料是很有規律的。

time series data mining 主要包括decompose(分析資料的各個成分,例如趨勢,周期性),prediction(預測未來的值),classification(對有序資料序列的feature提取與分類),clustering(相似數列聚類)等。

這篇文章主要讨論prediction(forecast,預測)問題。 即已知曆史的資料,如何準确預測未來的資料。

先從簡單的方法說起。給定一個時間序列,要預測下一個的值是多少,最簡單的思路是什麼呢?

(1)mean(平均值):未來值是曆史值的平均。

用R分析時間序列(time series)資料

(2)exponential smoothing (指數衰減):當去平均值得時候,每個曆史點的權值可以不一樣。最自然的就是越近的點賦予越大的權重。

用R分析時間序列(time series)資料

或者,更友善的寫法,用變量頭上加個尖角表示估計值

用R分析時間序列(time series)資料

(3) snaive : 假設已知資料的周期,那麼就用前一個周期對應的時刻作為下一個周期對應時刻的預測值

(4) drift:飄移,即用最後一個點的值加上資料的平均趨勢

用R分析時間序列(time series)資料

介紹完最簡單的算法,下面開始介紹兩個time series裡面最火的兩個強大的算法: holt-winters 和 arima。 上面簡答的算法都是這兩個算法的某種特例。

(5)holt-winters:  三階指數平滑

 holt-winters的思想是把資料分解成三個成分:平均水準(level),趨勢(trend),周期性(seasonality)。r裡面一個簡單的函數stl就可以把原始資料進行分解:

用R分析時間序列(time series)資料

一階holt—winters假設資料是stationary的(靜态分布),即是普通的指數平滑。二階算法假設資料有一個趨勢,這個趨勢可以是加性的(additive,線性趨勢),也可以是乘性的(multiplicative,非線性趨勢),隻是公式裡面一個小小的不同而已。  三階算法在二階的假設基礎上,多了一個周期性的成分。同樣這個周期性成分可以是additive和multiplicative的。 舉個例子,如果每個二月的人數都比往年增加1000人,這就是additive;如果每個二月的人數都比往年增加120%,那麼就是multiplicative。

用R分析時間序列(time series)資料

 r裡面有holt-winters的實作,現在就可以用它來試試效果了。我用前十年的資料去預測最後一年的資料。 性能衡量采用的是rmse。 當然也可以采用别的metrics:

用R分析時間序列(time series)資料

預測結果如下:

用R分析時間序列(time series)資料

結果還是很不錯的。

(6) arima: autoregressive integrated moving average

arima是兩個算法的結合:ar和ma。其公式如下:

用R分析時間序列(time series)資料
用R分析時間序列(time series)資料

是白噪聲,均值為0, c是常數。  arima的前半部分就是autoregressive:

用R分析時間序列(time series)資料

後半部分是moving average: 

用R分析時間序列(time series)資料

。  ar實際上就是一個無限脈沖響應濾波器(infinite impulse resopnse), ma是一個有限脈沖響應(finite impulse resopnse),輸入是白噪聲。

arima裡面的i指integrated(差分)。 arima(p,d,q)就表示p階ar,d次差分,q階ma。  為什麼要進行差分呢? arima的前提是資料是stationary的,也就是說統計特性(mean,variance,correlation等)不會随着時間視窗的不同而變化。用數學表示就是聯合分布相同:

用R分析時間序列(time series)資料

當然很多時候并不符合這個要求,例如這裡的airline passenger資料。有很多方式對原始資料進行變換可以使之stationary:

(1) 差分,即integrated。 例如一階差分是把原數列每一項減去前一項的值。二階差分是一階差分基礎上再來一次差分。這是最推薦的做法

(2)先用某種函數大緻拟合原始資料,再用arima處理剩餘量。例如,先用一條直線拟合airline passenger的趨勢,于是原始資料就變成了每個資料點離這條直線的偏移。再用arima去拟合這些偏移量。

(3)對原始資料取log或者開根号。這對variance不是常數的很有效。

如何看資料是不是stationary呢?這裡就要用到兩個很常用的量了: acf(auto correlation function)和pacf(patial auto correlation function)。對于non-stationary的資料,acf圖不會趨向于0,或者趨向0的速度很慢。 下面是三張acf圖,分别對應原始資料,一階差分原始資料,去除周期性的一階差分資料:

用R分析時間序列(time series)資料
用R分析時間序列(time series)資料
用R分析時間序列(time series)資料

確定stationary之後,下面就要确定p和q的值了。定這兩個值還是要看acf和pacf:

用R分析時間序列(time series)資料

确定好p和q之後,就可以調用r裡面的arime函數了。 值得一提的是,r裡面有兩個很強大的函數: ets 和 auto.arima。 使用者什麼都不需要做,這兩個函數會自動挑選一個最恰當的算法去分析資料。

在r中各個算法的效果如下:

用R分析時間序列(time series)資料

代碼如下:

用R分析時間序列(time series)資料
用R分析時間序列(time series)資料

繼續閱讀