使用tidyverse查找横截面相关性的时间序列方法

时间:2018-05-21 18:57:24

标签: r tidyverse

我试图找到年度横截面相关性的时间序列平均值。

tidyverse之前,我会:

  1. dat转换为年度数据框列表
  2. 使用lapply()查找年度横断面相关性
  3. 使用Reduce()手动查找手段
  4. 此逻辑有效,但不是tidy

    set.seed(2001)
    dat <- data.frame(year = rep(2001:2003, each = 10),
                      x = runif(3*10))
    dat <- transform(dat, y = 5*x + runif(3*10))
    dat_list <- split(dat[c('x', 'y')], dat$year)
    dat_list2 <- lapply(dat_list, cor)
    dat2 <- Reduce('+', dat_list2) / length(dat_list2)
    dat2
    
    ##           x         y
    ## x 1.0000000 0.9772068
    ## y 0.9772068 1.0000000
    

    对于tidyerse解决方案,我最好的(也是失败的)尝试是:

    1. group_by() year变量
    2. 每年使用do()cor()
    3. 使用map()mean()查找元素方式
    4. 此逻辑失败并返回NULL

      library(tidyverse)
      dat2 <- dat %>%
        group_by(year) %>% 
        do(cormat = cor(.$x, .$y)) %>% 
        map(.$cormat, mean)
      dat2
      
      ## $year
      ## NULL
      ## 
      ## $cormat
      ## NULL
      

      上面的非tidyverse解决方案中是否有Reduce()个成语替换tidyverse成语?

1 个答案:

答案 0 :(得分:1)

dat %>% 
  group_by(year) %>% 
  do(correl = cor(.data[c('x', 'y')])) %>% 
  {reduce(.$correl, `+`)/nrow(.)}



          x         y
x 1.0000000 0.9772068
y 0.9772068 1.0000000

请注意,这与cor(dat[c('x', 'y')])完全相同,因此,除非您需要每年单独使用矩阵,否则无需按年分组,然后减少。这也适用于> 2个变量。