当我在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水平线。但是,我想了解奇特的曲线置信区间。
答案 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
之后“削减尾巴”。