R中的小组ACF

时间:2016-05-19 13:59:06

标签: r time-series

我想计算按分组变量分组的时间序列的acf。具体来说,我有一个包含单个时间序列(变量a)和分组变量(例如工作日,变量b)的数据框。这是一个例子:

data <- data.frame(a=rnorm(1:150), b=rep(rep(1:3, each=5), 10))

现在,我想计算分组变量的不同值的acf。例如,对于滞后2和组1,我想得到仅在时间点t上计算的t和t-2之间的相关性,其中b = 1(t-2的b值无关紧要)。我知道函数acf可以很容易地计算出acf,但我找不到包含分组变量的方法。

我可以手动计算所需的相关性,但由于我有一个大的数据集和分组变量的大量滞后和值,我希望有更优雅和更快的方式。以下是上述示例的手动计算(滞后2,b = 1):

sel <- which(data$b==1)
cor(data$a[sel[sel > 2]], data$a[sel[sel>2] - 2])

3 个答案:

答案 0 :(得分:1)

我感兴趣的是我现在选择了手动计算:

getacfgroup <- function(ts, lag, groupvar, group) {
  sel <- which(groupvar == group)
  cor(ts[sel[sel > lag]], ts[sel[sel>lag] - lag])
}

然后我使用该函数以下列方式计算滞后2和b = 1的期望值:

getacfgroup(data$a, 2, data$b, 1)

为了获得所有滞后的值,我只是在一个公开的电话中包裹所有内容,并在另一个lapply电话中包含所有滞后和组。

编辑:如果有人有更优雅的解决方案,我仍然会感兴趣。

答案 1 :(得分:1)

我不确定我到底知道您正在寻找什么信息但是如果您只想要多个组的acf值,那么这应该可以实现。有些人提到创建tidy解决方案,并使用dplyrtidyrpurrr进行分组计算。

library(dplyr)
library(tidyr)
library(purrr)

sample_data <- dplyr::data_frame(group = sample(c("a", "b", "c"), size = 100, replace = T), value = sample.int(30, size = 100, replace = T)) 
head(sample_data)
#> # A tibble: 6 × 2
#>   group value
#>   <chr> <int>
#> 1     c    28
#> 2     c     9
#> 3     c    13
#> 4     c    11
#> 5     a     9
#> 6     c     9

grouped_acf_values <- sample_data %>%
  tidyr::nest(-group) %>%
  dplyr::mutate(acf_results = purrr::map(data, ~ acf(.x$value, plot = F)),
         acf_values = purrr::map(acf_results, ~ drop(.x$acf))) %>%
  tidyr::unnest(acf_values) %>%
  dplyr::group_by(group) %>%
  dplyr::mutate(lag = seq(0, n() - 1))

head(grouped_acf_values)
#> Source: local data frame [6 x 3]
#> Groups: group [1]
#> 
#>   group  acf_values   lag
#>   <chr>       <dbl> <int>
#> 1     c  1.00000000     0
#> 2     c -0.20192774     1
#> 3     c  0.07191805     2
#> 4     c -0.18440489     3
#> 5     c -0.31817935     4
#> 6     c  0.06368096     5

答案 2 :(得分:0)

您可以查看split以便在数据桶中分隔您的data.frame,然后lapply将您的函数应用于每个组。类似的东西:

groups_data <- split(data, data$b)
groups_acf <- lapply(groups_data, acf,...)

然后你必须从输出列表中提取所需的信息,例如`sapply(groups,acf,FUN = function(acfobject){acfobject $ value})

对于小组计算,我也肯定会用%>%运算符和group_by以新的方式“la la”Hadley Wickham。在我的待办事项清单上学习...