En este ejercicio haremos un análisis de series de tiempo acerca de los precios del petróleo observados desde enero de 2013.
library(tseries)
library(forecast)
library(readxl)
library(knitr)
library(dplyr)
library(kableExtra)
Arimar <- read_excel("C:/Users/IvanaTorresUgalde/Documents/Modelos Lineales/Arimar.xlsx")
Arimar.ts <- ts(Arimar, start=c(2013,1), frequency = 12)
Arimar.ts
## Jan Feb Mar Apr May Jun Jul
## 2013 97.98278 103.35294 100.77090 97.75538 97.90686 96.99315 99.67255
## 2014 88.31081 90.82224 91.39522 93.88863 95.08631 97.01105 93.32017
## 2015 40.45127 45.98606 46.01733 49.32555 52.03910 52.82573 45.16595
## 2016 23.10238 23.72933 28.32656 31.33582 36.72636 39.80715 37.97153
## 2017 44.50008 44.17497 41.93243 43.22118 43.85074 41.15105 43.87771
## 2018 57.45399 56.15676 57.22458 58.15973 62.89929 64.63686 66.42162
## 2019 54.05666 57.37981 59.46449 62.07703 60.33674 56.90537 57.87580
## 2020 49.79299 44.63505 28.92302
## Aug Sep Oct Nov Dec
## 2013 99.24414 98.14572 93.87329 88.48590 89.40966
## 2014 89.50745 84.12824 72.50936 63.47980 50.18138
## 2015 38.41927 36.29036 34.86077 32.50883 26.19610
## 2016 37.74090 36.82666 40.66836 38.36162 42.32596
## 2017 45.55484 48.16237 48.89114 53.34505 54.05576
## 2018 64.26567 68.36348 71.15330 59.82583 51.86867
## 2019 49.58496 55.05522 51.00463 50.68969 54.54901
## 2020
Iniciaremos observando el comportamiento de los datos a través del tiempo y descomponiendo la serie en 4 factores.
plot(Arimar.ts, main="Precios de petroleo", ylab="Precio", col="red")
plot(decompose(Arimar.ts))
De la primera gráfica observamos que el comportamiento no es estacional, podemos comprobar esto a través del test Dickey Fuller.
df_ts<-adf.test(Arimar.ts)
df_ts
##
## Augmented Dickey-Fuller Test
##
## data: Arimar.ts
## Dickey-Fuller = -1.6185, Lag order = 4, p-value = 0.7328
## alternative hypothesis: stationary
Al obtener un p-value de 0.7328 no rechazamos la hipótesis nula de que la serie no sea estacionaria.
Una función útil para darnos una idea de cuántas veces será necesario hacer diferenciación es
ndiffs(Arimar.ts, alpha = 0.05)
## [1] 1
Sin embargo, para asegurar estacionalidad volveremos a aplicar el test de Diceky Fuller.
seriedif<-diff(Arimar.ts)
plot(seriedif)
df_d1<-adf.test(seriedif)
df_d1
##
## Augmented Dickey-Fuller Test
##
## data: seriedif
## Dickey-Fuller = -3.3327, Lag order = 4, p-value = 0.07162
## alternative hypothesis: stationary
Si establecemos un \(\alpha=0.05\), y lo comparamos con el p-value obtenido de 0.0716 nos encontramos con que, a pesar de que la serie se observa más o menos estacional, será necesario aplicar diferenciación una vez más.
seriedif2<-diff(Arimar.ts, differences =2)
plot(seriedif2)
adf.test(seriedif2)
## Warning in adf.test(seriedif2): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: seriedif2
## Dickey-Fuller = -5.1673, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
En esta ocasión rechazamos la hipótesis nula.
# AR(p) I(d) MA(q)
acf(ts(seriedif2, frequency=1)) #parámetro q
pacf(ts(seriedif2, frequency=1)) #parámetro p
Con lo observado en la gráfica proponemos un modelo ARIMA(1,2,1), así como un modelo alternativo ARIMA(1,2,2).
Verificaremos adecuación del modelo mediante la prueba de Ljung-Box, buscaremos no rechazar la hipótesis nula.
modelo1<-arima(Arimar.ts,order=c(1,2,1))
summary(modelo1)
##
## Call:
## arima(x = Arimar.ts, order = c(1, 2, 1))
##
## Coefficients:
## ar1 ma1
## 0.4173 -1.000
## s.e. 0.1100 0.047
##
## sigma^2 estimated as 17.51: log likelihood = -244.07, aic = 494.14
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set -0.1842755 4.136183 3.135096 -0.2061955 6.279221 0.9152235
## ACF1
## Training set -0.02472726
Box.test(residuals(modelo1),type="Ljung-Box")
##
## Box-Ljung test
##
## data: residuals(modelo1)
## X-squared = 0.055051, df = 1, p-value = 0.8145
modelo2<-arima(Arimar.ts,order=c(1,2,2))
summary(modelo2)
##
## Call:
## arima(x = Arimar.ts, order = c(1, 2, 2))
##
## Coefficients:
## ar1 ma1 ma2
## 0.5405 -1.1421 0.1421
## s.e. 0.1992 0.2171 0.2128
##
## sigma^2 estimated as 17.45: log likelihood = -243.86, aic = 495.72
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set -0.2039827 4.129552 3.12132 -0.2394872 6.262272 0.9112018
## ACF1
## Training set 0.001116518
Box.test(residuals(modelo2),type="Ljung-Box")
##
## Box-Ljung test
##
## data: residuals(modelo2)
## X-squared = 0.00011224, df = 1, p-value = 0.9915
Por resultados de la prueba Ljung-Box podemos afirmar que ambos modelos se ajustan bien a los datos, usaremos el criterio AIC para elegir alguno de los dos
| Modelo 1 | Modelo 2 | |
|---|---|---|
| AIC | 494.1389 | 495.719 |
Elegiremos el Modelo 1 ya que tiene un menor AIC. Por lo que ahora podemos calcular los pronósticos.
pronostico<-forecast::forecast(modelo1,h=10)
pronostico
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## Apr 2020 21.856654 16.4633719 27.24994 13.608341 30.10497
## May 2020 18.398192 8.9934192 27.80296 4.014833 32.78155
## Jun 2020 16.445341 3.6136910 29.27699 -3.178974 36.06966
## Jul 2020 15.120795 -0.6776994 30.91929 -9.040917 39.28251
## Aug 2020 14.058445 -4.3652157 32.48211 -14.118113 42.23500
## Sep 2020 13.105513 -7.6904599 33.90149 -18.699183 44.91021
## Oct 2020 12.198241 -10.7797404 35.17622 -22.943549 47.34003
## Nov 2020 11.310024 -13.7033148 36.32336 -26.944576 49.56462
## Dec 2020 10.429758 -16.5031190 37.36264 -30.760523 51.62004
## Jan 2021 9.552811 -19.2060240 38.31165 -34.430032 53.53565
plot(pronostico)