Слайдер скользящего окна :: slide () с сгруппированными данными - PullRequest
0 голосов
/ 23 апреля 2020

В следующем примере я пытаюсь вычислить первый коэффициент из линейной модели для времени t = 1 до t. Это расширяющееся скользящее окно.

Хорошо работает с несгруппированными данными, но при группировке по регистру я получаю сообщение об ошибке Error: Column coef1 must 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))

1 Ответ

1 голос
/ 24 апреля 2020

Вы должны сначала 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::nest_by() из dplyr 1.0.0, пытаясь использовать summarise в сочетании с rowwise делами, но не смог заставить это работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...