[英]How to use the ccf() method in the statsmodels library?
我在(Python) statsmodels
庫中的ccf()
方法遇到了一些問題。 等效操作在 R 中運行良好。
在我的示例中, ccf
在兩個變量A
和B
之間產生互相關 function。 我有興趣了解A
在多大程度上是B
的領先指標。
我正在使用以下內容:
import pandas as pd
import numpy as np
import statsmodels.tsa.stattools as smt
我可以模擬A
和B
如下:
np.random.seed(123)
test = pd.DataFrame(np.random.randint(0,25,size=(79, 2)), columns=list('AB'))
當我運行ccf
時,我得到以下信息:
ccf_output = smt.ccf(test['A'],test['B'], unbiased=False)
ccf_output
array([ 0.09447372, -0.12810284, 0.15581492, -0.05123683, 0.23403344,
0.0771812 , 0.01434263, 0.00986775, -0.23812752, -0.03996113,
-0.14383829, 0.0178347 , 0.23224969, 0.0829421 , 0.14981321,
-0.07094772, -0.17713121, 0.15377192, -0.19161986, 0.08006699,
-0.01044449, -0.04913098, 0.06682942, -0.02087582, 0.06453489,
0.01995989, -0.08961562, 0.02076603, 0.01085041, -0.01357792,
0.17009109, -0.07586774, -0.0183845 , -0.0327533 , -0.19266634,
-0.00433252, -0.00915397, 0.11568826, -0.02069836, -0.03110162,
0.08500599, 0.01171839, -0.04837527, 0.10352341, -0.14512205,
-0.00203772, 0.13876788, -0.20846099, 0.30174408, -0.05674962,
-0.03824093, 0.04494932, -0.21788683, 0.00113469, 0.07381456,
-0.04039815, 0.06661601, -0.04302084, 0.01624429, -0.00399155,
-0.0359768 , 0.10264208, -0.09216649, 0.06391548, 0.04904064,
-0.05930197, 0.11127125, -0.06346119, -0.08973581, 0.06459495,
-0.09600202, 0.02720553, 0.05152299, -0.0220437 , 0.04818264,
-0.02235086, -0.05485135, -0.01077366, 0.02566737])
這是我想要達到的結果(在 R 中生成):
問題是這樣的: ccf_output
只給我滯后 0 和滯后 0 右側的相關值。理想情況下,我想要完整的滯后值集(滯后 -60 到滯后 60),這樣我就可以產生類似的東西上述 plot。
有沒有辦法做到這一點?
statsmodels ccf
function 只產生前向滯后,即 Corr(x_[t+k], y_[t]) for k >= 0。但是計算后向滯后的一種方法是顛倒輸入序列和output。
backwards = smt.ccf(test['A'][::-1], test['B'][::-1], adjusted=False)[::-1]
forwards = smt.ccf(test['A'], test['B'], adjusted=False)
ccf_output = np.r_[backwards[:-1], forwards]
請注意, backwards
和forwards
都包含滯后 0,因此在組合它們時我們必須從其中一個中刪除它。
編輯另一種選擇是顛倒 arguments 和 output 的順序:
backwards = sm.tsa.ccf(test['B'], test['A'], adjusted=False)[::-1]
所需的互相關 plot 可以如下獲得(從中我們可以通過找到峰值來估計 CCF 的最佳滯后):
import matplotlib.pylab as plt
#np.random.seed(123)
#test = pd.DataFrame(np.random.randint(0,25,size=(79, 2)), columns=list('AB'))
#backwards = smt.ccf(test['B'], test['A'], unbiased=False)[::-1]
#forwards = smt.ccf(test['A'], test['B'], unbiased=False)
#ccf_output = np.r_[backwards[:-1], forwards]
plt.stem(range(-len(ccf_output)//2, len(ccf_output)//2), ccf_output)
plt.xlabel('Lag')
plt.ylabel('ACF')
# 95% UCL / LCL
plt.axhline(-1.96/np.sqrt(len(test)), color='k', ls='--')
plt.axhline(1.96/np.sqrt(len(test)), color='k', ls='--')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.