ANÁLISIS DESCRIPTIVO DE SERIES TEMPORALES CON “R” 1) Formas de configurar una serie en “R”. La función ts Para hacer descomposición de series temporales con la función decompose la serie debe de estar configurada de manera que sea reconocible el período. Por ejemplo: • LOS DATOS: Matriculaciones de turismos entre enero de 1960 y diciembre de 1999. • SUPONGAMOS QUE LOS TENEMOS EN UNA COLUMNA: x<-scan(‘matricul.dat’) • PARA CONFIGURARLOS COMO SERIE TEMPORAL, EN “R” HAY QUE USAR LA FUNCIÓN “ts” INDICANDO EL PERIODO: x<-ts(x,start=1960,frequency=12) Los ficheros “R” del tipo “ts” ya están configurados como series temporales y, por tanto, no necesitan definirse como tales usando un comando del tipo x<-ts(x,start=1959,frequency=12). Por ejemplo: data(AirPassengers) plot(AirPassengers) data(co2) plot(co2) 2) Representación gráfica: plot(x) 3) Análisis descriptivo elemental: tendencia, estacional, residual -Aditivo : X t = Tt + S t + et -Multiplicativo : X t = Tt S t + et Forma de realizarlo con R : plot(decompose(co2)) plot(decompose(AirPassengers,type=”multiplicative”)) 4) Cómo calcular la tendencia Un ejemplo de cálculo de tendencia determinística: # Vamos a ajustar un polinomio de segundo grado tendencia<-lm(ser~t+I(t^2)) T<-predict(tendencia) plot(ser) lines(c(t),T,col="red",lty="dashed") summary(tendencia) Para calcular la tendencia con “decompose”: TendenciaAir<-decompose(AirPassengers)$trend plot(TendenciaAir) Para calcular la tendencia con “filter”: plot(filter(AirPassengers,filter=rep(1/3,3),sides=2,method="convolution")) plot(filter(AirPassengers,filter=rep(1/5,5),sides=2,method="convolution")) plot(filter(AirPassengers,filter=rep(1/9,9),sides=2,method="convolution")) 5) Para calcular y representar la función de autocorrelaciones: acf(x) plot(acf(x)) 6) Transformación de Box-Cox library(car) plot(ts(box.cox(AirPassengers,_),start=1949,frequency=12)) GENERACIÓN DE MODELOS ARMA y ARIMA: 7) Para simular una serie de acuerdo con un modelo ARMA prefijado: x <- arima.sim(n=10000,model=list(ar=c(0.3,0.6),ma=c(2,3)),sd=1) 8) Para simular una serie de acuerdo con un modelo ARIMA prefijado: x<-arima.sim(10000,model=list(order=c(2,1,0), ar=c(0.7,0.1)),sd=1) 9) Para diferenciar una serie: x1<-diff.ts(x) La diferenciación se deshace con diffinv(x,lag,xi) 10) Ejercicios: 1. Generar proceso AR(1) con φ1 =0.9 y -0.9 2. Generar procesos AR(2), con los siguiente valores de los parámetros: (a) φ1 = 0.3 , φ 2 = 0.6 (poner siempre σ 2 = 1 ; generar 10000 observaciones) (b) φ1 = 0.3 , φ 2 = −0.6 (c) φ1 = −0.4 , φ 2 = 0.5 En cada caso, representar la función de autocorrelación. Comparar los gráficos obtenidos. ¿Qué ocurre si se intenta generar un proceso AR(2) con φ1 = 0.3 , φ 2 = 0.9 ? 3. Generar procesos MA y ARMA con: (a) θ1 = 2 , θ 2 = 3 (b) θ1 = 2 , θ 2 = −3 (c) θ1 = −2 , θ 2 = 3 (d) θ1 = −2 , θ 2 = −3 (e) θ1 = 10 , θ 2 = 8 , θ 3 = 6 , θ 4 = 4 , θ 5 = 2 , θ 6 = 1 , θ 7 = 0.5 (f) φ1 = 0.3 , φ 2 = 0.6 , En cada caso, representar la función de autocorrelación y comparar los gráficos obtenidos. 4. Generar un proceso ARIMA no estacionario. Representar gráficamente las observaciones. Convertir el proceso en estacionario con una transformación adecuada. 5. Generar un proceso ARIMA (1,1,0) y un proceso AR(1) con φ1 = 0.9999 . Representar las respectivas funciones de autocorrelación y comparar los resultados. ESTIMACIÓN DE LOS PARÁMETROS EN MODELOS ARMA y ARIMA: 11) Con la función arma x<-arima.sim(10000,model=list(order=c(2,0,0), ar=c(0.7,0.1)),sd=1) arma(x,order=c(2,0,0)) (Para usar la función “arma” hay que cargar el paquete “tseries”) 12) Con la function arima x<-arima.sim(10000,model=list(order=c(2,1,0), ar=c(0.7,0.1)),sd=1) arima(x,order=c(2,1,0)) PREDICCIÓN EN MODELOS ARMA y ARIMA 13) Función predict predict(arima(x, order = c(2,0,0)), n.ahead = 12) Prediction<-predict(arima(x,order=c(p,d,q)),n.ahead=12)$pred Error<-predict(arima(x,order=c(p,d,q)),n.ahead=12)$se SELECCIÓN DEL ORDEN p, q EN UN MODELO ARMA(p,q) 14) Se utiliza el criteriode Akaike. Por ejemplo, para elegir entre un modelo AR(2) y AR(1) para unos datos “x”: x<-arima.sim(10000,model=list(order=c(2,0,0), ar=c(0.7,0.1)),sd=1) AIC(arima(x,order=c(2,0,0)),arima(x,order=c(1,0,0))) # Se obtiene la siguiente salida: df AIC arima(x, order = c(2, 0, 0)) 4 28249.52 arima(x, order = c(1, 0, 0)) 3 28347.77 Esto significa que el modelo AR(2) debe ser preferido frente al AR(1) en este caso, porque el valor del estadístico de Akaike es menor. DIFERENTES TESTS ÚTILES 15) Test de Dickey-Fuller para contrastar la hipótesis nula de que hay una raíz unidad en el polinomio autoregresivo: adf.test (está en el paquete “tseries”) 16) Test de Jarque-Bera y de Shapiro-Wilk para normalidad: jarque.bera.test, shapiro.test 17) Test de Ljung-Box para la hipótesis de independencia: Box.test ESTUDIO DE UN EJEMPLO CON DATOS REALES: LOS DATOS “Air Passengers” PREDICCIÓN CON UN MODELO AR(2) data(AirPassengers) x<-AirPassengers x<-log(x) x1<-diff(x,lag=12) # Para invertirlo: x<-diffinv(x1,lag=12,xi=x[1:12]) adf.test(x1) # Augmented Dickey-Fuller Test # #data: x1 #Dickey-Fuller = -3.1899, Lag order = 5, p-value = 0.09265 # alternative hypothesis: stationary x2<-diff(x1) adf.test(x2) # # Augmented Dickey-Fuller Test # #data: x2 # Dickey-Fuller = -5.1993, Lag order = 5, p-value = 0.01 #alternative hypothesis: stationary # #Warning message: #p-value smaller than printed p-value in: adf.test(x2) x2.pred<-predict(arima(x2,order=c(2,0,0)),n.ahead=12)$pred x.completada<-c(x2,x2.pred) xinv1<-diffinv(x.completada,lag=1,xi=x1[1]) xinv2<-diffinv(xinv1,lag=12,xi=x[1:12]) x.reconstruida<-ts(xinv2,start=1949,frequency=12) # Comprobación de que la reconstrucción fue correcta: yy<-x-x.reconstruida[1:144] # yy debe ser una serie de 0's plot(x.reconstruida) # Las predicciones para el año siguiente son: exp(x.reconstruida[145:156]) # [1] 446.7995 418.4874 448.7395 493.7793 505.6989 573.3267 666.7192 649.7222 544.7807 494.4949 418.4353 463.6074 # Se ha utilizado un modelo AR(2). Más adelante veremos cómo se puede # hacer la selección de este modelo SELECCIÓN DEL MODELO. ESTIMACIÓN x<-AirPassengers x<-log(x) x1<-diff(x,lag=12) x2<-diff(x1,lag=1) library(tseries) adf.test(x2) mean(x2) # En un primer tanteo representamos las funciones acf y pacf para los datos #transformados: plot(acf(x2)) plot(pacf(x2)) # Estas gráficas sugieren que pudiera ser adecuado un modelo autorregresivo (quizá de #orden grande) # La función “ar” permite seleccionar automáticamente “el #mejor” modelo #autorregresivo: ar(x2) #Call: #ar(x = x2) # #Coefficients: # 1 2 3 4 5 6 7 8 9 10 11 12 #-0.3596 -0.0528 -0.1516 -0.1092 0.0473 0.0883 0.0144 0.0304 0.1648 0.0357 #-0.0805 -0.3387 # #Order selected 12 sigma^2 estimated as 0.001613 # Comprobamos que, efectivamente, el ajuste con AR(12) es mejor que con AR(2): AIC(arima(x2,order=c(12,0,0)),arima(x2,order=c(2,0,0))) PREDICCIÓN CON EL MODELO AR(12) # Predicción: x2.pred.ar12<predict(arima(x2,order=c(12,0,0)),n.ahead=12)$pred # Errores de predicción: x2.err.ar12<predict(arima(x2,order=c(12,0,0)),n.ahead=12)$se # El resto del proceso (para deshacer los cambios y volver a la serie original) se hace como se indica más arriba: x.completada<-c(x2,x2.pred.ar12) xinv1<-diffinv(x.completada,lag=1,xi=x1[1]) xinv2<-diffinv(xinv1,lag=12,xi=x[1:12]) x.reconstruida<-ts(xinv2,start=1949,frequency=12) # Comprobación de que la reconstrucción fue correcta: yy<-x-x.reconstruida[1:144] ## yy debe ser una serie de 0’s # Las predicciones para el año siguiente de la serie #original son: exp(x.reconstruida[145:156]) # [1] 458.5663 432.4986 479.3241 497.0851 517.9248 582.0030 #688.9856 677.0559 558.8173 505.6624 438.8455 484.6580 DIAGNÓSTICO DEL MODELO AR(12) # Cálculo de los residuos res.ar12<-residuals(arima(x2,order=c(12,0,0))) # Representación de los residuos y de sus funciones de autocorrelación: plot(res.ar12) acf(res.ar12) pacf(res.ar12) # Tests de aleatoriedad y normalidad de los residuos: Box.test(res.ar12) shapiro.test(res.ar12) jarque.bera.test(res.ar12) # Los tres se superan con p-valores relativamente altos lo #que indica un razonable ajuste del modelo.