使用R中的预测误差的最小值创建ARIMA模型

问题描述 投票:0回答:1

我使用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的模型。请帮助我了解我该怎么做。

r algorithm loops forecasting arima
1个回答
0
投票

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

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

当您考虑时,您所问的是“我如何使我的模型面向未来?”

这并不是说您无法通过更改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)

但是,如果要使用最佳数值参数,这种方法将非常慢。

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

© www.soinside.com 2019 - 2024. All rights reserved.