ANÁLISIS DESCRIPTIVO DE SERIES TEMPORALES CON “R” 1

Anuncio
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.
Descargar