Не могу превратить циббл в басню

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

Я хочу превратить тсиббл в сказочный объект с помощью:

as_fable

В документации сказано, что это возможно:

## S3 method for class 'tbl_ts'
as_fable(x, response, distribution, ...)

Но когда я указываю входной параметр этой функции, я всегда получаю ошибку.

Пример:

library(tsibbledata)
library(tsibble)
library(fable)
library(fabletools)

aus <- tsibbledata::hh_budget

fit <-  fabletools::model(aus, ARIMA = ARIMA(Debt))

fc_tsibble <- fit %>% 
              fabletools::forecast(., h = 2) %>%
              as_tibble(.) %>% 
              tsibble::as_tsibble(., key = c(Country, .model), index = Year)

fc_tsibble

# A tsibble: 8 x 5 [1Y]
# Key:       Country, .model [4]
  Country   .model  Year        Debt .mean
  <chr>     <chr>  <dbl>      <dist> <dbl>
1 Australia ARIMA   2017  N(215, 21)  215.
2 Australia ARIMA   2018  N(221, 63)  221.
3 Canada    ARIMA   2017   N(188, 7)  188.
4 Canada    ARIMA   2018  N(192, 21)  192.
5 Japan     ARIMA   2017 N(106, 3.8)  106.
6 Japan     ARIMA   2018 N(106, 7.6)  106.
7 USA       ARIMA   2017  N(109, 11)  109.
8 USA       ARIMA   2018  N(110, 29)  110.

class(fc_tsibble)

[1] "tbl_ts"     "tbl_df"     "tbl"        "data.frame"

Принуждение к басне приводит к ошибке:

as_fable(fc_tsibble, response = .mean, distribution = Debt)

Error in eval_tidy(enquo(response)) : object '.mean' not found

Буду безмерно благодарен за любую помощь!

1 ответ

Решение

Это не самое интуитивно понятное сообщение об ошибке, но я уже сталкивался с этим раньше с этой функцией. Вы действительно должны пройти Debtк обоим аргументам. Я считаю, что сообщение об ошибке ссылается на .mean из-за ошибки, вызванной внутренней функцией.

library(tsibbledata)
library(tsibble)
library(fable)
library(fabletools)

aus <- tsibbledata::hh_budget

fit <-  fabletools::model(aus, ARIMA = ARIMA(Debt))

fc_tsibble <- fit %>% 
  fabletools::forecast(., h = 2) %>%
  as_tibble(.) %>% 
  tsibble::as_tsibble(., key = c(Country, .model), index = Year)

fc_tsibble
#> # A tsibble: 8 x 5 [1Y]
#> # Key:       Country, .model [4]
#>   Country   .model  Year        Debt .mean
#>   <chr>     <chr>  <dbl>      <dist> <dbl>
#> 1 Australia ARIMA   2017  N(215, 21)  215.
#> 2 Australia ARIMA   2018  N(221, 63)  221.
#> 3 Canada    ARIMA   2017   N(188, 7)  188.
#> 4 Canada    ARIMA   2018  N(192, 21)  192.
#> 5 Japan     ARIMA   2017 N(106, 3.8)  106.
#> 6 Japan     ARIMA   2018 N(106, 7.6)  106.
#> 7 USA       ARIMA   2017  N(109, 11)  109.
#> 8 USA       ARIMA   2018  N(110, 29)  110.

fbl <- as_fable(fc_tsibble, response = "Debt", distribution = "Debt")

fbl
#> # A fable: 8 x 5 [1Y]
#> # Key:     Country, .model [4]
#>   Country   .model  Year        Debt .mean
#>   <chr>     <chr>  <dbl>      <dist> <dbl>
#> 1 Australia ARIMA   2017  N(215, 21)  215.
#> 2 Australia ARIMA   2018  N(221, 63)  221.
#> 3 Canada    ARIMA   2017   N(188, 7)  188.
#> 4 Canada    ARIMA   2018  N(192, 21)  192.
#> 5 Japan     ARIMA   2017 N(106, 3.8)  106.
#> 6 Japan     ARIMA   2018 N(106, 7.6)  106.
#> 7 USA       ARIMA   2017  N(109, 11)  109.
#> 8 USA       ARIMA   2018  N(110, 29)  110.

Создано 28.09.2020 пакетом REPEX (v0.3.0)

Это также работает, если вы не укажете переменную распределения.

as_fable(fc_tsibble, response = "Debt", distribution = Debt)
#> # A fable: 8 x 5 [1Y]
#> # Key:     Country, .model [4]
#>   Country   .model  Year        Debt .mean
#>   <chr>     <chr>  <dbl>      <dist> <dbl>
#> 1 Australia ARIMA   2017  N(215, 21)  215.
#> 2 Australia ARIMA   2018  N(221, 63)  221.
#> 3 Canada    ARIMA   2017   N(188, 7)  188.
#> 4 Canada    ARIMA   2018  N(192, 21)  192.
#> 5 Japan     ARIMA   2017 N(106, 3.8)  106.
#> 6 Japan     ARIMA   2018 N(106, 7.6)  106.
#> 7 USA       ARIMA   2017  N(109, 11)  109.
#> 8 USA       ARIMA   2018  N(110, 29)  110.

Обратите внимание, что в документации указано, что response аргумент должен быть вектором символов:

response
Вектор символов переменных ответа.

Однако, если вы сделаете это, вы все равно получите ошибку:

as_fable(fc_tsibble, response = ".mean", distribution = Debt)
#> Error: `fbl[[chr_dist]]` must be a vector with type <distribution>.
#> Instead, it has type <distribution>.

Это сообщение об ошибке также не интуитивно понятно и несколько противоречиво. Здесь я узнал, что вы действительно хотите передать столбец распределения обоим аргументам:

as_fable(fc_tsibble, response = "Debt", distribution = Debt)
#> # A fable: 8 x 5 [1Y]
#> # Key:     Country, .model [4]
#>   Country   .model  Year        Debt .mean
#>   <chr>     <chr>  <dbl>      <dist> <dbl>
#> 1 Australia ARIMA   2017  N(215, 21)  215.
#> 2 Australia ARIMA   2018  N(221, 63)  221.
#> 3 Canada    ARIMA   2017   N(188, 7)  188.
#> 4 Canada    ARIMA   2018  N(192, 21)  192.
#> 5 Japan     ARIMA   2017 N(106, 3.8)  106.
#> 6 Japan     ARIMA   2018 N(106, 7.6)  106.
#> 7 USA       ARIMA   2017  N(109, 11)  109.
#> 8 USA       ARIMA   2018  N(110, 29)  110.

as_fable(fc_tsibble, response = "Debt", distribution = "Debt")
#> # A fable: 8 x 5 [1Y]
#> # Key:     Country, .model [4]
#>   Country   .model  Year        Debt .mean
#>   <chr>     <chr>  <dbl>      <dist> <dbl>
#> 1 Australia ARIMA   2017  N(215, 21)  215.
#> 2 Australia ARIMA   2018  N(221, 63)  221.
#> 3 Canada    ARIMA   2017   N(188, 7)  188.
#> 4 Canada    ARIMA   2018  N(192, 21)  192.
#> 5 Japan     ARIMA   2017 N(106, 3.8)  106.
#> 6 Japan     ARIMA   2018 N(106, 7.6)  106.
#> 7 USA       ARIMA   2017  N(109, 11)  109.
#> 8 USA       ARIMA   2018  N(110, 29)  110.
Другие вопросы по тегам