为了账号安全,请及时绑定邮箱和手机立即绑定

Statsmodels PACF 图置信区间与 PACF 函数不匹配

Statsmodels PACF 图置信区间与 PACF 函数不匹配

繁花如伊 2022-11-24 15:18:21

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

我用 statsmodels 时间序列 api 绘制了 PACF 图,这表明第一个滞后是显着的。因此,我使用PACF 估计来获取 PACF 值以及每个点的置信区间,但两者之间的置信区间不匹配。更奇怪的是源代码中的绘图函数使用了底层估计函数,因此它们应该匹配。

例子:

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()

http://img2.sycdn.imooc.com/637f1add0001633a06570559.jpg

这表明第一个滞后非常显着,约为 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]]))

这是怎么回事?


查看完整描述

4 回答

?
慕勒3428872

TA贡献0条经验 获得超4个赞

根据代码:

  • stattools.pacf计算估计 pacf 周围的置信区间,即它以实际值为中心

  • graphics.tsa.plot_pacf取该置信区间并减去估计的 pacf,因此置信区间以零为中心。

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

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


查看完整回答
反对 回复 2022-11-24
?
茅侃侃

TA贡献1557条经验 获得超21个赞

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


这是由计算 CI的代码片段的最后一行确保的:


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

(另请参阅问题 1969,其中已解决此问题)。


由于 0 滞后没有意义,您通常使 PACF 图从滞后 1 开始(如 R 的pacf 函数)。这可以通过以下方式实现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')

//img1.sycdn.imooc.com/637f1af50001467f06020460.jpg

查看完整回答
反对 回复 2022-11-24
?
慕盖茨4494581

TA贡献1575条经验 获得超11个赞

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



查看完整回答
反对 回复 2022-11-24
?
炎炎设计

TA贡献1532条经验 获得超1个赞

我仍然不遵循答案。通过查看我自己的数据,我了解到图表以零为中心,但按原样描绘了值。这不就是把两个不同的天平合二为一吗?您不应该选择 1:原始值与原始 CI(块 1),或者将值视为 0,CI 以零为中心(块 2)?

下图说明了我的观点:

第一个块: statsmodels.tsa.stattools.acf(df,nlags=10,alpha=0.05,fft=True)。

第二块: LCL-value和UCL-value减去值,与0比较。

第三块:匹配图表 sm.graphics.tsa.plot_acf(df, zero=False, lags = 10, alpha=0.05) 将显示:调整后的 LCL 和 UCL,但原始值。

如您所见,“原始”方式没有显着结果(eval、eval_w_0),但我从图中得到了显着结果(eval_adj)。

//img3.sycdn.imooc.com/637f1b07000196a509930378.jpg

查看完整回答
反对 回复 2022-11-24

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信