在R中使用group_by的acf函数

时间:2017-07-10 17:25:57

标签: r dplyr plyr cross-correlation

我有一个包含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

和滞后-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

有没有什么方法可以用这种方式来获取4个季节的相关矩阵?

1 个答案:

答案 0 :(得分:1)

遵循格式的示例数据:

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来执行复杂的&#39;对分组数据框的操作。我在第一个acf中执行mutate...map,然后提取acf[1,,]acf[2,,]并转换为第二个mutate...map中的数据框:

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。每个5 rows的第一个season包含acf[1,,],以下5 rows包含acf[2,,]