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