context("test-arima.R")
stats_fit <- arima(USAccDeaths, c(0, 1, 1), list(order = c(0, 1, 1), 12))
test_that("Automatic ARIMA selection", {
skip_if_not_installed("feasts")
# Automatic model selection
fable_fit <- USAccDeaths_tbl %>%
model(arima = ARIMA(value ~ pdq(0:1, 0:1, 0:1) + PDQ(0:1, 0:1, 0:1)))
expect_identical(
coef(fable_fit$arima[[1]]$fit$model),
coef(stats_fit)
)
# Automatic (approximate) model selection
fable_fit_approx <- USAccDeaths_tbl %>%
model(arima = ARIMA(value ~ pdq(0:1, 0:1, 0:1) + PDQ(0:1, 0:1, 0:1), approximation = TRUE))
expect_output(
report(fable_fit_approx),
"ARIMA\\(0,1,1\\)\\(1,1,0\\)\\[12\\]"
)
# Automatic d/D selection
fit <- USAccDeaths_tbl %>% model(ARIMA(value ~ pdq(p = 0, q = 1) + PDQ(P = 0, Q = 1)))
expect_identical(
model_sum(fit[[1]][[1]]),
"ARIMA(0,1,1)(0,1,1)[12]"
)
})
test_that("Manual ARIMA selection", {
# Manual model selection
fable_fit <- USAccDeaths_tbl %>% model(model = ARIMA(value ~ 0 + pdq(0, 1, 1) + PDQ(0, 1, 1)))
expect_identical(
coef(fable_fit$model[[1]]$fit$model),
coef(stats_fit)
)
expect_identical(
model_sum(fable_fit$model[[1]]),
"ARIMA(0,1,1)(0,1,1)[12]"
)
fable_fc <- fable_fit %>% forecast()
stats_fc <- stats_fit %>% predict(24)
expect_equivalent(
fc_mean(fable_fc$value),
unclass(stats_fc$pred)
)
expect_equivalent(
tidy(fable_fit)$estimate, coef(stats_fit)
)
expect_equivalent(
fitted(fable_fit)$.fitted, unclass(USAccDeaths - residuals(stats_fit))
)
expect_equivalent(
residuals(fable_fit)$.resid, unclass(residuals(stats_fit))
)
expect_equivalent(
fitted(fable_fit),
fitted(refit(fable_fit, USAccDeaths_tbl))
)
expect_output(
report(fable_fit),
"log likelihood=-425.44"
)
USAccDeaths_miss <- USAccDeaths_tbl
USAccDeaths_miss$value[c(10, 14, 15)] <- NA
USAccDeaths_miss <- fable_fit %>%
interpolate(USAccDeaths_miss)
expect_false(
any(is.na(USAccDeaths_miss$value))
)
expect_equal(
USAccDeaths_tbl$value[-c(10, 14, 15)],
USAccDeaths_miss$value[-c(10, 14, 15)]
)
})
test_that("Fixed ARIMA coefficients", {
# Manual model selection
fable_fit <- USAccDeaths_tbl %>% model(model = ARIMA(value ~ xreg(1, fixed = list(constant = 20)) + pdq(0, 0, 1, fixed = list(ma1 = 0.3)) + PDQ(0, 1, 1, fixed = list(sma1 = 3))))
expect_identical(
tidy(fable_fit)$estimate,
c(0.3, 3, 20)
)
})
test_that("ARIMA with bad inputs", {
expect_warning(
UKLungDeaths %>%
model(ARIMA(mdeaths ~ 1 + pdq(2, 0, 0) + pdq(d = 1) + PDQ(2, 1, 0))),
"Only one special for `pdq\\(\\)` and `PDQ\\(\\)` is allowed"
)
expect_warning(
UKLungDeaths %>%
model(ARIMA(vars(mdeaths, fdeaths))),
"Only univariate responses are supported by ARIMA"
)
expect_warning(
UKLungDeaths %>%
model(ARIMA(mdeaths ~ 0 + pdq(2, 2, 0) + PDQ(2, 1, 0))),
"Having 3 or more differencing operations is not recommended"
)
expect_warning(
UKLungDeaths %>%
model(ARIMA(mdeaths ~ pdq(2, 0, 0) + PDQ(2, 2, 0))),
"Having more than one seasonal difference is not recommended"
)
expect_warning(
fit <- UKLungDeaths %>%
model(poly = ARIMA(mdeaths ~ 1 + pdq(2, 1, 0) + PDQ(2, 1, 0))),
"Model specification induces a quadratic or higher order polynomial trend"
)
expect_identical(
model_sum(fit$poly[[1]]),
"ARIMA(2,1,0)(2,1,0)[12] w/ poly"
)
})
test_that("ARIMA with xregs", {
skip_if_not_installed("feasts")
tr <- UKLungDeaths %>% head(-12)
ts <- UKLungDeaths %>% tail(12)
fable_fit <- tr %>% model(model = ARIMA(mdeaths ~ 1 + fdeaths + PDQ(P = 0, Q = 0)))
stats_fit <- arima(head(mdeaths, -12), c(1, 1, 1),
xreg = data.frame(fdeaths = head(fdeaths, -12), intercept = seq_len(60))
)
expect_equivalent(
coef(fable_fit$model[[1]]$fit$model),
coef(stats_fit)
)
fable_fc <- fable_fit %>% forecast(ts)
stats_fc <- stats_fit %>% predict(12,
newxreg = data.frame(fdeaths = tail(fdeaths, 12), intercept = 61:72)
)
expect_equivalent(
fc_mean(fable_fc$mdeaths),
unclass(stats_fc$pred)
)
expect_identical(
model_sum(fable_fit$model[[1]]),
"LM w/ ARIMA(1,1,1) errors"
)
fable_fit <- tr %>%
model(model = ARIMA(mdeaths ~ 1 + lag(fdeaths) + PDQ(P = 0, Q = 0)))
expect_equal(
model_sum(fable_fit$model[[1]]),
"LM w/ ARIMA(2,0,1) errors"
)
fable_fc <- fable_fit %>%
forecast(ts)
expect_true(
!any(is.na(fable_fc$mdeaths))
)
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.