Имея tsibble с более чем одним ключом, могут ли tidyverts использовать box_cox () для каждого временного ряда, используя соответствующее значение lambda_guerrero для каждого временного ряда?

Мой вопрос: если бы у меня был tsibble с более чем одним ключом (n_keys ›1) и одной или несколькими ключевыми переменными (key_vars› = 1), может ли набор tidyverts выполнить box_cox преобразование для каждого временного ряда (одно преобразование box_cox на временной ряд) с использованием соответствующего значения lambda_guerrero для каждого временного ряда? Ниже моя (первая) попытка минимально воспроизводимого примера.

Например: Мне интересно, возможен ли шаг 5 с использованием набора tidyverts без получения сообщения об ошибке. Вместо того, чтобы применять лямбда1 = 0,36 к льготному, общему и агрегированному, как показано на шаге 4 без ошибок, я хотел бы применить 0,25 к льготному, 0,66 к общему и 0,36 к агрегированному, если это возможно.

Спасибо!

library(tidyverse) 
library(lubridate)
library(tsibble)
library(tsibbledata)
library(fabletools)
library(fable)
library(feasts)
library(distributional)

шаг 1: один ключ, без преобразования:

tsibbledata::PBS %>% summarize(Cost = sum(Cost)) %>% autoplot(Cost)

шаг 2: один ключ с преобразованием:

Аналогично примеру из FPP3, глава 3.1. Для справки: https://otexts.com/fpp3/transformations.html.

lambda1 <- tsibbledata::PBS %>% 
summarize(Cost = sum(Cost)) %>%
features(Cost, features = guerrero) %>% 
pull(lambda_guerrero) # [1] 0.3642197

tsibbledata::PBS %>% summarize(Cost = sum(Cost)) %>% autoplot(box_cox(Cost,lambda1))

шаг 3: три ключа без преобразования:

tsibbledata::PBS %>% aggregate_key(Concession, Cost = sum(Cost)) %>% autoplot(Cost)

шаг 4: три ключа с одним преобразованием:

tsibbledata::PBS %>%
aggregate_key(Concession, Cost = sum(Cost)) %>% 
autoplot(box_cox(Cost,lambda1))

Шаг 5: три ключа с тремя преобразованиями:

lambda2 <- tsibbledata::PBS %>% 
aggregate_key(Concession, Cost = sum(Cost)) %>%
features(Cost, features = guerrero) %>% 
pull(lambda_guerrero) # [1] 0.2518823 0.6577645 0.3642197
lambda2
A tibble: 3 x 2
Concession   lambda_guerrero
<chr*>                 <dbl>
1 Concessional           0.252
2 General                0.658
3 <aggregated>           0.364

tsibbledata::PBS %>%
  aggregate_key(Concession, Cost = sum(Cost)) %>%
  autoplot(box_cox(Cost,lambda2)) # caused an error

person John Paul B    schedule 08.01.2021    source источник


Ответы (1)


Проблема с вашей последней попыткой связана с длиной значений, введенных в box_cox(Cost, lambda2). Cost имеет длину 612 (204 наблюдения для 3 серий), а lambda2 имеет длину 3. Таким образом, R попытается воспроизвести значения в лямбда2, чтобы длины совпадали (это называется повторным использованием).

Однако в данном случае он делает это неправильно. Он сопоставляет Cost[1] с lambda2[1] (правильно), Cost[2] с lambda2[2] (неверно), Cost[3] с lambda2[3] (неверно), Cost[3] с lambda2[1] (правильно) и т.д. lambda2[3], значит, нам нужно это обеспечить.

Это можно сделать с помощью rep(lambda2, each = 204), однако лучший / самый безопасный подход - использовать операцию соединения. Это гарантирует, что параметр соответствует правильной серии (и предотвращает проблемы с упорядочением строк). В приведенном ниже коде показано, как это можно сделать с помощью left_join(), который сопоставляет значения лямбда с данными на основе столбца Concession. Обратите внимание, что график выглядит не очень хорошо, поскольку преобразования (и данные) производят значения в очень разных масштабах. Чтобы исправить это, я рекомендую выполнить фасетирование для создания разных масштабов по оси Y для каждой серии (как это также сделано ниже).

library(fpp3)
lambda2 <- tsibbledata::PBS %>%
  aggregate_key(Concession, Cost = sum(Cost)) %>%
  features(Cost, features = guerrero)

lambda2
#> # A tibble: 3 x 2
#>   Concession   lambda_guerrero
#>   <chr*>                 <dbl>
#> 1 Concessional           0.252
#> 2 General                0.658
#> 3 <aggregated>           0.364

tsibbledata::PBS %>%
  aggregate_key(Concession, Cost = sum(Cost)) %>%
  # Add lambda to the dataset, matching based on the key variable
  left_join(lambda2, by = "Concession") %>% 
  autoplot(box_cox(Cost, lambda_guerrero))

tsibbledata::PBS %>%
  aggregate_key(Concession, Cost = sum(Cost)) %>%
  # Add lambda to the dataset, matching based on the key variable
  left_join(lambda2, by = "Concession") %>% 
  autoplot(box_cox(Cost, lambda_guerrero)) + 
  facet_grid(rows = vars(Concession), scales = "free_y")

Создано 2021-01-09 пакетом REPEX (v0.3.0)

person Mitchell O'Hara-Wild    schedule 08.01.2021