## ----cran_install, eval = FALSE----------------------------------------------- # install.packages("forecastHybrid") ## ----github_install, eval = FALSE--------------------------------------------- # devtools::install_git("https://gitlab.com/dashaub/forecastHybrid", subdir = "pkg") ## ----load_library, message = FALSE-------------------------------------------- library(forecastHybrid) # nolint: undesirable_function_linter ## ----quickstart, cache = TRUE------------------------------------------------- quickModel <- hybridModel(USAccDeaths) forecast(quickModel) plot(forecast(quickModel), main = "Forecast from auto.arima, ets, thetam, nnetar, stlm, and tbats model") ## ----basic_model, cache = TRUE------------------------------------------------ # Build a hybrid forecast on a simulated dataset using auto.arima, ets, and tbats models. # Each model is given equal weight set.seed(12345) series <- ts(rnorm(18), f = 2) hm1 <- hybridModel(y = series, models = "aet", weights = "equal") ## ----individualModels, cache = TRUE------------------------------------------- # View the individual models hm1$auto.arima # See forecasts from the auto.arima model plot(forecast(hm1$auto.arima)) ## ----object_class, cache = TRUE----------------------------------------------- class(hm1) is.hybridModel(hm1) ## ----printSummary, cache = TRUE----------------------------------------------- print(hm1) summary(hm1) ## ----plots, cache = TRUE------------------------------------------------------ plot(quickModel, type = "fit") plot(quickModel, type = "models") ## ----plots_ggplot, cache = TRUE----------------------------------------------- plot(quickModel, type = "fit", ggplot = TRUE) plot(quickModel, type = "models", ggplot = TRUE) ## ----errorMethod, cache = TRUE------------------------------------------------ hm2 <- hybridModel(series, weights = "insample.errors", errorMethod = "MASE", models = "aenst") hm2 ## ----viewWeights, cache = TRUE------------------------------------------------ hm2$weights newWeights <- c(0.1, 0.2, 0.3, 0.1, 0.3) names(newWeights) <- c("auto.arima", "ets", "nnetar", "stlm", "tbats") hm2$weights <- newWeights hm2 hm2$weights[1] <- 0.2 hm2$weights[2] <- 0.1 hm2 ## ----generics, cache = TRUE--------------------------------------------------- # View the first 10 fitted values and residuals head(fitted(hm1)) head(residuals(hm1)) ## ----accuracy_ensemble, cache = TRUE------------------------------------------ accuracy(hm1) ## ----accuracy_individual, cache = TRUE---------------------------------------- accuracy(hm1, individual = TRUE) ## ----basic_forecast, cache = TRUE--------------------------------------------- hForecast <- forecast(hm1, h = 48) ## ----plot_forecast, cache = TRUE---------------------------------------------- plot(hForecast) ## ----advanced_fit, cache = TRUE----------------------------------------------- hm3 <- hybridModel(y = series, models = "aefnst", a.args = list(max.p = 12, max.q = 12, approximation = FALSE), n.args = list(repeats = 50), s.args = list(robust = TRUE), t.args = list(use.arma.errors = FALSE)) ## ----lambda, cache = TRUE----------------------------------------------------- hm4 <- hybridModel(y = wineind, models = "ae", lambda = 0.15) hm4$auto.arima$lambda hm4$ets$lambda ## ----advancedLambda, cache = TRUE--------------------------------------------- hm5 <- hybridModel(y = USAccDeaths, models = "aens", lambda = 0.2, a.args = list(lambda = 0.5), n.args = list(lambda = 0.6)) hm5$auto.arima$lambda hm5$ets$lambda hm5$nnetar$lambda hm5$stlm$lambda ## ----xreg, cache = TRUE------------------------------------------------------- # Use the beaver1 dataset with the variable "activ" as a covariate and "temp" as the time series # Divide this into a train and test set trainSet <- beaver1[1:100, ] testSet <- beaver1[101:110, ] trainXreg <- matrix(trainSet$activ) testXreg <- matrix(testSet$activ) # Create the model beaverhm <- hybridModel(ts(trainSet$temp, f = 6), models = "aenst", a.args = list(xreg = trainXreg), n.args = list(xreg = trainXreg), s.args = list(xreg = trainXreg, method = "arima")) # Forecast future values beaverfc <- forecast(beaverhm, xreg = testXreg, PI = FALSE) # View the accuracy of the model accuracy(beaverfc, testSet$temp) ## ----cvts_comparison, cache=TRUE---------------------------------------------- stlmMod <- cvts(woolyrnq, FUN = stlm, windowSize = 100, maxHorizon = 8) naiveMod <- cvts(woolyrnq, FUN = naive, windowSize = 100, maxHorizon = 8) accuracy(stlmMod) accuracy(naiveMod) ## ----woolyrnq_plot------------------------------------------------------------ plot(woolyrnq) ## ----custom_cvts, cache=TRUE-------------------------------------------------- gmdhForecast <- function(x, h) { fc <- GMDH::fcast(x, f.number = h) # GMDH doesn't produce a ts object with correct attributes, so we build it endVal <- tsp(x)[2] freq <- frequency(x) # Set the correct start, end, and frequency for the ts forecast object tsProperties <- c(endVal + 1 / freq, endVal + h / freq, freq) tsp(fc$mean) <- tsProperties tsp(fc$upper) <- tsProperties tsp(fc$lower) <- tsProperties class(fc) <- "forecast" fc } series <- subset(woolyrnq, end = 12) gmdhcv <- cvts(series, FCFUN = gmdhForecast, windowSize = 10, maxHorizon = 1) ## ----custom_naive_cvts, cache=TRUE-------------------------------------------- customMod <- function(x) { result <- list() result$series <- x result$last <- tail(x, n = 1) class(result) <- "customMod" result } forecast.customMod <- function(x, h = 12) { result <- list() result$model <- x result$mean <- rep(x$last, h) class(result) <- "forecast" result } series <- subset(AirPassengers, end = 94) cvobj <- cvts(series, FUN = customMod, FCFUN = forecast.customMod)