Entiendo que deberíamos usar ARIMA para modelar una serie de tiempo no estacionaria. Además, todo lo que leo dice que ARMA solo debe usarse para series temporales estacionarias.
Lo que estoy tratando de entender es, ¿qué sucede en la práctica cuando clasifico mal un modelo y supongo d = 0
una serie temporal que no es estacionaria? Por ejemplo:
controlData <- arima.sim(list(order = c(1,1,1), ar = .5, ma = .5), n = 44)
los datos de control se ven así:
[1] 0.0000000 0.1240838 -1.4544087 -3.1943094 -5.6205257
[6] -8.5636126 -10.1573548 -9.2822666 -10.0174493 -11.0105225
[11] -11.4726127 -13.8827001 -16.6040541 -19.1966633 -22.0543414
[16] -24.8542959 -25.2883155 -23.6519271 -21.8270981 -21.4351267
[21] -22.6155812 -21.9189036 -20.2064343 -18.2516852 -15.5822178
[26] -13.2248230 -13.4220158 -13.8823855 -14.6122867 -16.4143756
[31] -16.8726071 -15.8499558 -14.0805114 -11.4016515 -9.3330560
[36] -7.5676563 -6.3691600 -6.8471371 -7.5982880 -8.9692152
[41] -10.6733419 -11.6865440 -12.2503202 -13.5314306 -13.4654890
Suponiendo que no sabía que los datos eran ARIMA(1,1,1)
, podría echar un vistazo pacf(controlData)
.
Luego uso Dickey-Fuller para ver si los datos no son estacionarios:
require('tseries')
adf.test(controlData)
# Augmented Dickey-Fuller Test
#
# data: controlData
# Dickey-Fuller = -2.4133, Lag order = 3, p-value = 0.4099
# alternative hypothesis: stationary
adf.test(controlData, k = 1)
# Augmented Dickey-Fuller Test
#
#data: controlData
# Dickey-Fuller = -3.1469, Lag order = 1, p-value = 0.1188
# alternative hypothesis: stationary
Entonces, podría suponer que los datos son ARIMA (2,0, *) ¿Entonces usar auto.arima(controlData)
para tratar de obtener el mejor ajuste?
require('forecast')
naiveFit <- auto.arima(controlData)
naiveFit
# Series: controlData
# ARIMA(2,0,1) with non-zero mean
#
# Coefficients:
# ar1 ar2 ma1 intercept
# 1.4985 -0.5637 0.6427 -11.8690
# s.e. 0.1508 0.1546 0.1912 3.2647
#
# sigma^2 estimated as 0.8936: log likelihood=-64.01
# AIC=138.02 AICc=139.56 BIC=147.05
Entonces, aunque los datos pasados y futuros son ARIMA (1,1,1), podría estar tentado a clasificarlos como ARIMA (2,0,1). tsdata(auto.arima(controlData))
se ve bien también.
Esto es lo que encontraría un modelador informado:
informedFit <- arima(controlData, order = c(1,1,1))
# informedFit
# Series: controlData
# ARIMA(1,1,1)
#
# Coefficients:
# ar1 ma1
# 0.4936 0.6859
# s.e. 0.1564 0.1764
#
# sigma^2 estimated as 0.9571: log likelihood=-62.22
# AIC=130.44 AICc=131.04 BIC=135.79
1) ¿Por qué estos criterios de información son mejores que el modelo seleccionado auto.arima(controlData)
?
Ahora, comparo gráficamente los datos reales y los 2 modelos:
plot(controlData)
lines(fitted(naiveFit), col = "red")
lines(fitted(informedFit), col = "blue")
2) Jugando al abogado del diablo, ¿qué tipo de consecuencias pagaría al usar un ARIMA (2, 0, 1) como modelo? ¿Cuáles son los riesgos de este error?
3) Estoy principalmente preocupado por cualquier implicación para las predicciones de varios períodos hacia adelante. ¿Asumo que serían menos precisos? Solo estoy buscando alguna prueba.
4) ¿Sugeriría un método alternativo para la selección del modelo? ¿Hay algún problema con mi razonamiento como modelador "desinformado"?
Tengo mucha curiosidad sobre cuáles son las otras consecuencias de este tipo de clasificación errónea. He estado buscando algunas fuentes y simplemente no pude encontrar nada. Toda la literatura que pude encontrar solo toca este tema, en lugar de decir que los datos deben ser estacionarios antes de realizar ARMA, y si no son estacionarios, entonces deben diferenciarse d veces.
¡Gracias!
fuente
Respuestas:
Mi impresión es que esta pregunta no tiene una respuesta única y totalmente general, por lo que solo exploraré el caso más simple y de una manera un poco informal.
y su MSE será
(el término medio del cuadrado desaparece, así como los productos cruzados de futuros errores).
así que pronosticando el nivel del proceso, tendremos
que en realidad, dado el verdadero DGP será
y entonces
mientras repito por conveniencia
Entonces, para que el modelo diferenciado funcione mejor en términos de predicción MSE, queremos
Así que, en general, sin discutir ningún método de estimación específico, creo que pudimos demostrar de manera informal que el modelo diferenciado debería funcionar mejor en términos de predicción MSE.
fuente
Esa es una buena pregunta.
Como me doy cuenta, solo has considerado pacf pero eso no es suficiente. ACF y PACF son necesarios para seleccionar el mejor modelo.
Por otro lado, las pruebas estacionarias son débiles y sensibles y necesitan una gran cantidad de retrasos para ser probadas.
Además, se prefiere hacer series temporales estacionarias antes de aplicar cualquier modelo. En términos generales, los modelos ARIMA solo consideran un caso especial de no ser estacionario (preferiblemente en tendencia).
Sobre sus preguntas, no estoy seguro acerca de la función auto.arima, pero estoy seguro de que el número de puntos de datos en su ejemplo es pequeño. Simular un modelo utilizando una gran cantidad de puntos de datos respondería bien a sus preguntas. Además, le aconsejo que considere ACF de series de tiempo, así como PACF. Acerca de la selección del modelo, la regla general es elegir el modelo más simple (tenga en cuenta que el modelo más simple después de hacer estacionarias las series de tiempo).
Os remito a esta referencia. Este libro no responde a todas sus preguntas, pero le da algunas pistas.
----- sección complementaria ------- @nsw considerando una tendencia en sus datos. Si considera un modelo estacionario, da como resultado una predicción ascendente / descendente, pero en realidad los modelos ARMA están diseñados para predecir datos planos. He cambiado su código para reflejar esta diferencia:
requerir ('pronóstico')
require ('tseries')
controlData <- arima.sim (list (orden = c (1,1,1), ar = .5, ma = .5), n = 1000 )
acf (controlData)
ts.plot (controlData)
naiveFit <- arima (controlData, order = c (2,0,1))
trueFit <- arima (controlData, orden = c (1,1,1))
PrnaiveFit <-forecast.Arima (naiveFit, 10)
PrtrueFit <- Forecast.Arima (trueFit, 10)
matplot (cbind (PrnaiveFit $ mean, PrtrueFit $ mean), type = 'b', col = c ('red', 'green'), ylab = c ('predict ion'), pch = c ('n', 't'))
fuente