Usted debe usar el pronóstico del paquete, que apoya todos estos modelos (y más) y hace que su montaje un complemento:
library(forecast)
x <- AirPassengers
mod_arima <- auto.arima(x, ic='aicc', stepwise=FALSE)
mod_exponential <- ets(x, ic='aicc', restrict=FALSE)
mod_neural <- nnetar(x, p=12, size=25)
mod_tbats <- tbats(x, ic='aicc', seasonal.periods=12)
par(mfrow=c(4, 1))
plot(forecast(mod_arima, 12), include=36)
plot(forecast(mod_exponential, 12), include=36)
plot(forecast(mod_neural, 12), include=36)
plot(forecast(mod_tbats, 12), include=36)
Yo aconsejo que se suavizado de datos previo a la colocación de su modelo. Su modelo es inherentemente va a tratar de suavizar los datos, de manera pre-alisado sólo complica las cosas.
La edición en función de los nuevos datos:
En realidad, parece arima es uno de los peores modelos usted puede elegir para este entrenamiento y de prueba.
He guardado los datos a un archivo llamada coil.csv
, cargan en R, y que se dividió en un entrenamiento y de prueba:
library(forecast)
dat <- read.csv('~/coil.csv')
x <- ts(dat$Coil, start=c(dat$Year[1], dat$Month[1]), frequency=12)
test_x <- window(x, start=c(2012, 3))
x <- window(x, end=c(2012, 2))
La próxima me caben un montón de modelos de serie de tiempo: arima, suavización exponencial, de la red neuronal, tbats, murciélagos, descomposición estacional, y estructurales de series de tiempo:
models <- list(
mod_arima = auto.arima(x, ic='aicc', stepwise=FALSE),
mod_exp = ets(x, ic='aicc', restrict=FALSE),
mod_neural = nnetar(x, p=12, size=25),
mod_tbats = tbats(x, ic='aicc', seasonal.periods=12),
mod_bats = bats(x, ic='aicc', seasonal.periods=12),
mod_stl = stlm(x, s.window=12, ic='aicc', robust=TRUE, method='ets'),
mod_sts = StructTS(x)
)
Entonces hice algunas previsiones y en comparación con el conjunto de pruebas. He incluido un ingenuo previsión de que siempre predice un plano horizontal de la línea:
forecasts <- lapply(models, forecast, 12)
forecasts$naive <- naive(x, 12)
par(mfrow=c(4, 2))
for(f in forecasts){
plot(f)
lines(test_x, col='red')
}
Como se puede ver, el modelo arima se presenta la tendencia de malo, pero me gusta el aspecto de la "Estructurales Básicos del Modelo"
Por último, he medido para cada modelo de precisión en el ajuste de prueba:
acc <- lapply(forecasts, function(f){
accuracy(f, test_x)[2,,drop=FALSE]
})
acc <- Reduce(rbind, acc)
row.names(acc) <- names(forecasts)
acc <- acc[order(acc[,'MASE']),]
round(acc, 2)
ME RMSE MAE MPE MAPE MASE ACF1 Theil's U
mod_sts 283.15 609.04 514.46 0.69 1.27 0.10 0.77 1.65
mod_bats 65.36 706.93 638.31 0.13 1.59 0.12 0.85 1.96
mod_tbats 65.22 706.92 638.32 0.13 1.59 0.12 0.85 1.96
mod_exp 25.00 706.52 641.67 0.03 1.60 0.12 0.85 1.96
naive 25.00 706.52 641.67 0.03 1.60 0.12 0.85 1.96
mod_neural 81.14 853.86 754.61 0.18 1.89 0.14 0.14 2.39
mod_arima 766.51 904.06 766.51 1.90 1.90 0.14 0.73 2.48
mod_stl -208.74 1166.84 1005.81 -0.52 2.50 0.19 0.32 3.02
Las métricas utilizadas se describen en Hyndman, R. J. y Athanasopoulos, G. (2014) "Forecasting: principios y práctica", que también resultan ser los autores de la previsión del paquete. Le recomiendo que lea su texto: está disponible para libre en línea. Estructurales de series de tiempo es el mejor modelo por varias métricas, incluyendo MASE, que es la métrica que tienden a preferir para la selección de modelo.
Una pregunta final es: ¿el modelo estructural tener suerte en este conjunto de pruebas? Una forma de evaluar este es el aspecto en el conjunto de entrenamiento de errores. Conjunto de entrenamiento errores son menos fiables que las de la prueba de conjunto de errores (porque no puede ser sobre-ajuste), pero en este caso el modelo estructural todavía sale en la parte superior:
acc <- lapply(forecasts, function(f){
accuracy(f, test_x)[1,,drop=FALSE]
})
acc <- Reduce(rbind, acc)
row.names(acc) <- names(forecasts)
acc <- acc[order(acc[,'MASE']),]
round(acc, 2)
ME RMSE MAE MPE MAPE MASE ACF1 Theil's U
mod_sts -0.03 0.99 0.71 0.00 0.00 0.00 0.08 NA
mod_neural 3.00 1145.91 839.15 -0.09 2.25 0.16 0.00 NA
mod_exp -82.74 1915.75 1359.87 -0.33 3.68 0.25 0.06 NA
naive -86.96 1936.38 1386.96 -0.34 3.75 0.26 0.06 NA
mod_arima -180.32 1889.56 1393.94 -0.74 3.79 0.26 0.09 NA
mod_stl -38.12 2158.25 1471.63 -0.22 4.00 0.28 -0.09 NA
mod_bats 57.07 2184.16 1525.28 0.00 4.07 0.29 -0.03 NA
mod_tbats 62.30 2203.54 1531.48 0.01 4.08 0.29 -0.03 NA
(Tenga en cuenta que la red neuronal overfit, de realizar un excelente sobre el conjunto de entrenamiento y el mal en el conjunto de prueba)
Finalmente, sería una buena idea realizar una validación cruzada de todos estos modelos, tal vez por su formación en 2008-2009/la prueba en 2010, la formación en el período 2008-2010/pruebas en 2011, la formación en la 2008-2011/pruebas en 2012, la formación en 2008-2012/pruebas en 2013, y un promedio de errores a través de todos estos periodos de tiempo. Si usted desea bajar de esa ruta, tengo un parcial paquete completo para la cruz de la validación de modelos de serie de tiempo en github que me encantaría que usted pruebe y me de su opinión/pull requests en:
devtools::install_github('zachmayer/cv.ts')
library(cv.ts)
Edit 2: vamos a ver si recuerdo cómo usar mi propio paquete!
Primero de todo, instalar y cargar el paquete de github (ver arriba). Luego validación cruzada de algunos modelos (utilizando el conjunto de datos completo):
library(cv.ts)
x <- ts(dat$Coil, start=c(dat$Year[1], dat$Month[1]), frequency=12)
ctrl <- tseriesControl(stepSize=1, maxHorizon=12, minObs=36, fixedWindow=TRUE)
models <- list()
models$arima = cv.ts(
x, auto.arimaForecast, tsControl=ctrl,
ic='aicc', stepwise=FALSE)
models$exp = cv.ts(
x, etsForecast, tsControl=ctrl,
ic='aicc', restrict=FALSE)
models$neural = cv.ts(
x, nnetarForecast, tsControl=ctrl,
nn_p=6, size=5)
models$tbats = cv.ts(
x, tbatsForecast, tsControl=ctrl,
seasonal.periods=12)
models$bats = cv.ts(
x, batsForecast, tsControl=ctrl,
seasonal.periods=12)
models$stl = cv.ts(
x, stl.Forecast, tsControl=ctrl,
s.window=12, ic='aicc', robust=TRUE, method='ets')
models$sts = cv.ts(x, stsForecast, tsControl=ctrl)
models$naive = cv.ts(x, naiveForecast, tsControl=ctrl)
models$theta = cv.ts(x, thetaForecast, tsControl=ctrl)
(Tenga en cuenta que he reducido la flexibilidad del modelo de red neuronal, para tratar de impedir que el sobreajuste)
Una vez que hemos ajuste de los modelos, se puede comparar por MAPE (cv.ts aún no soporta MASE):
res_overall <- lapply(models, function(x) x$results[13,-1])
res_overall <- Reduce(rbind, res_overall)
row.names(res_overall) <- names(models)
res_overall <- res_overall[order(res_overall[,'MAPE']),]
round(res_overall, 2)
ME RMSE MAE MPE MAPE
naive 91.40 1126.83 961.18 0.19 2.40
ets 91.56 1127.09 961.35 0.19 2.40
stl -114.59 1661.73 1332.73 -0.29 3.36
neural 5.26 1979.83 1521.83 0.00 3.83
bats 294.01 2087.99 1725.14 0.70 4.32
sts -698.90 3680.71 1901.78 -1.81 4.77
arima -1687.27 2750.49 2199.53 -4.23 5.53
tbats -476.67 2761.44 2428.34 -1.23 6.10
Ouch. Parece que nuestro estructurales de previsión que tienen suerte. En el largo plazo, la ingenua previsión que hace el mejor de los pronósticos de media en los 12 meses horizonte (el modelo arima es todavía uno de los peores modelos). Vamos a comparar los modelos en cada una de las 12 horizontes de pronóstico, y ver si alguna de ellas alguna vez vencer a los ingenuos modelo:
library(reshape2)
library(ggplot2)
res <- lapply(models, function(x) x$results$MAPE[1:12])
res <- data.frame(do.call(cbind, res))
res$horizon <- 1:nrow(res)
res <- melt(res, id.var='horizon', variable.name='model', value.name='MAPE')
res$model <- factor(res$model, levels=row.names(res_overall))
ggplot(res, aes(x=horizon, y=MAPE, col=model)) +
geom_line(size=2) + theme_bw() +
theme(legend.position="top") +
scale_color_manual(values=c(
"#1f78b4", "#ff7f00", "#33a02c", "#6a3d9a",
"#e31a1c", "#b15928", "#a6cee3", "#fdbf6f",
"#b2df8a")
)
De hecho, el modelo de suavizado exponencial es siempre escoger el modelo ingenuo (la línea naranja y azul de la línea de superposición 100%). En otras palabras, la ingenua previsión de que "el mes que viene de la bobina de precios será el mismo que el de este mes de la bobina de precios" es más preciso (en casi todo el horizonte de previsión) de 7 extremadamente sofisticados modelos de serie de tiempo. Si no se dispone de información secreta de la bobina de mercado no ya sabes, superando a los ingenuos de la bobina pronóstico del precio va a ser extremadamente difícil.
Nunca es la respuesta que nadie quiere escuchar, pero si la precisión del pronóstico es su meta, usted debe usar el modelo más preciso. Utilizar el modelo ingenuo.