Site icon R-bloggers

Hundreds of Statistical/Machine Learning models for univariate time series, using ahead, ranger, xgboost, and caret

[This article was first published on T. Moudiki's Webpage - R, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Today, we examine some nontrivial use cases for ahead::dynrmfforecasting. Indeed, the examples presented in the package’s README work quite smoothly – for randomForest::randomForest and e1071::svm – because:

After reading this post, you’ll know how to adjust hundreds of different Statistical/Machine Learning (ML) models to univariate time series, and you’ll get a better understanding of how ahead::dynrmf works. If you’re not familiar with package ahead yet, you should read the following posts first:

The demo uses ahead::dynrmf in conjunction with R packages:

Installing package ahead

options(repos = c(
    techtonique = 'https://techtonique.r-universe.dev',
    CRAN = 'https://cloud.r-project.org'))
    
install.packages("ahead")

Packages required for the demo

library(ahead)
library(forecast)
library(ranger)
library(xgboost)
library(caret)
library(gbm)
library(ggplot2)

Forecasting using ahead::dynrmf’s default parameters

# ridge ------------------------------------------------------------------

# default, with ridge regression's regularization parameter minimizing GCV
z <- ahead::dynrmf(USAccDeaths, h=15, level=95)
autoplot(z)

Forecasting using ahead::dynrmf and ranger

# ranger ------------------------------------------------------------------

fit_func <- function(x, y, ...)
{
  df <- data.frame(y=y, x) # naming of columns is mandatory for `predict`
  ranger::ranger(y ~ ., data=df, ...)
}

predict_func <- function(obj, newx)
{
  colnames(newx) <- paste0("X", 1:ncol(newx)) # mandatory, linked to df in fit_func
  predict(object=obj, data=newx)$predictions # only accepts a named newx
}

z <- ahead::dynrmf(USAccDeaths, h=15, level=95, fit_func = fit_func,
                    fit_params = list(num.trees = 500),
                    predict_func = predict_func)
autoplot(z)

Forecasting using ahead::dynrmf and xgboost

# xgboost -----------------------------------------------------------------

fit_func <- function(x, y, ...) xgboost::xgboost(data = x, label = y, ...)

z <- ahead::dynrmf(USAccDeaths, h=15, level=95, fit_func = fit_func,
                   fit_params = list(nrounds = 10,
                                     verbose = FALSE),
                   predict_func = predict)
autoplot(z)

Forecasting using ahead::dynrmf and gbm through caret’s unified interface

# caret gbm -----------------------------------------------------------------

# unified interface, with hundreds of regression models
# https://topepo.github.io/caret/available-models.html

fit_func <- function(x, y, ...)
{
  df <- data.frame(y=y, x)

  caret::train(y ~ ., data=df,
               method = "gbm",
               trControl=caret::trainControl(method = "none"), # no cv
               verbose = FALSE,
               tuneGrid=data.frame(...))
}

predict_func <- function(obj, newx)
{
  colnames(newx) <- paste0("X", 1:ncol(newx))
  caret::predict.train(object=obj, newdata=newx, type = "raw")
}

z <- ahead::dynrmf(USAccDeaths, h=15, level=95, fit_func = fit_func,
                   fit_params = list(n.trees=10, shrinkage=0.01,
                                     interaction.depth = 1,
                                     n.minobsinnode = 10),
                   predict_func = predict_func)
autoplot(z)

Forecasting using ahead::dynrmf and glmnet through caret’s unified interface

# caret glmnet -----------------------------------------------------------------

# unified interface, with hundreds of regression models
# https://topepo.github.io/caret/available-models.html

fit_func <- function(x, y, ...)
{
  df <- data.frame(y=y, x)

  caret::train(y ~ ., data=df,
               method = "glmnet",
               trControl=caret::trainControl(method = "none"), # no cv
               verbose = FALSE,
               tuneGrid=data.frame(...))
}

predict_func <- function(obj, newx)
{
  colnames(newx) <- paste0("X", 1:ncol(newx))
  caret::predict.train(object=obj, newdata=newx, type = "raw")
}

z <- ahead::dynrmf(USAccDeaths, h=15, level=95, fit_func = fit_func,
              fit_params = list(alpha=0.5, lambda=0.1),
              predict_func = predict_func)
autoplot(z)

To leave a comment for the author, please follow the link and comment on their blog: T. Moudiki's Webpage - R.

R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.