【问题标题】:Rolling window slider::slide() with grouped data带有分组数据的滚动窗口滑块::slide()
【发布时间】:2021-05-07 06:56:50
【问题描述】:

在以下示例中,我尝试从时间 t = 1 到 t 的线性模型计算第一个系数。这是一个不断扩大的滚动窗口。

它适用于未分组的数据,但按大小写分组时,我收到错误Error: Columncoef1must be length 10 (the group size) or one, not 30

如何处理分组数据?

library(dplyr)
library(slider)

get_coef1 <- function(data) {
  coef1 <- lm(data = data, r1 ~ r2 + r3) %>% 
    coef() %>%
    .["r2"] %>% 
    unname()

  return(coef1)
}

data <- tibble(t = rep(1:10, 3), 
               case = c(rep("a", 10), rep("b", 10), rep("c", 10)),
               r1 = rnorm(30),
               r2 = rnorm(30),
               r3 = rnorm(30))

data %>% 
  # ungroup() %>%
  group_by(case) %>%
  mutate(coef1 = slider::slide_dbl(., ~get_coef1(.x),
                               .before = Inf, .complete = T))

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您必须首先tidyr::nest 案件。在嵌套的tibbles(通过purrr::map 访问)中,您可以应用slide(与purrr::map 相同的技术)。重要的一点是,您不想跨案例slide,而只希望在案例内。

    library(dplyr)
    library(tidyr)
    library(purrr)
    library(slider)
    
    get_coef1 <- function(data) {
      coef1 <- lm(data = data, r1 ~ r2 + r3) %>% 
        coef() %>%
        .["r2"] %>% 
        unname()
    
      return(coef1)
    }
    
    data <- tibble(t = rep(1:10, 3), 
                   case = c(rep("a", 10), rep("b", 10), rep("c", 10)),
                   r1 = rnorm(30),
                   r2 = rnorm(30),
                   r3 = rnorm(30))
    
    data %>% 
      # ungroup() %>%
      group_by(case) %>% nest() %>%
      mutate(rollreg = map(data, ~ .x %>% mutate(coef1 = slider::slide_dbl(., ~get_coef1(.x), .before = Inf, .complete = TRUE)))) %>%
      select(-data) %>% unnest(rollreg)
    

    我一直在尝试使用 dplyr 1.0.0 中的新 dplyr::nest_by() 尝试将 summariserowwise 案例结合使用,但无法使其正常工作。

    【讨论】:

      【解决方案2】:

      我知道这是一篇旧帖子,但为了完整起见,我提供了另一种解决方案。这是你要找的吗? slide_dbl 的参数有两个细微的变化。代码运行。

      data %>% 
        # ungroup() %>%
        group_by(case) %>%
        mutate(coef1 = slider::slide_dbl(.x = cur_data(), # use cur_data() instead of .; arg .x
                                         .f = ~get_coef1(.x), # arg .f
                                     .before = Inf, .complete = T))
      

      请参阅 slider() 文档了解基本原因。

      【讨论】:

        猜你喜欢
        • 2021-04-02
        • 2018-03-02
        • 1970-01-01
        • 1970-01-01
        • 2017-04-03
        • 1970-01-01
        • 1970-01-01
        • 2011-12-16
        • 1970-01-01
        相关资源
        最近更新 更多