R/fit_tbats_discreet.R

Defines functions fit_tbats_discreet

Documented in fit_tbats_discreet

#'Fit a TBATS model to a logged version of a discrete time series
#'
#'This function fits a TBATS model to a discrete time series that has been interpolated
#'and log(x + 1/6) transformed
#'
#'
#'@param y \code{xts vector}. The discrete outcome series to be modelled. \code{NAs} are allowed
#'@param frequency \code{integer}. The seasonal frequency in \code{y}
#'@param horizon \code{integer}. The horizon to forecast. Defaults to \code{frequency}
#'
#'@return A \code{vector} containing fitted values from the TBATS model of \code{length(length(y)+horizon)}
#'@export
#'
fit_tbats_discreet = function(y, frequency, horizon){

  # Check variables
  if (!xts::is.xts(y)) {
    stop("y must be an xts object")
  }

  # Set forecast horizon if missing
  if(missing(horizon)){
    horizon <- frequency
  }

  # Function to convert xts to ts object
  xts.to.ts <- function(x, freq = 52) {
    start_time <- floor((lubridate::yday(start(x)) / 365) * freq)
    ts(as.numeric(x),
       start = c(lubridate::year(start(x)),
                 start_time), freq = freq)
  }

  # Impute any NAs
  y_impute <- round(as.vector(forecast::na.interp(zoo::na.approx(zoo::na.approx(ts(
    y, frequency = frequency), na.rm = F), na.rm = F))), 0)

  y_impute <- ts(y_impute, frequency = frequency,
                 start = start(xts.to.ts(y, freq = frequency)))
  y_impute[y_impute < 0] <- 0

  # Log(y + 1/6) for TBATS modelling
  log_y <- ts(log(y_impute + 1/6), start = start(y_impute),
              frequency = frequency(y_impute))

  # Fit TBATS
  tbats_mod <- forecast::tbats(log_y)
  tbats_fc <- forecast::forecast(tbats_mod, horizon)

  # Extract fitted and forecasted values
  c(tbats_mod$fitted.values, tbats_fc$mean)
}
nicholasjclark/mvforecast documentation built on Dec. 22, 2021, 2:11 a.m.