Включить все переменные в формулу tsibble

Я хочу подогнать под модель линейной регрессии с использованием пакета tsibble, и у меня есть набор фиктивных переменных, которые я хочу включить в свой анализ. Примерный набор данных будет следующим:

library(tsibble)
library(dplyr)
library(fable)

ex = structure(list(id = c("KEY1", "KEY1", "KEY1", "KEY1", "KEY1", 
"KEY1", "KEY1", "KEY1", "KEY1", "KEY1", "KEY1", "KEY1", "KEY1", 
"KEY1", "KEY1"), sales = c(0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0), date = structure(c(15003, 15004, 15005, 15006, 15007, 
15008, 15009, 15010, 15011, 15012, 15013, 15014, 15015, 15016, 
15017), class = "Date"), wday = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 
1L, 2L, 3L, 4L, 5L, 6L, 7L, 1L), dummy_1 = c(0, 0, 0, 1, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0), dummy_2 = c(0, 0, 0, 0, 0, 0, 1, 
0, 0, 0, 0, 0, 0, 0, 0), dummy_3 = c(0, 0, 1, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0)), row.names = c(NA, -15L), key = structure(list(
    id = "KEY1", .rows = list(1:15)), row.names = c(NA, -1L), class = c("tbl_df", 
"tbl", "data.frame"), .drop = TRUE), index = structure("date", ordered = TRUE), index2 = "date", interval = structure(list(
    year = 0, quarter = 0, month = 0, week = 0, day = 1, hour = 0, 
    minute = 0, second = 0, millisecond = 0, microsecond = 0, 
    nanosecond = 0, unit = 0), class = "interval"), class = c("tbl_ts", 
"tbl_df", "tbl", "data.frame"))

> ex
# A tsibble: 15 x 7 [1D]
# Key:       id [1]
   id    sales date        wday dummy_1 dummy_2 dummy_3
   <chr> <dbl> <date>     <int>   <dbl>   <dbl>   <dbl>
 1 KEY1      0 2011-01-29     1       0       0       0
 2 KEY1      5 2011-01-30     2       0       0       0
 3 KEY1      0 2011-01-31     3       0       0       1
 4 KEY1      0 2011-02-01     4       1       0       0
 5 KEY1      0 2011-02-02     5       0       0       0
 6 KEY1      0 2011-02-03     6       0       0       0
 7 KEY1      0 2011-02-04     7       0       1       0
 8 KEY1      0 2011-02-05     1       0       0       0
 9 KEY1      0 2011-02-06     2       0       0       0
10 KEY1      0 2011-02-07     3       0       0       0
11 KEY1      0 2011-02-08     4       0       0       0
12 KEY1      0 2011-02-09     5       0       0       0
13 KEY1      0 2011-02-10     6       0       0       0
14 KEY1      0 2011-02-11     7       0       0       0
15 KEY1      0 2011-02-12     1       0       0       0 

Их слишком много манекенов, чтобы указывать их вручную, поэтому я надеялся на что-то более быстрое. Обычно я бы использовал символ . в формуле следующим образом:

fit = ex %>% 
  model(TSLM(sales ~ trend() + season() + .))

Но это не работает:

Warning message:
1 error encountered for TSLM(sales ~ trend() + season() + .)
[1] '.' in formula and no 'data' argument

Есть ли систематический tsibble способ обойти это или мне нужно создавать формулу «на лету», используя имена набора данных?


person User2321    schedule 03.05.2020    source источник
comment
Что такое model?   -  person akrun    schedule 03.05.2020
comment
Я имел в виду, когда я использую код, я получаю Error in model(., TSLM(sales ~ trend() + season() + .)) : could not find function "model"   -  person akrun    schedule 03.05.2020
comment
Я пробовал их пример в документации. это дает мне некоторые ошибки. может быть версия пакета? as_tsibble(USAccDeaths) %>% + model(lm = TSLM(log(value) ~ trend() + season()))   -  person akrun    schedule 03.05.2020
comment
ошибка Error: Can't cast <lst_mdl> to <lst_mdl>   -  person akrun    schedule 03.05.2020
comment
Это определенно один из ваших пакетов, для меня код работает. Вначале у меня были те же проблемы. Для меня это был пакет vctrs, но я не знаю, подходит ли он вам ...   -  person User2321    schedule 03.05.2020
comment
может быть мне нужно обновить эти версии. Благодарность   -  person akrun    schedule 03.05.2020
comment
Вы можете попробовать nm1 <- names(ex)[startsWith(names(ex), 'dummy')];ex %>% model(lm = TSLM(reformulate(c(nm1, 'trend()', 'season()'), 'sales') ))   -  person akrun    schedule 03.05.2020
comment
Проблема с использованием . заключается в том, что . - это весь набор данных, поступающий из %>%, поэтому это может привести к ошибке   -  person akrun    schedule 03.05.2020


Ответы (1)


Мы могли бы создать формулу с reformulate, используя «фиктивные» имена столбцов.

nm1 <- names(ex)[startsWith(names(ex), 'dummy')]
ex %>%
    model(lm = TSLM(reformulate(c(nm1, 'trend()', 'season()'), 'sales') ))
person akrun    schedule 03.05.2020