Ejercicio - Series Temporales

Author

Henry Valdiviezo

Realizar un análisis de series temporales

Para el cumplimiento de esta actividad, se ha tomado como referencia la base de datos del PIB de Ecuador periodo 1960 - 2022.

Preparación de la información

El primer paso consiste en obtener la serie de datos y estructurar la información en formato de serie de datos para su posterior análisis. De este modo es organiza la información y mediante la función ts se define la estructura de esta serie de datos. En nuestro caso se trata de una serie con datos anuales, es decir con frecuencia = 1.

library(tidyverse)
library(knitr)
library(tseries)
library(forecast)
library(tidyverse)
library(stargazer) 

PIBpc <- read_csv("API_NY.GDP.PCAP.KD_DS2_es_csv_v2_13655.csv", 
                       skip = 3)

PIBpc <- PIBpc %>% filter(`Country Name`=="Ecuador")

PIBpc <- PIBpc %>% pivot_longer(5:(length(PIBpc)-1),values_to = "PIB",
names_to = "AÑO") %>% select(AÑO,PIB)

kable(head(PIBpc,10))
AÑO PIB
1960 2529.871
1961 2584.874
1962 2634.990
1963 2613.583
1964 2726.510
1965 2734.524
1966 2646.687
1967 2689.382
1968 2662.065
1969 2706.739
PIBpcECU <- ts(PIBpc$PIB, start = 1960, frequency = 1)
PIBpcECU = log(PIBpcECU)

plot(PIBpcECU)

#PIBpcECU = diff(PIBpcECU)

De la primera observación al gráfico puede observarse claramente que la serie tiene una tendencia creciente. De este modo, en la siguiente sección se tienen los códigos para identificar la estacionariedad de la serie.

Es importante señalar que una herramienta muy importante para analizar las series de tiempo es la descomposición de la misma y su análisis del ciclo, sin embargo y dado que la serie en análisis tiene frecuencia anual, no es factible aplicar este análisis, por lo que nos concentramos en la estacionariedad de la serie.

library(quantmod)

Box.test(PIBpcECU,lag = 1,type = "Ljung-Box")

    Box-Ljung test

data:  PIBpcECU
X-squared = 59.928, df = 1, p-value = 9.881e-15
#nsdiffs(PIBpcECU)
#No hay datos estacionales
plot(diff(PIBpcECU), title = "PIB Ecuador en diferencia")

Box.test(diff(PIBpcECU),lag = 1,type = "Ljung-Box")

    Box-Ljung test

data:  diff(PIBpcECU)
X-squared = 5.8013, df = 1, p-value = 0.01601

Al observar los resultados del test de Box se confirma que la serie no es estacionaria. Frente a ello se trabaja con la serie en 1era diferencia, los resultados se observan en el gráfico y muestran que la serie es estacionaria en medias, sin embargo se identifican casos atípicos que afectan a la variabilidad de los datos.

El test de Box se vuelve a aplicar con una diferencia, se muestra que la misma es estacionaria al nivel del 1%, no obstante sigue siendo no estacionaria al nivel del 5%. A pesar de esta limitación se avanza en el análisis para comprobar su comportamiento en la estimación.

#Autocorrelación parcial
acf((PIBpcECU),type = "partial")

#Autocorrelación simple
acf((PIBpcECU),type = "correlation")

#decompose(PIBpcECU)
#cycle(PIBpcECU)

En función del análisis de las autocorrelaciones parcial y simple, se puede definir el orden del modelo ARIMA. Así, del análisis de autocorrelaciones se sugiere inicialmente la presencia de un modelo ARIMA de orden p=1 y q=1. Además se incorpora una diferenciación de i = 1.

PIBpcECU %>% diff(lag=1) %>% ggtsdisplay()

Es importante profundizar el análisis y para ello se propone generar un modelo ARIMA (1,1,0), esta modificación se sugiere debido a que en el diagrama de autocorrelación simple la barra que sale de la banda de confianza no está muy marcada. De este modo, a continuación se presenta el análisis para los 2 modelos planteados.

library(stargazer)

PIBpcArima1 = Arima(PIBpcECU,order = c(1,1,1), include.drift = TRUE) 
summary(PIBpcArima1)
Series: PIBpcECU 
ARIMA(1,1,1) with drift 

Coefficients:
         ar1      ma1   drift
      0.6138  -0.3562  0.0128
s.e.  0.2616   0.3062  0.0062

sigma^2 = 0.0009259:  log likelihood = 130.07
AIC=-252.13   AICc=-251.43   BIC=-243.63

Training set error measures:
                       ME       RMSE        MAE         MPE      MAPE      MASE
Training set 5.113079e-05 0.02944698 0.02153432 0.001591979 0.2584264 0.8394332
                    ACF1
Training set 0.006723065
PIBpcArima2 = Arima(PIBpcECU,order = c(1,1,0), include.drift = TRUE)
summary(PIBpcArima2)
Series: PIBpcECU 
ARIMA(1,1,0) with drift 

Coefficients:
         ar1   drift
      0.2944  0.0129
s.e.  0.1201  0.0053

sigma^2 = 0.0009218:  log likelihood = 129.7
AIC=-253.4   AICc=-252.98   BIC=-247.01

Training set error measures:
                       ME       RMSE      MAE         MPE      MAPE      MASE
Training set 7.780706e-05 0.02962866 0.021723 0.001921028 0.2607593 0.8467884
                    ACF1
Training set -0.01838663
#stargazer(PIBpcArima1, PIBpcArima2, type = "text",  title="Evolución del PIB Ecuador")

resid_modelo1 = resid(PIBpcArima1)
resid_modelo2 = resid(PIBpcArima2)

autoplot(forecast(PIBpcArima1, h = 5, level = 0.95))

autoplot(forecast(PIBpcArima2, h = 5, level = 0.95))

par(mfrow=c(1,2))

plot(resid_modelo1)
plot(resid_modelo2)

acf(resid_modelo1)
acf(resid_modelo2)

Box.test(resid_modelo1, type = "L")

    Box-Ljung test

data:  resid_modelo1
X-squared = 0.0029854, df = 1, p-value = 0.9564
Box.test(resid_modelo2, type = "L")

    Box-Ljung test

data:  resid_modelo2
X-squared = 0.022329, df = 1, p-value = 0.8812

Se observa que los residuos de los 2 modeloes tienen un comportamiento estacionario y al comparar los valores AIC menores en el modelo 2, se tiene que el modelo ARIMA (1,1,0) presenta un mejor comportamiento.

Este procedicmiento se puede implementar también mediante el comando auto.arima en R, mediante el cual se obtienen los mismos resultados.

arimaRes = auto.arima(PIBpcECU)
summary(arimaRes)
Series: PIBpcECU 
ARIMA(1,1,0) with drift 

Coefficients:
         ar1   drift
      0.2944  0.0129
s.e.  0.1201  0.0053

sigma^2 = 0.0009218:  log likelihood = 129.7
AIC=-253.4   AICc=-252.98   BIC=-247.01

Training set error measures:
                       ME       RMSE      MAE         MPE      MAPE      MASE
Training set 7.780706e-05 0.02962866 0.021723 0.001921028 0.2607593 0.8467884
                    ACF1
Training set -0.01838663
autoplot(forecast(arimaRes, h = 5, level = 0.95))