Динамически вставлять переменные в модель басни, используя rlang - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь динамически вставить переменные в модель басни.

Данные

library(dplyr)
library(fable)
library(stringr)

df <- tsibbledata::aus_retail %>% 
  filter(State == "Victoria", Industry == "Food retailing") %>% 
  mutate(reg_test = rnorm(441, 5, 2),
         reg_test2 = rnorm(441, 5, 2))

Обратите внимание, что в tsibble может быть неопределенное количество регрессоров, но в этом примере у меня есть только два (reg_test и reg_test2). Все столбцы регрессора будут начинаться с reg_

Проблема Функция

У меня есть функция, в которой я хочу динамически помещать столбцы регрессора в модель ARIMA с использованием пакета fable.

test_f <- function(df)  {
var_names <- str_subset(names(df), "reg_") %>% 
    paste0(collapse = "+")  
    test <- enquo(var_names)
df %>% 
  model(ARIMA(Turnover ~ !!test))
}

test_f(df)

# A mable: 1 x 3
# Key:     State, Industry [1]
  State    Industry      `ARIMA(Turnover ~ ~"reg_test+reg_tes~
  <chr>    <chr>         <model>                              
1 Victoria Food retaili~ <NULL model>                         
Warning message:
1 error encountered for ARIMA(Turnover ~ ~"reg_test+reg_test2")
[1] invalid model formula in ExtractVars

Я знаю, что это просто ввод строки var_names в формулу, которая не работает, но я не могу понять, как создать var_names таким образом, чтобы я мог enquo() это правильно.

Я прочитал раздел квазиквотации здесь Я искал SO, но пока не нашел ответа.

Этот вопрос с pasre_expr(), казалось, был подойдите ближе, но все же не то, что я хотел.

Я знаю, что могу использовать sym(), если у меня есть одна переменная, но я не знаю, сколько будет reg_ переменных, и я хочу включите их все.

Ожидаемый результат

Путем ввода переменных вручную, я могу показать ожидаемый результат.

test <- df %>% 
  model(ARIMA(Turnover ~ reg_test + reg_test2))
test$`ARIMA(Turnover ~ reg_test + reg_test2)`[[1]]

Series: Turnover 
Model: LM w/ ARIMA(2,1,0)(0,1,2)[12] errors 

Coefficients:
          ar1      ar2     sma1     sma2  reg_test  reg_test2
      -0.6472  -0.3541  -0.4115  -0.0793   -0.0296    -0.6143
s.e.   0.0473   0.0479   0.0520   0.0446    0.5045     0.5273

sigma^2 estimated as 884.9:  log likelihood=-2058.04
AIC=4130.08   AICc=4130.35   BIC=4158.5

Я также представляю, что есть лучший способ сделать формулу в функции ARIMA. Если это поможет решить и мою проблему, это тоже сработает.

Я ценю любую помощь!

1 Ответ

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

Возможно, вы делаете это немного сложнее, чем нужно. Вы можете преобразовать строку в формулу, выполнив as.formula(string), поэтому просто создайте формулу как строку, преобразуйте ее в формулу, а затем введите ее в ARIMA. Вот пример:

library(dplyr)
library(fable)
library(stringr)

df <- tsibbledata::aus_retail %>% 
  filter(State == "Victoria", Industry == "Food retailing") %>% 
  mutate(reg_test = rnorm(441, 5, 2),
         reg_test2 = rnorm(441, 5, 2))

test_f <- function(df)  {
    var_names <- paste0(str_subset(names(df), "reg_"), collapse = " + ")
    mod <- model(df, ARIMA(as.formula(paste("Turnover ~", var_names))))
    unclass(mod[1, 3][[1]])[[1]]
}

test_f(df)
#> Series: Turnover 
#> Model: LM w/ ARIMA(2,1,0)(0,1,1)[12] errors 
#> 
#> Coefficients:
#>           ar1     ar2     sma1  reg_test  reg_test2
#>       -0.6689  -0.376  -0.4765    0.3363     1.0194
#> s.e.   0.0448   0.045   0.0426    0.4978     0.5436
#> 
#> sigma^2 estimated as 883.1:  log likelihood=-2058.28
#> AIC=4128.56   AICc=4128.76   BIC=4152.91

Создано в 2020-04-23 пакетом представлений (v0.3.0)

...