Statsmodels PACF 图置信区间与 PACF 函数不匹配
Statsmodels PACF plot confidence interval does not match PACF function
我有一个时间序列在观察偏自相关 (PACF) 图时似乎有明显的滞后,即 PACF 值大于蓝色置信区间。我想以编程方式验证这一点,但它似乎不起作用。
我用 statsmodels 时间序列绘制了 PACF 图 api,这表明第一个滞后是显着的。所以,我使用 PACF estimation to get the PACF values along with the confidence interval at each point, but the confidence intervals between the two don't match up. What's even more odd is 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参考:
滞后 0 的 PACF 始终为 1(参见 here),因此其置信区间为 [1,1]。
the code snippet 的最后一行确保了这一点,其中计算了 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
(另请参阅 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')
根据代码:
stattools.pacf
计算估计 pacf 周围的置信区间,即它以实际值为中心
graphics.tsa.plot_pacf
取该置信区间并减去估计的 pacf,因此置信区间以零为中心。
我不知道也不记得为什么这样做了。
在示例中,所有滞后大于或等于 2 的 pacf 都接近于零,因此绘图与 stattools.pacf 的结果之间没有明显差异。
如果我正确理解了最初的问题 - 为什么 ACF/PACF 函数返回的 CI 数字与图表上显示的 CI 不匹配(由函数 plot_acf 生成)?
答案很简单 - 图上的 CI 以 0 为中心,它使用的数字与您从 acf/pacf 函数中获得的数字相同。
我还是不明白答案。通过查看我自己的数据,我了解到图表以零为中心,但描绘了值 as-is。这不就是把两个不同的天平合二为一吗?您不应该选择 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)。
我有一个时间序列在观察偏自相关 (PACF) 图时似乎有明显的滞后,即 PACF 值大于蓝色置信区间。我想以编程方式验证这一点,但它似乎不起作用。
我用 statsmodels 时间序列绘制了 PACF 图 api,这表明第一个滞后是显着的。所以,我使用 PACF estimation to get the PACF values along with the confidence interval at each point, but the confidence intervals between the two don't match up. What's even more odd is 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参考:
滞后 0 的 PACF 始终为 1(参见 here),因此其置信区间为 [1,1]。
the code snippet 的最后一行确保了这一点,其中计算了 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
(另请参阅 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')
根据代码:
stattools.pacf
计算估计 pacf 周围的置信区间,即它以实际值为中心graphics.tsa.plot_pacf
取该置信区间并减去估计的 pacf,因此置信区间以零为中心。
我不知道也不记得为什么这样做了。
在示例中,所有滞后大于或等于 2 的 pacf 都接近于零,因此绘图与 stattools.pacf 的结果之间没有明显差异。
如果我正确理解了最初的问题 - 为什么 ACF/PACF 函数返回的 CI 数字与图表上显示的 CI 不匹配(由函数 plot_acf 生成)? 答案很简单 - 图上的 CI 以 0 为中心,它使用的数字与您从 acf/pacf 函数中获得的数字相同。
我还是不明白答案。通过查看我自己的数据,我了解到图表以零为中心,但描绘了值 as-is。这不就是把两个不同的天平合二为一吗?您不应该选择 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)。