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



我使用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,除非模型也知道测试数据。但是预测模型的全部意义在于,你想问一个变量的未来值是多少,所以你当然不能把它包含在模型中。

当你考虑它时,你要问的是"我如何让我的模型展望未来?

这并不是说你不能通过改变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)

但是,如果您想了解最佳数值参数,这种方法将非常慢。

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

最新更新