R中按组排列的ACF

p3rjfoxz  于 2023-01-18  发布在  其他
关注(0)|答案(3)|浏览(125)

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

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

现在,我想计算分组变量的不同值的acf。例如,对于滞后2和组1,我想获得t和t-2之间的相关性,该相关性仅在b=1的时间点t上计算(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])
6l7fqoea

6l7fqoea1#

如果时间序列对象是一个tsible,那么下面的代码就很有效:假设数据框名为df,您感兴趣的变量名为var,您可以另外指定max lag
df %>% group_by(Region) %>% ACF(var, lag_max = 18) %>% autoplot()

uz75evzq

uz75evzq2#

我不确定我是否完全理解您要查找的信息,但如果您只需要多个组的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
2exbekwf

2exbekwf3#

你可以用split把 Dataframe 分成桶,然后用lapply把你的函数应用到每一组。

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

然后,您必须从输出列表中提取所需的信息,例如使用'sapply(groups,acf,FUN=function(acfobject){acfobject$value})
对于群的计算,我也肯定会用新的方法“à la”Hadley威克姆的%>%算子和group_by;学习我的待办事项。

相关问题