--- title: "The models" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{The models} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set(collapse = TRUE, comment = "#>", fig.width = 7, fig.height = 4) ``` ```{r} library(foresightr) y <- AirPassengers ``` Every model is a specification: a small list that says what to fit. It can be printed, saved, renamed and combined; it is estimated only by `fit_model()`, `forecast_model()` or inside a `backtest()`. ```{r} model_log(model_airline()) ``` ## Yardsticks `model_naive()`, `model_drift()`, `model_mean()` and `model_seasonal_naive()` are what any other model must beat. The seasonal naive forecast with `growth = TRUE` repeats last year scaled by the growth of the last twelve months, a strong benchmark for revenue. ```{r} forecast_model(model_seasonal_naive(growth = TRUE), y, 6) ``` ## Theta and Holt-Winters `model_theta()` is the method that won the M3 competition, equivalent to simple exponential smoothing with drift, on the seasonally adjusted series. `model_holt_winters()` smooths level, trend and a multiplicative seasonal pattern. ```{r} fit_model(model_holt_winters(), y)$params ``` ## Exponential smoothing `model_ets()` fits one member of the family by its code (error, trend, season); `model_auto_ets()` chooses by AICc among those that suit the series. ```{r} fit <- fit_model(model_auto_ets(), y) fit$details$code fit$details[c("alpha", "beta", "gamma")] ``` ## ARIMA `model_arima()` is estimated by exact maximum likelihood. `model_auto_arima()` chooses the differences by tests and the orders by a stepwise search. ```{r} fit <- fit_model(model_auto_arima(), log(y)) c(fit$details$order, fit$details$seasonal_order) fit$aicc exp(predict(fit, 6)) ``` ## Prophet-style trend `model_prophet()` fits a trend that may bend at many places, shrinking the bends that do not matter to exactly zero, plus Fourier seasonality: ```{r} fit <- fit_model(model_prophet(), log(y)) fit$details$changepoints ``` Events and lasting steps are covered in `vignette("regressors")`. ## TBATS `model_tbats()` handles several seasonal periods, including periods that are not whole numbers (52.18 weeks in a year), with trigonometric terms. Whatever is not fixed is chosen by AIC, which takes seconds. ```{r} fit <- fit_model(model_tbats(), y) fit$details[c("harmonics", "lambda", "trend", "arma")] ``` ## Intermittent demand For series where most periods have no demand, the forecast is a rate: Croston's method and its SBA and TSB variants. ```{r} demand <- c(0, 0, 3, 0, 0, 0, 2, 0, 0, 4, 0, 0, 0, 0, 3, 0, 2, 0, 0, 0) forecast_model(model_croston("sba"), demand, 3) ``` ## Combining models Any model can run on the log or Box-Cox scale, and on the seasonally adjusted series: ```{r} model_name(model_log(model_decomposed(model_auto_ets()))) forecast_model(model_box_cox(model_theta(), "guerrero"), y, 3) ``` An ensemble learns its weights from its members' errors on the end of the series; with `"stacked"` weights, members that add nothing get exactly zero. ```{r} fit <- fit_model(model_ensemble(candidates_default(), weighting = "stacked"), y) round(fit$params[fit$params > 0], 3) ``` ## The ready sets ```{r} vapply(candidates_default(), model_name, "") length(candidates_thorough()) ``` `candidates_thorough()` adds the automatic choices and two ensembles, and takes seconds rather than milliseconds in a backtest.