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置信区间:为啥它们不同?的主要内容,如果未能解决你的问题,请参考以下文章