Я пытаюсь динамически вставить переменные в модель басни.
Данные
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
. Если это поможет решить и мою проблему, это тоже сработает.
Я ценю любую помощь!