【问题标题】:Statsmodels PACF plot confidence interval does not match PACF functionStatsmodels PACF 图置信区间与 PACF 函数不匹配
【发布时间】:2023-03-12 18:44:01
【问题描述】:

在观察偏自相关 (PACF) 图时,我的时间序列似乎存在明显滞后,即 PACF 值大于蓝色置信区间。我想以编程方式验证这一点,但它似乎不起作用。

我使用 statsmodels 时间序列 api 绘制了 PACF 图,这表明第一个滞后很重要。因此,我使用PACF estimation 来获取 PACF 值以及每个点的置信区间,但两者之间的置信区间不匹配。更奇怪的是the plot function in the source code 使用了底层估计函数,所以它们应该都匹配。

例子:

import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm

x = np.arange(1000) 
sm.graphics.tsa.plot_pacf(x)
plt.show()

这表明第一个滞后非常显着,约为 0.98,整个图中的置信区间(蓝色矩形)约为 (-0.06, 0.06)。

或者,当尝试获取这些精确的绘图值时(为简洁起见,仅获取前 10 个滞后):

sm.tsa.stattools.pacf(x, nlags=10, alpha=0.05) 

得到的 PACF 值是(与上图相匹配):

array([ 1.        ,  0.997998  , -0.00200201, -0.00200402, -0.00200605,
        -0.0020081 , -0.00201015, -0.00201222, -0.0020143 , -0.00201639,
        -0.00201849])

置信区间(在上图中以蓝色显示)似乎在第一次滞后时关闭:

 array([[ 1.        ,  1.        ],
        [ 0.93601849,  1.0599775 ],
        [-0.06398151,  0.0599775 ],
        [-0.06398353,  0.05997548],
        [-0.06398556,  0.05997345],
        [-0.0639876 ,  0.05997141],
        [-0.06398965,  0.05996935],
        [-0.06399172,  0.05996729],
        [-0.0639938 ,  0.05996521],
        [-0.06399589,  0.05996312],
        [-0.06399799,  0.05996101]]))

发生了什么事?

API 参考:

【问题讨论】:

    标签: python statsmodels


    【解决方案1】:

    滞后 0 的 PACF 始终为 1(参见例如 here),因此其置信区间为 [1,1]。

    这是由计算 CI 的 the code snippet 的最后一行来确保的:

    varacf = 1. / len(x)  # for all lags >=1
    interval = stats.norm.ppf(1. - alpha / 2.) * np.sqrt(varacf)
    confint = np.array(lzip(ret - interval, ret + interval))
    confint[0] = ret[0]  # fix confidence interval for lag 0 to varpacf=0
    

    (另请参阅 issue 1969 已修复此问题)。

    由于 0 滞后是不感兴趣的,您通常使 PACF 图从滞后 1 开始(如 R 的pacf function)。这可以通过zero=False实现:

    sm.graphics.tsa.plot_pacf(x, ax=axes[0], zero=True, title='zero=True (default)')
    sm.graphics.tsa.plot_pacf(x, ax=axes[1], zero=False, title='zero=False')
    

    【讨论】:

    • 我认为你不明白我的问题。我知道第一个值总是 1。我的意思是置信区间从滞后 1 开始就不同。
    • 恐怕我不明白您的评论:所有间隔都与上面代码 sn-p 的第二行中计算的完全相同(0.0619795)。该图显示了这些间隔 (github.com/statsmodels/statsmodels/blob/…)
    • 我看得出来你误会了。我的问题的重点是为什么一个函数给出的置信区间与绘制的置信区间不同。没有什么让我感到困惑。
    • 啊,好吧,所以我从一开始就弄错了你的问题(当你说“第一次延迟关闭”时,我理解你的意思是延迟 0 而不是延迟 1,我认为是第二次延迟)。
    • 是的,对我来说,滞后 1 是一个滞后 1 个时间步长的变量。 Lag 2 落后 2 步,以此类推。
    【解决方案2】:

    根据代码:

    • stattools.pacf 计算估计 pacf 周围的置信区间,即它以实际值为中心
    • graphics.tsa.plot_pacf 采用该置信区间并减去估计的 pacf,因此置信区间以零为中心。

    我不知道也不记得为什么会这样。

    在示例中,所有滞后大于或等于 2 的 pacf 都接近于零,因此绘图与 stattools.pacf 的结果之间没有明显差异。

    【讨论】:

    • 啊,就是这样。因此,从给定的间隔中减去 pacf 值应该会给我绘图所显示的内容。
    • @Josef,从统计角度来看,使用stattools.pacfgraphics.tsa.plot_pacf 哪个CI 更正确?
    • 它们只是相互转换的版本,因此它们依赖于相同的假设,这些假设可能适合或不适合给定的数据集。 CI 以零为中心的图可以更容易地查看哪些滞后可能具有统计显着性。 (IIRC,CI 是在假设一个没有序列相关性的 Null 过程的情况下计算的,而不是在可能生成观察到的 acf/pacf 模式的模型的假设下。然后 CI 大约为零反映了这一点。)
    【解决方案3】:

    如果我正确理解了最初的问题 - 为什么 ACF/PACF 函数返回的 CI 数字与图表上显示的 CI 不匹配(由函数 plot_acf 生成)? 答案很简单 - 图上的 CI 以 0 为中心,它使用的数字与您从 acf/pacf 函数中获得的数字相同。

    【讨论】:

      猜你喜欢
      • 2021-01-03
      • 2020-05-18
      • 1970-01-01
      • 1970-01-01
      • 2021-04-15
      • 2017-09-08
      • 1970-01-01
      • 2020-06-25
      • 2018-01-01
      相关资源
      最近更新 更多