【问题标题】:Why manual autocorrelation does not match acf() results?为什么手动自相关与 acf() 结果不匹配?
【发布时间】:2019-08-16 10:16:07
【问题描述】:

我正在尝试了解 acf 和 pacf。但是不明白为什么 acf() 结果不匹配简单的 cor() 和 lag1

我模拟了一个时间序列

set.seed(100)
ar_sim <- arima.sim(list(order = c(1,0,0), ar = 0.4), n = 100)

ar_sim_t <- ar_sim[1:99]
ar_sim_t1 <- ar_sim[2:100]

cor(ar_sim_t, ar_sim_t1)   ## 0.1438489
acf(ar_sim)[[1]][2]        ## 0.1432205

您能否解释一下为什么 acf() 中的第一个滞后相关性与系列和 lag1 之间的手动 cor() 不完全匹配?

【问题讨论】:

  • 您好,我认为您的代码应该是ar_sim_t &lt;- ar_sim[1:99]ar_sim_t1 &lt;- ar_sim[2:100]。区别仍然存在,至少它有效
  • @Chelmy88 对不起,你说得对,我确实按照你说的做了,请随时检查

标签: r autocorrelation


【解决方案1】:

估计具有已知均值和方差的离散过程的自相关的正确方法如下。例如,参见Wikipedia

n <- length(ar_sim)
l <- 1
mu <- mean(ar_sim)
s <- sd(ar_sim)

sum((ar_sim_t - mu)*(ar_sim_t1 - mu))/((n - l)*s^2)
#[1] 0.1432205

这个值不是identical 到内置stats::acf 计算的值,但非常接近。

a.stats <- acf(ar_sim)[[1]][2]
a.manual <- sum((ar_sim_t - mu)*(ar_sim_t1 - mu))/((n - l)*sd(ar_sim)^2)

all.equal(a.stats, a.manual)  # TRUE
identical(a.stats, a.manual)  # FALSE

a.stats - a.manual
#[1] 1.110223e-16

【讨论】:

  • 可能是R中实现的cor函数除以n而不是n-1
  • @Chelmy88 计算是在 C 语言函数中进行的。但也许不是,stats::acf 计算的函数与上面的手动计算之间的差异在浮点精度范围内。
  • 重现cor给出的结果:mn0 &lt;- mean(ar_sim_t); mn1 &lt;- mean(ar_sim_t1); cov01 &lt;- sum((ar_sim_t-mn0)*(ar_sim_t1-mn1))/(n-2); cov01/(sd(ar_sim_t)*sd(ar_sim_t1))
  • 请记住,在cor 中,您使用的是n-1 长度的2 个向量,因此在cov01 中,分母是(n-1)-1
  • @DonDani 不,不应该,他们使用不同的公式,因为他们正在计算不同的东西。查看我的答案以及这些 cmets:12
猜你喜欢
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-13
相关资源
最近更新 更多