在 R 中创建具有最小预测误差值的 ARIMA 模型

Creating ARIMA model with a minimum value of forecast error in R

我使用auto.arima()函数构建ARIMA模型,然后计算预测精度:

library(fpp2)

data("AirPassengers")

train <- window(AirPassengers, end = c(1959, 12))
test <- window(AirPassengers, start = 1960)

ARIMA <- auto.arima(train, lambda = 0, biasadj = TRUE)
ARIMAf <- forecast(ARIMA, h = 12)

accuracy(ARIMAf, test)
                     ME      RMSE       MAE        MPE     MAPE      MASE       ACF1 Theil's U
Training set   0.579486  9.907267  7.483159  0.1187348 2.880429 0.2457523 0.01227544        NA
Test set     -16.986385 23.931703 18.527682 -3.9334909 4.182395 0.6084625 0.04802038 0.5336134

auto.arima() 函数最小化 AICAICcBIC 的值,但我想构建一个具有最小值的 ARIMA 模型,例如RMSE 在测试集上。 例如,通过开发一组具有不同参数值的 ARIMA 模型,以找到在测试集上具有最小 RMSE 的模型。 请帮助我了解如何执行此操作。

ARIMA 模型建立在训练数据的基础上,通常使用最小二乘法来最大化其对训练数据的拟合。它使用 AIC 或类似的方法来决定候选模型以防止过度拟合。

最小化模型和测试数据之间的 RMSE 取决于两件事:模型和测试数据。您不能要求模型本身降低 RMSE,除非模型也知道测试数据。但是预测模型的全部要点是你想问一个变量的未来值是多少,所以你当然不能把它包括在模型中。

仔细想想,你问的是"how do I make my model look into the future?"

这并不是说您不能通过更改 arima.auto 的参数来降低测试数据的 RMSE,但您只能通过将输出与 test 数据进行比较来做到这一点.

如果您想检查不同的参数并查看哪个模型最适合测试数据,您可以像这样自动执行多个模型拟合:

test_seasons <- function(train, test)
{
  seasonal = c("seas", "ocsb", "hegy", "ch")
  RMSE <- 1000
  for(i in 1:3)
  {
    latest_model <- auto.arima(train, lambda = 0,  biasadj = TRUE, seasonal.test = seasonal[i])
    latest_RMSE <- accuracy(forecast(latest_model, h = 12), test)[2, 2]
    if(latest_RMSE < RMSE)
    {
      RMSE <- latest_RMSE
      output <- latest_model
      best_season <- seasonal[i]
    }
  }
  cat("The optimal seasonal.test parameter was \"", best_season, "\" (RMSE ",
      RMSE, ")", sep = "")
}

所以你可以做到

test_seasons(train, test)
# The optimal seasonal.test parameter was "seas" (RMSE 18.78836)

但是,如果你想找到最佳数值参数,这种方法会很慢。

从统计学的角度来看,我也会谨慎选择一个模型来根据它对某一年的预测有多好来使用。如果您有额外一年的数据,最好的使用方法是将其包含在您的模型中,而不是手动调整参数。