Создание срезов перекрестной проверки временных рядов с помощью ключа в пакете tidyverts - PullRequest
0 голосов
/ 06 мая 2020

Есть ли способ создавать наборы перекрестной проверки временных рядов по ключу с помощью пакета tidyverts? Кажется, я не могу понять это правильно. Ниже представлен пример моей попытки.

Пример включает создание перекрестной проверки временных рядов (срезы с шагом на 1 шаг вперед) для прогнозирования. Ключевая переменная имеет 2 разных значения, и я хотел бы иметь один тиббл, содержащий срезы временных рядов для обоих ключей. Когда я пытаюсь связать оба тиббла в ряд, я получаю сообщение об ошибке.

library(dplyr)
library(tibble)
library(tsibble)

# helper function
create_cv_slices <- function(data, forecast_horizon) {
  data %>%
    dplyr::slice(1:(nrow(data) - forecast_horizon)) %>%
    tsibble::stretch_tsibble(.init = nrow(data) - 2 * forecast_horizon, .step = 1)
}

# get data
raw_tsbl <- tibble::tribble(
  ~index,      ~key,    ~Revenue,     ~Claims,
  20160101, "series1",  11011836.1, 5386836.696,
  20160201, "series1", 11042641.16, 9967325.715,
  20160301, "series1", 11445687.52, 10947197.89,
  20160401, "series1", 11252943.11, 6980431.415,
  20160101, "series2",    12236155,    12526224,
  20160201, "series2",     8675364,     9812904,
  20160301, "series2",    10081130,     8423497,
  20160401, "series2",    14840111,     8079813
) %>%
  dplyr::mutate(index = tsibble::yearmonth(as.character(index))) %>%
  tsibble::as_tsibble(index = index, key = key)

keys <- unique(raw_tsbl$key)

# split & combine
tbl1 = raw_tsbl %>%
  dplyr::filter(key == keys[1]) %>%
  create_cv_slices(., forecast_horizon = 1) %>%
  tibble::as_tibble()

tbl2 = raw_tsbl %>%
  dplyr::filter(key == keys[2]) %>%
  create_cv_slices(., forecast_horizon = 1) %>%
  tibble::as_tibble()

dplyr::bind_rows(tbl1, tbl2) %>%
  tsibble::as_tsibble(index = index, key = key)
#> Error: A valid tsibble must have distinct rows identified by key and index.
#> Please use `duplicates()` to check the duplicated rows.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Вместо того, чтобы вручную разделять данные по ключам, вы можете вычислять свои срезы по группам тсиббла. group_by_key() - это удобная функция (с большей производительностью), эквивалентная group_by(key). Функция n() - это функция dplyr с поддержкой группы, которая дает количество наблюдений для текущей группы. * (v0.3.0)

Небольшая разница в этом коде состоит в том, что .init установлено на 2, а не nrow(data)-2*forecast_horizon. Для этих данных он дает тот же результат, однако количество наблюдений для каждого ключа различаться не будет. После выпуска dplyr v1.0.0 будет проще использовать такие инструменты, как group_map() или bind_rows(), чтобы использовать подход разделения-применения-комбинирования, необходимый для указания различных параметров окна для каждой клавиши.

0 голосов
/ 06 мая 2020

Похоже, что использование bind_rows для объединения тсибблей не работает. Использование bind_rows и установка validate = FALSE в функции as_tsibble, создает тиббл в порядке, но он отображает тсиббл как дневную серию, а не ежемесячную (как должно быть). Однако при использовании rbind с тем же параметром аргумента создается желаемый тиббл.

rbind(tbl1, tbl2) %>%
  tsibble::as_tsibble(index = index, key = c(key, .id), validate = F)

Спасибо.

...