【问题标题】:How to use the ccf() method in the statsmodels library?如何使用 statsmodels 库中的 ccf() 方法?
【发布时间】:2020-12-09 00:26:02
【问题描述】:

我在使用 (Python) statsmodels 库中的 ccf() 方法时遇到了一些问题。等效操作在 R 中运行良好。

ccf 产生两个变量之间的互相关函数,在我的示例中为AB。我有兴趣了解A 在多大程度上是B 的领先指标。

我正在使用以下内容:

import pandas as pd
import numpy as np
import statsmodels.tsa.stattools as smt

我可以模拟AB如下:

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),这样我可以制作类似上面的情节。

有没有办法做到这一点?

【问题讨论】:

    标签: python time-series statsmodels cross-correlation


    【解决方案1】:

    statsmodels ccf 函数仅产生前向滞后,即 Corr(x_[t+k], y_[t]) for k >= 0。但是计算后向滞后的一种方法是颠倒输入序列和输出。

    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]
    

    请注意,backwardsforwards 都包含滞后 0,因此在合并它们时我们必须从其中一个中删除它。

    编辑另一种选择是颠倒参数和输出的顺序:

    backwards = sm.tsa.ccf(test['B'], test['A'], adjusted=False)[::-1]
    

    【讨论】:

    • 效果很好。小记 - 我认为“调整后”应该是“公正的”。:
    • 换句话说。 . .向后 = sm.tsa.ccf(test['B'], test['A'], unbiased = False)[::-1]
    • 好点。但是,请注意,unbiased 参数将在即将发布的 v0.12 版本的 statsmodels 中弃用,转而支持 adjusted 参数。
    【解决方案2】:

    可以得到所需的互相关图如下(从中我们可以通过找到峰值来估计 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='--')
    

    【讨论】:

      猜你喜欢
      • 2018-10-25
      • 2016-11-25
      • 2020-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-11
      • 2019-11-05
      • 2015-01-24
      相关资源
      最近更新 更多