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

Posted

技术标签:

【中文标题】R与python中的ACF置信区间:为啥它们不同?【英文标题】:ACF confidence intervals in R vs python: why are they different?R与python中的ACF置信区间:为什么它们不同? 【发布时间】:2017-03-27 11:56:23 【问题描述】:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

正如您所发现的,在 R 中,所有k 的方差简单地计算为Var(r(k)) = 1/N。而在 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 之后“剪尾”。

【讨论】:

感谢您的澄清!但是,使用 R 或 python 实现时最终有什么区别吗?或者其他人说:一开始是弯曲的有关系吗?尽管如此,它们似乎提供了相同的结果。【参考方案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)。

【讨论】:

谢谢 Ben -- 是的,我也发现了这一点,但仍然想知道该理论以及哪种方法“更好”。

以上是关于R与python中的ACF置信区间:为啥它们不同?的主要内容,如果未能解决你的问题,请参考以下文章

你如何计算 Python 中 Pearson's r 的置信区间?

R - 对每组数据使用不同的模型进行预测和置信区间

Python数据框中的置信区间

R语言中固定与随机效应Meta分析 - 效率和置信区间覆盖

置信椭圆与R画法

r语言中acf函数的xaxp参数是啥意思