代码之家  ›  专栏  ›  技术社区  ›  Richard Herron

利用tidyverse寻找横截面相关的时间序列方法

  •  2
  • Richard Herron  · 技术社区  · 8 年前

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

    以前 tidyverse ,我会:

    1. 转换 dat 年度数据框架列表
    2. 使用 lapply() 找出年度横截面相关性
    3. 使用 Reduce() 手动查找方法

    这种逻辑是可行的,但不是 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() 找到元素的方法

    这个逻辑失败并返回 NULL .

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

    有没有 泰迪弗斯 用成语代替 减少() 我的习惯用语- 泰迪弗斯 上面的解决方案?

    1 回复  |  直到 8 年前
        1
  •  1
  •   IceCreamToucan    8 年前
    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个变量。