:::

用R實作時間序列的交叉相關分析 / Cross Correlation with R

image

如果要看兩個時間序列之間是否彼此有所影響,例如X序列可能會是Y序列的領先指標。這樣子我們可以用R的ccf()函數來進行交互分析。做法參考自「Intuition behind cross-correlation function interpretation vs. correlation of lagged time series」跟「Melbourne’s Weather and Cross Correlations」這篇,以下簡單記錄一下做法。


時間序列資料 / Time Series Data

因為原本網頁中給的時間序列資料量過少,我參考「時間數列分析的SPSS使用手冊」一書中描述使用SPSS Trends時間序列套件來做交叉相關的範例資料來用,順便可以比較一下R的ccf()跟SPSS Trends功能之間的差異。

交叉相關分析的R腳本 / R Script for ccf

因為我只有用到ccf()功能,所以這個R腳本只有三行:

li = c(0.06,0.25,-0.57,0.58,-0.2,0.23,-0.04,-0.19,0.03,0.42,0.04,0.24,0.34,-0.46,-0.18,-0.08,0.29,0.56,-0.37,0.2,0.54,-0.31,0.03,0.52,-0.7,0.35,-0.63,0.44,-0.38,-0.01,0.22,0.1,-0.5,0.01,0.3,-0.76,0.52,0.15,0.06,-0.1,0.21,-0.01,0.7,-0.22,-0.76,0.06,0.02,-0.17,-0.08,0.01,0.11,-0.39,0.01,0.5,-0.02,-0.37,-0.13,0.05,0.54,-0.46,0.25,-0.52,0.44,0.02,-0.47,0.11,0.06,0.25,-0.35,0,-0.06,0.21,-0.09,0.36,0.09,-0.04,-0.2,0.44,-0.23,0.4,-0.01,0.17,0.08,0.58,-0.27,0.79,-0.21,0.02,0.3,0.28,-0.27,-0.01,0.03,0.16,-0.28,0.15,0.26,-0.36,0.32,-0.11,0.22,-0.65,0,0.47,0.16,-0.19,0.48,-0.26,0.21,0,-0.2,0.35,0.38,-0.48,0.2,-0.32,0.43,-0.5,0.12,-0.17,0.15,-0.36,0.35,-0.03,-0.18,0.16,0.07,0.21,-0.5,0.23,-0.13,0.14,-0.15,0.19,-0.24,0.26,-0.22,0.17,0.37,-0.06,0.29,-0.34,-0.12,-0.16,0.25,0.08,-0.07,0.26,-0.37)
sv = c(-0.6,-0.1,-0.5,0.1,1.2,-1.6,1.4,0.3,0.9,0.4,-0.1,0,2,1.4,2.2,3.4,0,-0.7,-1,0.7,3.7,0.5,1.4,3.6,1.1,0.7,3.3,-1,1,-2.1,0.6,-1.5,-1.4,0.7,0.5,-1.7,-1.1,-0.1,-2.7,0.3,0.6,0.8,0,1,1,4.2,2,-2.7,-1.5,-0.7,-1.3,-1.7,-1.1,-0.1,-1.7,-1.8,1.6,0.7,-1,-1.5,-0.7,1.7,-0.2,0.4,-1.8,0.8,0.7,-2,-0.3,-0.6,1.3,-1.4,-0.3,-0.9,0,0,1.8,1.3,0.9,-0.3,2.3,0.5,2.2,1.3,1.9,1.5,4.5,1.7,4.8,2.5,1.4,3.5,3.2,1.5,0.7,0.3,1.4,-0.1,0.2,1.6,-0.4,0.9,0.6,1,-2.5,-1.4,1.2,1.6,0.3,2.3,0.7,1.3,1.2,-0.2,1.4,3,-0.4,1.3,-0.9,1.2,-0.8,-1,-0.8,-0.1,-1.5,0.3,0.2,-0.5,-0.1,0.3,1.3,-1.1,-0.1,-0.5,0.3,-0.7,0.7,-0.5,0.6,-0.3,0.2,2.1,1.5,1.8,0.4,-0.5,-1,0.4,0.5)
print(ccf(sv,li,lag.max=7))

第一行變數宣告li是指領先指標 (Leading Indicator),第二行變數宣告sv是指銷售額(Sales Volume),而第三行則是ccf()交叉相關分析的設定。其中lag.max=7表示比較滯後數-7到7之間的自相關係數(Autocorrelations)。如果在滯後數-7~7之間還沒有看到很明顯的相關的話,那可以考慮把這個數值加大,再來分析看看。

計算結果 / Result

我們可以用R-fiddle這個線上R執行工具來看看跑起來的結果如何。

image

首先我們先看到右方出現的圖表:

image

可以看到滯後數Lag為2跟3的時候,自相關係數ACF特別的高。

再來看到下面的分析結果:

2016-10-23_010046

當Lag為2的時候,ACF為-0.38;當Lag為3的時候,ACF為特別高的0.72。可以發現滯後值Lag在3的時候交叉相關係數ACF為最大值,因此可知先行指標是比銷售量先行3個時間單位。(本例當中並沒有定義時間單位)


R的ccf()跟SPSS Trends比較 / Compare R's ccf() and SPSS Trends

把上面用R的ccf()跑出來的結果跟「時間數列分析的SPSS使用手冊」書中的SPSS Trends 時間序列套件跑出來的結果比較看看,會發現其實相差不多。兩者計算的交叉相關係數差別都不超過0.02左右。

此外,SPSS Trends額外計算了標準誤,在這個網頁中也有教到怎麼用R計算標準誤(請參考cr()函數)。因為使用手冊這邊只有強調交叉相關係數而已,所以我也就到此為止。

根據「時間數列分析與預測: 管理與財經之應用」一書的說法,在計算交叉相關係數時,如果時間序列本身是非平穩型,那還需要經過差分來將序列轉換成平穩型才行。時間序列的差分處理又是一門大學問,這篇就先到此為止吧。