rtime-seriesforecastinghts

xreg parameter hts R package ARIMA


I am trying to add an external regressor xreg into the hts package, however I am getting an error regarding the number of rows (140) despite my external variable has the same number. I have checked other answers but mine is more simple:

Here is the reproducible example

library(hts)
abc <- matrix(sample(1:100, 32*140, replace=TRUE), ncol=32)
colnames(abc) <- c(
  paste0("A0",1:5), 
  paste0("B0",1:9),"B10",
  paste0("C0",1:8),
  paste0("D0",1:5),
  paste0("E0",1:4)
)
abc <- ts(abc, start=2019, frequency=365.25/7)
x <- hts(abc, characters = c(1,2))

data <- window(x, start = 2019.000, end = 2021.166)
test <- window(x, start = 2021.185)

x2 <- runif(n = 140, min = 1, max = 10) #External regressor with the same size

fcastsxreg <- forecast( data, h = 2, method = "comb", algorithms = "lu",  fmethod = "arima", weights=, "wls", nonnegative=TRUE, xreg=x2)
accuracy(fcastsxreg, test, levels = 1)

The error message is about the mismatch between de size of abc matrix an x2 vector despite both have 140 rows

Error in model.frame.default(formula = x ~ xregg, drop.unused.levels = TRUE) : 
  variable lengths differ (found for 'xregg')
In addition: Warning message:
In !is.na(x) & !is.na(rowSums(xregg)) :
  longer object length is not a multiple of shorter object length

Thank you


Solution

  • Your training data data has 114 observations for each series in the hierarchy. Your regressor has 140 observations. So there is a difference in length as the error states.

    You also need to provide both an xreg argument for the training period, and a newxreg argument for the forecast period.

    Another small problem is that there was one observation between your training and test data which was probably unintentional.

    Here is a modification of your code that works.

    library(hts)
    abc <- matrix(sample(1:100, 32 * 140, replace = TRUE), ncol = 32)
    colnames(abc) <- c(
      paste0("A0", 1:5),
      paste0("B0", 1:9), "B10",
      paste0("C0", 1:8),
      paste0("D0", 1:5),
      paste0("E0", 1:4)
    )
    abc <- ts(abc, start = 2019, frequency = 365.25/7)
    x <- hts(abc, characters = c(1, 2))
    
    data <- window(x, end = 2021.166)
    test <- window(x, start = 2021.167)
    
    # External regressor with the same size as training and test data combined
    x2 <- ts(runif(n = 140, min = 1, max = 10), start = 2019, frequency = 365.25/7)
    
    fcastsxreg <- forecast(data,
      fmethod = "arima", nonnegative = TRUE,
      xreg = window(x2, end = 2021.166), newxreg = window(x2, start = 2021.167)
    )
    accuracy(fcastsxreg, test, levels = 1)
    #>              A          B          C          D           E
    #> ME   -9.278558 11.0833938 -4.7985252  5.8634578  -6.5853672
    #> RMSE 58.741525 84.4354712 92.0376431 66.1268442  55.6521141
    #> MAE  48.428461 69.6798318 78.7112730 55.7808292  45.1403745
    #> MAPE 21.854145 13.4673244 20.5752506 23.0548665  31.0934899
    #> MPE  -9.642284 -0.5202464 -6.0976324 -5.0032980 -15.7431146
    #> MASE  0.638436  0.5647993  0.7868589  0.7730021   0.5935744
    

    Created on 2022-01-26 by the reprex package (v2.0.1)