library('ggplot2')
library('ggfortify')
library('foreign')
Cameron Consulting Corporation se especializa en ofrecer portafolios de inversión. Se desea usar la metodología de Box-Jenkins con el índice de transportación del Dow Jones. La base de datos contiene 65 promedios diarios al cierre de operaciones del mencionado índice durante los meses de verano. Los datos se encuentran el archivo Tab9-3.dta
.
cameron<-read.dta("Tab9-3.dta")
Definiremos primero la serie como una serie de tiempo:
cameron<-ts(cameron[,1])
El primer paso en la identificación del modelo es determinar si la serie es estacionaria, es decir, si la serie de tiempo parece variar alrededor de un nivel fijo. Es útil observar una gráfica de la serie junto con la función de autocorrelaci?n de la muestra.Examinemos el comportamiento de la serie a través del tiempo mediante un gráfico.
autoplot(cameron)
En la figura 01 aparece el gráfico de la serie original, la cual muestra un comportamiento creciente, indicando con esto la no presencia de estacionariedad. El siguiente paso en la identificación de un modelo tentativo es examinar las autocorrelaciones de muestra de datos.
autoplot(acf(cameron,30,main='', sub="Figura 01: Función de Autocorrelación Simple"))
El correlograma muestra un desvanecimiento lento de la función de autocorrelación indicando también no estacionariedad en la serie original.
autoplot(pacf(cameron,30,main='',sub="Figura 02: Función de Autocorrelación Parcial"))
Confirmaremos lo dicho anteriormente con la prueba de Dickey - Fuller.
Para esto solicitamos el paquete fUnitRoots
.
library('fUnitRoots')
## Loading required package: timeDate
## Loading required package: timeSeries
## Loading required package: fBasics
1. Planteamiento de Hipótesis
Ho: La serie es no estacionaria: Tiene raíz unitaria
H1: La serie es estacionaria: No Tiene raíz unitaria
2. Nivel de Significancia: \(\alpha\) = 0.05
3. Estadístico de Prueba
adfTest(cameron,lags=0,type=c("c"))
## Warning in adfTest(cameron, lags = 0, type = c("c")): p-value greater than
## printed p-value
##
## Title:
## Augmented Dickey-Fuller Test
##
## Test Results:
## PARAMETER:
## Lag Order: 0
## STATISTIC:
## Dickey-Fuller: 2.2962
## P VALUE:
## 0.99
##
## Description:
## Wed Jun 24 20:48:58 2020 by user:
4. Decisión
El valor del estadístico es 2.2962, con un valor p mayor a 0.05 por lo que la hipótesis nula no se rechaza.
5. Conclusión
La serie original no es estacionaria.
El siguiente paso es tomar la primera diferencia a la serie.
autoplot(diff(cameron))
Al tomar las primeras diferencias observamos que la serie se estabiliza en torno a un valor medio. (Figura 03)
autoplot(acf(diff(cameron)))
autoplot(pacf(diff(cameron)))
Así mismo el correlograma confirma un declinamiento rápido en el tiempo de la AFC y PAFC. (Figura 04 y 05)
1. Planteamiento de Hipótesis
Ho: La serie en primera diferencia es no estacionaria: Tiene raíz
unitaria
H1: La serie en primera diferencia es estacionaria: No Tiene raíz
unitaria
2. Nivel de Significancia: \(\alpha\) = 0.05
3. Estadístico de Prueba
adfTest(diff(cameron),lags=0,type=c("c"))
## Warning in adfTest(diff(cameron), lags = 0, type = c("c")): p-value smaller than
## printed p-value
##
## Title:
## Augmented Dickey-Fuller Test
##
## Test Results:
## PARAMETER:
## Lag Order: 0
## STATISTIC:
## Dickey-Fuller: -5.8363
## P VALUE:
## 0.01
##
## Description:
## Wed Jun 24 20:49:03 2020 by user:
4. Decisión
El valor del estad?stico es -5.8363, con un valor p menor a 0.05 por lo que la hip?tesis nula se rechaza.
5. Conclusión
La serie en primera diferencia es estacionaria.
Una vez que se ha obtenido una serie estacionaria, debemos identificar la forma del modelo que se utilizará. La identificación de la forma del modelo se lleva a cabo comparando las autocorrelaciones y las autocorrelaciones parciales calculadas con los datos de la autocorrelaciones y las autocorrelaciones parciales teóricas de los diferentes modelos ARIMA.
En los correlogramas podemos observar lo siguiente: * En la ACF, la primera autocorrelación es significativa y además parece ser que los valores de la PACF disminuyen en forma oscilatoria. Esto nos lleva a pensar en un primer modelo:
\[\ y_{t}= \epsilon_{t}-\theta_{1} \epsilon_{t-1}\]
\[\ y_{t}= \phi_{0}+ \phi_{1} y_{t-1}+ \epsilon_{t}\]
Una vez que se han seleccionado los modelos tentativos, se deben estimar los par?metros para estos modelos.
Modelo 1
library('forecast')
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
## Registered S3 methods overwritten by 'forecast':
## method from
## autoplot.Arima ggfortify
## autoplot.acf ggfortify
## autoplot.ar ggfortify
## autoplot.bats ggfortify
## autoplot.decomposed.ts ggfortify
## autoplot.ets ggfortify
## autoplot.forecast ggfortify
## autoplot.stl ggfortify
## autoplot.ts ggfortify
## fitted.ar ggfortify
## fortify.ts ggfortify
## residuals.ar ggfortify
library("lmtest")
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following object is masked from 'package:timeSeries':
##
## time<-
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
arima1<-Arima(cameron, order=c(1,1,0),include.drift = TRUE)
arima1
## Series: cameron
## ARIMA(1,1,0) with drift
##
## Coefficients:
## ar1 drift
## 0.2800 1.0353
## s.e. 0.1195 0.3195
##
## sigma^2 estimated as 3.538: log likelihood=-130.27
## AIC=266.53 AICc=266.93 BIC=273.01
coeftest(arima1)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.28003 0.11946 2.3440 0.019077 *
## drift 1.03527 0.31947 3.2406 0.001193 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Modelo 2
arima2<-Arima(cameron, order=c(0,1,1),include.drift = TRUE)
arima2
## Series: cameron
## ARIMA(0,1,1) with drift
##
## Coefficients:
## ma1 drift
## 0.2867 1.0380
## s.e. 0.1203 0.2968
##
## sigma^2 estimated as 3.54: log likelihood=-130.28
## AIC=266.56 AICc=266.96 BIC=273.04
coeftest(arima2)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ma1 0.28669 0.12029 2.3834 0.0171551 *
## drift 1.03801 0.29678 3.4976 0.0004694 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Los resultados son similares en cuanto al valor de AIC y \(\sigma^{2}\) por lo que decidimos por el modelo AR(1).
Modelo 3
arima3<-Arima(cameron,c(1,1,1),include.drift = TRUE)
arima3
## Series: cameron
## ARIMA(1,1,1) with drift
##
## Coefficients:
## ar1 ma1 drift
## 0.8356 -0.6493 1.0184
## s.e. 0.1635 0.2108 0.4659
##
## sigma^2 estimated as 3.526: log likelihood=-129.69
## AIC=267.38 AICc=268.06 BIC=276.01
coeftest(arima3)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.83555 0.16346 5.1115 3.196e-07 ***
## ma1 -0.64926 0.21080 -3.0800 0.00207 **
## drift 1.01842 0.46594 2.1857 0.02884 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
La siguiente figura muestra una posible estacionariedad entre los residuales del modelo. Esto lo confirmaremos con un correlograma.
checkresiduals(arima1)
##
## Ljung-Box test
##
## data: Residuals from ARIMA(1,1,0) with drift
## Q* = 11.346, df = 8, p-value = 0.1828
##
## Model df: 2. Total lags used: 10
autoplot(acf(arima1$residuals))
autoplot(pacf(arima1$residuals))
Los correlogramas muestran que no existe autocorrelación significativa en los residuales.
También podemos usar los paquetes ggplot2 y ggfortify para chequear la estacionariedad de los residuales.
ggtsdiag(arima(diff(cameron),c(1,0,0)))
Los gráficos Q-Q son una herramienta eficaz para evaluar la normalidad. Aquí las aplicamos a los residuos.
qqnorm(arima1$residuals, sub="Figura 09: Gr?fico Q para evaluar
normalidad");qqline(arima1$residuals)
El diagrama Q-Q de los residuos del modelo AR(1) estimado para la serie se muestra en la Figura 09. Los puntos parecen seguir la línea recta bastante de cerca, aunque parece desviars en el extremo superior. Este gráfico no nos llevar?a a rechazar la normalidad de los términos de error en este modelo.
Además, la prueba de normalidad de Shapiro-Wilk aplicada a los residuos produce un estadístico de prueba de W = 0.97148, lo que corresponde a un valor de p de 0.1445, y no rechazaría la normalidad basado en esta prueba.
shapiro.test(arima1$residuals)
##
## Shapiro-Wilk normality test
##
## data: arima1$residuals
## W = 0.97342, p-value = 0.1746
autoplot(arima1)
autoplot(forecast(arima1))