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

时间:2016-11-13 20:53:35

标签: python r statistics time-series

当我在R中使用acf函数时,它绘制了表示各种滞后的自相关的置信区间(默认为95%)的水平线: R ACF

然而,当我在python中使用statsmodels.graphics.tsaplots.plot_acf时,我会看到基于更复杂计算的弯曲置信区间: python ACF

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

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

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

2 个答案:

答案 0 :(得分:2)

这不是理论部分的答案(在CrossValidated上可能会更好),但也许有用......?

如果您转到documentation page for statsmodels.tsa.stattools.acf,它会为您提供browse the source code的选项。那里的代码是:

varacf = np.ones(nlags + 1) / nobs
varacf[0] = 0
varacf[1] = 1. / nobs
varacf[2:] *= 1 + 2 * np.cumsum(acf[1:-1]**2)
interval = stats.norm.ppf(1 - alpha / 2.) * np.sqrt(varacf)
confint = np.array(lzip(acf - interval, acf + interval))

相反,R source code for plot.acf显示

clim0 <- if (with.ci) qnorm((1 + ci)/2)/sqrt(x$n.used) else c(0, 0)

其中ci是置信度(默认值= 0.95)。

答案 1 :(得分:2)

已经证明,自相关系数r(k)遵循方差为Var(r(k))的高斯分布。

您已经发现,在R中,对于所有Var(r(k)) = 1/N,方差都简单地计算为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)

这两个不同的公式基于不同的假设。前者假设一个i.i.d进程,而所有r(k) = 0则假设k != 0,而后者则假设MA过程的顺序为k-1,其中ACF在滞后k之后“削减尾巴”。