【问题标题】:R / Time Series: What's the lag unit for autocorrelation function (acf)?R /时间序列:自相关函数(acf)的滞后单位是多少?
【发布时间】:2016-06-12 19:31:53
【问题描述】:

我有一个 XTS 时间序列对象,它在四年内每个月的第一天显示一个值(表示整个月的总和)。

当我在其上运行 stats::acf() 函数时,我得到一个带有数十万滞后(x 轴)单位的图。如果我的时间序列中只有 48 个值,那怎么可能呢?如果是时间单位,那是哪一个,如何更改?

示例代码:

library(dplyr)
library(lubridate)
library(xts)

set.seed(100)

test <- data.frame(y = c(rep(2012, 12), rep(2013, 12), rep(2014, 12), rep(2015, 12)),
                   m = rep(seq(1, 12, 1), 4), d = rep(1, 48), value = runif(48, 0, 100))

test <- test %>%
  mutate(date = ymd(paste(y, m, d, sep = "-"))) %>% 
  select(date, value)

test <- xts(test$value, test$date)

acf(test)

【问题讨论】:

  • acf 为您提供延迟天数的 acf。每天有 86,400 秒,您的日期列采用 POSIXct 格式,即自 1970 年 1 月 1 日以来的秒数。
  • 这似乎是合理的。将延迟除以一天中的秒数得出大致整数。另请参阅下面对 Roland 答案的评论。
  • 虽然在第二个,这似乎仍然很奇怪。被 86400 整除将得出滞后以天为单位的结论。但数据只显示每个月的第一天。 lag 不需要显示月份吗?
  • 是的,我同意。 xts 似乎忽略了 frequency 参数。例如,当我执行test &lt;- xts(test$value, test$date, frequency=30.5*86400)(或frequency 的任何其他值)时,我得到相同的acf 图。此外,frequency(test) 给出相同的结果,无论我在创建 test xts 对象时使用什么 frequency
  • 此外,当我在mutate 语句中使用as.POSIXct 而不是ymd 时,我得到一个acf 图表,其滞后时间以小时为单位,而不是几天。我对xts 不太熟悉,我不确定它为什么会这样或如何改变它。

标签: r time-series xts


【解决方案1】:

从源代码中我们可以看到我们可以这样计算滞后:

sampleT <- as.integer(nrow(test))
nser <- as.integer(ncol(test))
lag.max <- floor(10 * (log10(sampleT) - log10(nser)))
x.freq <- frequency(test)
lag <- outer(0:lag.max, 1/x.freq)
#         [,1]
# [1,]       0
# [2,]   86400
# [3,]  172800
# [4,]  259200
# [5,]  345600
# [6,]  432000
# [7,]  518400
# [8,]  604800
# [9,]  691200
#[10,]  777600
#[11,]  864000
#[12,]  950400
#[13,] 1036800
#[14,] 1123200
#[15,] 1209600
#[16,] 1296000
#[17,] 1382400

时间单位是频率单位的倒数。要了解该值是如何计算的,您需要深入了解frequency.zoo 的源代码,我觉得乍一看很难理解。

【讨论】:

  • 从您的滞后值列表和上面@eipi10 的评论中,现在很明显,这些数字指的是 86400 = 60 x 60 x 24 = 每天的秒数的间隔。 IE。我必须将滞后值除以 86400 才能得到滞后天数。
猜你喜欢
  • 2014-10-08
  • 1970-01-01
  • 2020-03-11
  • 2017-07-21
  • 1970-01-01
  • 2017-12-08
  • 2021-11-24
  • 2019-07-23
  • 1970-01-01
相关资源
最近更新 更多