R 与 python 中的 ACF 置信区间:为什么它们不同?

era*_*oul 8 python statistics r time-series

当我acf在 R 中使用该函数时,它会绘制水平线,代表各种滞后的自相关的置信区间(默认为 95%): 射频消融

但是,当我statsmodels.graphics.tsaplots.plot_acf在 python 中使用时,我看到一个基于更复杂计算的弯曲置信区间: 蟒蛇

请注意,在 R 版本中,延迟到延迟 25 被认为是显着的。对于相同的数据,在 python 版本中,只有到 20 的滞后才被认为是显着的。

这两种方法有什么区别,我应该更信任哪一种?有人可以解释由 计算的非常数置信区间的理论statsmodels.tsa.stattools.acf吗?

我知道我可以通过简单地绘制类似的东西来重现 R 水平线y=[+/-]1.96 / np.sqrt(len(data))。但是,我想了解花哨的弯曲置信区间。

小智 12

已经表明,自相关系数r(k)服从方差为 的高斯分布Var(r(k))

正如您所发现的,在 R 中,方差的计算方式与Var(r(k)) = 1/Nall 一样k。而在 python 中,方差是使用 Bartlett 公式计算的,其中Var(r(k)) = 1/N (1 + 2(r(1)^2+r(2)^2+...+r(k-1)^2)). 这导致上面显示的置信水平首先增加,然后趋于平缓。

python中ACF方差的源代码:

varacf = np.ones(nlags + 1) / nobs
varacf[0] = 0
varacf[1] = 1. / nobs
varacf[2:] *= 1 + 2 * np.cumsum(acf[1:-1]**2)
Run Code Online (Sandbox Code Playgroud)

这两个不同的公式基于不同的假设。前者假定独立同分布过程,r(k) = 0为所有k != 0,而后者假定MA过程与订单k-1滞后之后,其中ACF“切尾巴” k