在 R 中使用 group_by 的 acf 函数

acf function using group_by in R

我有一个包含 5 个变量的数据框。这些数据是几年的,我将它们按季节分组。我想计算每个季节 5 个变量之间的互相关和滞后相关。我如何使用 R 中的 acf 函数执行此操作?我找到了一些示例,但它们仅使用 'cor' 函数或 'lag' 函数给出了两个变量之间的相关性。由于我有 5 个变量,我可以使用 acf 函数,它可以给出所有变量之间的交叉和滞后相关性,但我不知道如何将它与 dplyr 包中的 group_by 一起使用。我认为在 R 中必须有优雅的方法来做到这一点。数据框看起来像:

 Season   Res1      Res2       Res3      Res4      Res5
 summer   4.4336    4.8965    31.4385   -0.6288   -1.1579
 summer   2.5130    3.7541    -2.2947   12.4083   -0.6241
      .        .         .          .         .         .                         
      .        .         .          .         .         .

例如,我可以使用 acf 计算整个数据的相关性。如果我将 5 个变量作为矩阵 Resdf 那么我可以这样做:

M<-acf(Resdf,lag.max =1,type ="correlation",plot=TRUE)

这将给出 5 个变量之间的互相关和滞后 1 相关。我可以将互相关提取为 M0<-M$acf[1,,],将滞后 1 相关提取为 M1<-M$acf[2,,],这将给出这样的 5x5 矩阵:

>M0
           [,1]       [,2]       [,3]       [,4]       [,5]
[1,]  1.0000000  0.8606853  0.0500022 -0.3440501 -0.1709415
[2,]  0.8606853  1.0000000  0.2662694 -0.5228191 -0.2376250
[3,]  0.0500022  0.2662694  1.0000000 -0.5710574 -0.2005080
[4,] -0.3440501 -0.5228191 -0.5710574  1.0000000  0.2163159
[5,] -0.1709415 -0.2376250 -0.2005080  0.2163159  1.0000000

和 lag-1 相关性为

> M1
            [,1]          [,2]       [,3]       [,4]        [,5]
[1,]  0.72688806  0.7648605807  0.2416748 -0.4725366 -0.24970773
[2,]  0.66442943  0.7413684874  0.3125458 -0.4918965 -0.25046233
[3,] -0.06882386  0.0002300747  0.2523668 -0.1015463 -0.01341474
[4,] -0.13060710 -0.2369795768 -0.3061068  0.4032776  0.12751785
[5,] -0.10527689 -0.1044584694 -0.1070397  0.1025203  0.33448922

有什么方法可以用这种方式使用 acf 来获得 4 个季节的相关矩阵吗?

遵循您的格式的示例数据:

set.seed(1)
df <- data.frame(Season=c(rep("spring",3),rep("summer",3)),
                 Res1=rnorm(6))

df1 <- df %>% mutate(Res2=Res1+(rnorm(6)*0.1),
                     Res3=Res1+(rnorm(6)*0.2),
                     Res4=Res1+(rnorm(6)*0.3),
                     Res5=Res1+(rnorm(6)*0.4))

使用tidyverse nest对分组数据框执行'complex'操作。我在第一个 mutate...map 中执行 acf,然后在第二个 mutate...map:

中提取 acf[1,,]acf[2,,] 并转换为数据帧
library(tidyverse)
df2 <- df1 %>% 
          group_by(Season) %>%
          nest() %>% 
          mutate(data = map(data, ~acf(., lag.max=1, type="correlation", plot=F))) %>%
          mutate(data = map(data, ~as.data.frame(rbind(.x$acf[1,,], .x$acf[2,,])))) %>%
          unnest(data)

前10行输出:

   Season            V1           V2           V3           V4            V5
 1 spring  1.000000e+00  0.999926654  0.888928901  0.999945732  0.9501684141
 2 spring  9.999267e-01  1.000000000  0.894411297  0.999998566  0.9463231324
 3 spring  8.889289e-01  0.894411297  1.000000000  0.893652539  0.7018425064
 4 spring  9.999457e-01  0.999998566  0.893652539  1.000000000  0.9468691987
 5 spring  9.501684e-01  0.946323132  0.701842506  0.946869199  1.0000000000
 6 spring -6.415051e-01 -0.649989355 -0.892898812 -0.648808668 -0.3899507753
 7 spring -6.360042e-01 -0.644491958 -0.888124854 -0.643310737 -0.3846451323
 8 spring -3.639938e-01 -0.371690371 -0.615653299 -0.370617371 -0.1470652339
 9 spring -6.367791e-01 -0.645266390 -0.888800271 -0.644085234 -0.3853904576
10 spring -7.499137e-01 -0.757869871 -0.969595555 -0.756763981 -0.5063447715

summer 跟随在完整的数据框中。每个season的第一个5 rows包含acf[1,,],后面的5 rows包含acf[2,,]