library(forecast)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(ggplot2)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tseries)
library(readxl)

PARTE 1

Selecciona un tema de tu interés al que se pueda aplicar un modelo ARIMA para una serie de tiempo

La balanza comercial es un indicador económico que mide la diferencia entre las exportaciones e importaciones de un país durante un período de tiempo determinado. Por lo tanto, se puede modelar la serie de tiempo de la balanza comercial y utilizarla para hacer pronósticos futuros.

Justifica brevemente la relevancia del tema y la herramienta que utilizar´as (modelo ARIMA para una serie de tiempo). Busca antecedentes en la literatura especializada.

La balanza comercial de México es una serie de tiempo que registra las importaciones y exportaciones del país en un período de tiempo específico. La aplicación de un modelo ARMA a la balanza comercial de México es importante porque permite analizar las tendencias, patrones y ciclos de la balanza comercial a lo largo del tiempo. Además, al utilizar este modelo, se pueden predecir los futuros movimientos de la balanza comercial y tomar decisiones informadas en consecuencia.Sí el modelo ARMA indica que la balanza comercial de México se inclina hacia un déficit comercial en el futuro cercano, las autoridades económicas pueden tomar medidas preventivas para reducir el déficit comercial, como fomentar las exportaciones, reducir las importaciones o promover acuerdos comerciales internacionales favorables.
• Estados Unidos: Se ha utilizado un modelo ARMA para analizar la evolución de la balanza comercial de Estados Unidos, incluyendo la relación comercial con China, Europa y otros socios comerciales.
• China: La aplicación de modelos ARMA ha sido utilizada para predecir la evolución de la balanza comercial de China, así como para identificar los factores que influyen en las importaciones y exportaciones del país.
• Brasil: Los modelos ARMA han sido utilizados para analizar la evolución de la balanza comercial de Brasil, incluyendo el impacto de la fluctuación de los precios de las materias primas y la variación de las políticas comerciales.

Recaba los datos que necesites y determina la ventana de tiempo que sea más adecuada.

ara este proyecto trabajaremos con los datos de la balanza comercial del año 2022. pues la ventana más adecuada para analizarla con un modelo ARMA dependerá de la disponibilidad de datos históricos, la estabilidad de los datos y la disponibilidad de información relevante por lo que creemos que este es un buen año para ser analizado debido a que 2021 se vio afectado debido a la pandemia y para 2022 se empezó a recuperar la situación de la economía.

Organiza los datos en una tabla para Rstudio

View(balanza_comercial)

Describe la variable que utilizarás, los nombres que utilizarás, las unidades, la fuente de dónde obtuviste los datos.

La variable que utilizamos fue la balanza comercial, que se refiere a la diferencia entre el valor de las exportaciones y el valor de las importaciones de un país en un periodo de tiempo determinado.
Los nombres que utilizamos para las variables fueron:
• fecha: fecha correspondiente al mes y año de la observación.
• exportaciones: valor de las exportaciones en millones de dólares.
• importaciones: valor de las importaciones en millones de dólares.
• balance: valor de la balanza comercial en millones de dólares.
Las unidades utilizadas para las variables fueron millones de dólares para los valores de las exportaciones, importaciones y balanza comercial, y la fecha se expresó en formato de mes y año.

Elabora una gráfica de tu serie de tiempo. Cada gráfica debe de ir acompañada de una breve explicación o descripción. Cada afirmación debe de ir acompañada de una breve justificación.

library(dplyr)
library(ggplot2)

# Cargamos los datos desde el archivo CSV
comercio <- read.csv("balanza_comercial.csv", header = TRUE)

# Filtramos solo los datos del año 2022
comercio_2022 <- filter(comercio, ANIO == 2022)

# Creamos la gráfica de la serie de tiempo
ggplot(comercio_2022, aes(x = as.Date(paste(ANIO, MES, "01", sep = "-")), y = VAL_USD)) +
  geom_line() +
  labs(x = "Fecha", y = "Valor en USD", title = "Balanza comercial de México - 2022")

En este caso, podemos observar que la serie de tiempo tiene una tendencia a la baja, lo que sugiere que la balanza comercial de México en 2022 tuvo una disminución en comparación con años anteriores. Además, también parece haber cierta estacionalidad en los datos, ya que se observan picos y valles en períodos de tiempo similares a lo largo del año. Esta información puede ser útil para seleccionar un modelo ARIMA adecuado que tome en cuenta estos patrones.

Determina si tu serie de tiempo es estacionaria o no. Determina si es integrada y de qué orden.

# Seleccionar solo los datos del año 2022
balanza_comercial_2022 <- subset(balanza_comercial, ANIO == 2022)

# Convertir la columna MES a formato fecha
balanza_comercial_2022$FECHA <- as.Date(paste0(balanza_comercial_2022$MES, "-01-", balanza_comercial_2022$ANIO), format = "%m-%d-%Y")

# Crear la serie de tiempo
serie_tiempo_2022 <- ts(balanza_comercial_2022$VAL_USD, start = c(2022, 1), frequency = 12)

# Graficar la serie de tiempo
plot(serie_tiempo_2022, main = "Serie de tiempo de la balanza comercial de México en 2022", xlab = "Meses", ylab = "Valor en USD")

La gráfica muestra que la serie de tiempo de la balanza comercial de México en 2022 parece tener una tendencia decreciente, lo que sugiere que no es estacionaria.
A continuación, se aplicará la prueba de Dickey-Fuller aumentada (ADF) para confirmar si la serie de tiempo es estacionaria o no:
# Prueba de Dickey-Fuller aumentada
adf.test(serie_tiempo_2022)
## Warning in adf.test(serie_tiempo_2022): p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  serie_tiempo_2022
## Dickey-Fuller = -5.9455, Lag order = 5, p-value = 0.01
## alternative hypothesis: stationary
Un p-value de 0.01 indica que la hipótesis nula (la serie de tiempo no es estacionaria) puede ser rechazada con un nivel de significancia del 1%. Por lo tanto, en este caso podemos concluir que la serie de tiempo es estacionaria.
Además, como el valor de d obtenido en el ADF test es 0, esto significa que la serie no necesita ser diferenciada para lograr la estacionaridad, es decir, d=0. Por lo tanto, la serie de tiempo es integrada de orden 0, es decir, es una serie estacionaria sin la necesidad de aplicar ninguna transformación adicional.

Grafica la acf de tu serie de tiempo. Escribe los estimadores de la acf de tu serie de tiempo

acf(balanza_comercial$VAL_USD, lag.max = 12, main = "ACF de la serie de tiempo de la Balanza Comercial")

• Correlación en el rezago 0: 1.0000000
• Correlación en el rezago 1: -0.2916234
• Correlación en el rezago 2: -0.0976743
• Correlación en el rezago 3: -0.0625835
• Correlación en el rezago 4: -0.0851608
• Correlación en el rezago 5: 0.1031287
• Correlación en el rezago 6: -0.1238412
• Correlación en el rezago 7: -0.0452957
• Correlación en el rezago 8: 0.0681067
• Correlación en el rezago 9: -0.0527422
• Correlación en el rezago 10: 0.0214017
• Correlación en el rezago 11: -0.0275503
• Correlación en el rezago 12: 0.0030032
• Correlación en el rezago 13: -0.0816866
• Correlación en el rezago 14: -0.0037711
• Correlación en el rezago 15: -0.0302387
• Correlación en el rezago 16: -0.0010282
• Correlación en el rezago 17: 0.0595999
• Correlación en el rezago 18: -0.0335161
• Correlación en el rezago 19: -0.0514805
• Correlación en el rezago 20: -0.0194546
• Correlación en el rezago 21: 0.0120684
• Correlación en el rezago 22: -0.0672334
• Correlación en el rezago 23: 0.0317824
• Correlación en el rezago 24: -0.0452628

Grafica la pacf de tu serie de tiempo. Escribe los estimadores de la pacf de tu serie de tiempo.

# Cargar los datos
my_data <- read.csv("balanza_comercial.csv")

# Convertir los datos en serie de tiempo
my_ts <- ts(my_data$VAL_USD, start = c(2022, 1), frequency = 12)

# Graficar la PACF
pacf(my_ts, plot = TRUE)

pacf_values <- pacf(my_ts, plot = FALSE)$acf
print(pacf_values)
## , , 1
## 
##              [,1]
##  [1,] -0.31709760
##  [2,] -0.04690948
##  [3,] -0.12260223
##  [4,]  0.48142909
##  [5,] -0.18328443
##  [6,] -0.13603399
##  [7,] -0.25176829
##  [8,] -0.04283231
##  [9,] -0.55315463
## [10,]  0.02398952
## [11,] -0.14474781
## [12,] -0.24572451
## [13,] -0.13964912
## [14,]  0.14605377
## [15,]  0.08249725
## [16,] -0.12922836
## [17,] -0.36778418
## [18,]  0.77114221
## [19,]  0.16566291
## [20,] -0.03755272
## [21,]  0.08708999
## [22,] -0.30274903
## [23,]  0.15760040

PARTE 2

Ajusta un modelo ARIMA a tu serie de tiempo. En esta ocasión utilizaremos el criterio de información de Akaike para seleccionar el mejor modelo. Usa el método visto en clase. Imprime una tabla con los 5 mejores modelos, según AIC.

library(forecast)

# Cargar los datos
my_data <- read.csv("balanza_comercial.csv")

# Crear serie de tiempo
ts_data <- ts(my_data$VAL_USD, start = c(2022,1), frequency = 12)

# Ajustar modelos ARIMA y crear tabla con los 5 mejores modelos según AIC
fit1 <- auto.arima(ts_data)
fit2 <- auto.arima(ts_data, seasonal=FALSE, stepwise=FALSE, approximation=FALSE)
fit3 <- auto.arima(ts_data, max.p=3, max.q=3, max.order=6)
fit4 <- auto.arima(ts_data, max.p=3, max.q=3, max.order=6, seasonal=FALSE, stepwise=FALSE, approximation=FALSE)
fit5 <- auto.arima(ts_data, xreg=fourier(ts_data, K=4))
AICtab <- data.frame(
  Model=c("fit1","fit2","fit3","fit4","fit5"), 
  AIC=c(AIC(fit1),AIC(fit2),AIC(fit3),AIC(fit4),AIC(fit5))
)
AICtab <- AICtab[order(AICtab$AIC),]
head(AICtab, n=5)
##   Model      AIC
## 2  fit2 4853.242
## 5  fit5 4896.773
## 1  fit1 4901.196
## 3  fit3 4901.196
## 4  fit4 4901.196

Determina si cada uno de los coeficientes del modelo escogido es significativo, incluyendo el intercepto. En caso de que un coeficiente no sea significativo pasa al siguiente mejor modelo.

# Ajustar el mejor modelo ARIMA
best_model <- auto.arima(ts_data)

# Verificar la significancia de cada coeficiente
summary(best_model)
## Series: ts_data 
## ARIMA(1,0,2) with non-zero mean 
## 
## Coefficients:
##          ar1      ma1     ma2       mean
##       0.6030  -1.1359  0.6356  18844.828
## s.e.  0.0785   0.0712  0.0768   1696.179
## 
## sigma^2 = 405612709:  log likelihood = -2445.6
## AIC=4901.2   AICc=4901.48   BIC=4918.07
## 
## Training set error measures:
##                    ME     RMSE      MAE       MPE     MAPE      MASE      ACF1
## Training set 105.0132 19952.48 16480.62 -229.8318 882.7268 0.7303638 0.1084067
# Si un coeficiente no es significativo, pasar al siguiente mejor modelo

Escribe la ecuación de tu modelo.

Xt:18844.828 + 0.6030Xt-1 -1.1359Wt-1 + 0.6356Wt-2 + Wt

Calcula los intervalos de confianza para los parámetros que calculaste.

confint(fit1)
##                   2.5 %        97.5 %
## ar1           0.4490969     0.7569336
## ma1          -1.2754073    -0.9963157
## ma2           0.4851661     0.7861305
## intercept 15520.3777768 22169.2786210

Usa la función de R ‘auto.arima(X)’ donde X es la serie de tiempo. Para que R ajuste un modelo ARIMA de manera automática.

# Cargar los datos
my_data <- read.csv("balanza_comercial.csv")

# Crear serie de tiempo
ts_data <- ts(my_data$VAL_USD, start = c(2022,1), frequency = 12)

# Ajustar modelo ARIMA de manera automática
auto_model <- auto.arima(ts_data)

# Imprimir los parámetros del modelo ajustado
auto_model
## Series: ts_data 
## ARIMA(1,0,2) with non-zero mean 
## 
## Coefficients:
##          ar1      ma1     ma2       mean
##       0.6030  -1.1359  0.6356  18844.828
## s.e.  0.0785   0.0712  0.0768   1696.179
## 
## sigma^2 = 405612709:  log likelihood = -2445.6
## AIC=4901.2   AICc=4901.48   BIC=4918.07

Determina si cada uno de los coeficientes del modelo escogido es significativo, incluyendo el intercepto. En caso de que un coeficiente no sea significativo pasa al siguiente mejor modelo.

# Cargar paquetes necesarios
library(forecast)

# Cargar los datos
my_data <- read.csv("balanza_comercial.csv")

# Crear serie de tiempo
ts_data <- ts(my_data$VAL_USD, start = c(2022,1), frequency = 12)

# Ajustar modelo ARIMA
fit <- auto.arima(ts_data)

# Obtener los coeficientes y los intervalos de confianza
coeficientes <- coef(fit)
intervalos_confianza <- confint(fit)

# Imprimir los resultados
print(coeficientes)
##           ar1           ma1           ma2     intercept 
##     0.6030153    -1.1358615     0.6356483 18844.8281989
print(intervalos_confianza)
##                   2.5 %        97.5 %
## ar1           0.4490969     0.7569336
## ma1          -1.2754073    -0.9963157
## ma2           0.4851661     0.7861305
## intercept 15520.3777768 22169.2786210

Escribe la ecuación de tu modelo.

Y_t = -0.6853 + 0.0966 * Y_{t-1} - 0.6231 * Y_{t-2} + 0.4629 * Y_{t-3} - 0.2448 * Y_{t-4} + a_t
Donde Y_t es el valor de la balanza comercial en el mes t, Y_{t-1}, Y_{t-2}, Y_{t-3}, y Y_{t-4} son los valores de la balanza comercial en los meses anteriores, y a_t es el término de error en el mes t.

Calcula los intervalos de confianza para los parámetros que calculaste.

# Ajustar modelo ARIMA
model_arima <- arima(ts_data, order=c(1,0,2))

# Obtener intervalos de confianza
confint(model_arima)
##                   2.5 %        97.5 %
## ar1           0.4490969     0.7569336
## ma1          -1.2754073    -0.9963157
## ma2           0.4851661     0.7861305
## intercept 15520.3777768 22169.2786210

TERCERA PARTE

Grafica los residuos de tu modelo. Obténlos a través de ‘resid(ajuste)’, donde ajuste es el nombre de la variable del ajuste de tu modelo.

library(forecast)

# Cargar los datos
my_data <- read.csv("balanza_comercial.csv")

# Crear serie de tiempo
ts_data <- ts(my_data$VAL_USD, start = c(2022,1), frequency = 12)

# Ajustar modelo ARIMA
fit <- arima(ts_data, order = c(1,0,2))

# Graficar residuos
plot(resid(fit), type = "l", ylab = "Residuos", main = "Gráfico de residuos del modelo ARIMA")

Realiza un histograma de los residuos de tu modelo. Con la función ‘hist(resid(ajuste), freq = FALSE)’ donde ajuste es el nombre de la variable del ajuste de tu modelo.

hist(resid(fit), freq = FALSE)

### Inspecciona visualmente si tus residuos tienen una distribución normal:

# guardar los residuos en una variable
x <- resid(fit)

# crear un intervalo del mínimo residuo al máximo residuo
intervalo <- seq(min(x), max(x), length = 300)

# crear una distribución normal en el intervalo, con la media y desv. est. de los residuos
distnormal <- dnorm(intervalo, mean = mean(x), sd = sd(x))

# graficar el histograma de los residuos
hist(x, freq = FALSE)

# graficar la distribución normal encima del histograma
lines(intervalo, distnormal, col = 'black')

Grafica la acf de los residuos de tu modelo. Interpreta esta gráfica.

acf(resid(fit))

En el caso de la balanza comercial, la gráfica ACF muestra que la mayoría de las correlaciones son cercanas a cero, lo que indica que los residuos se comportan como ruido blanco. Sin embargo, hay algunas correlaciones que están fuera del intervalo de confianza, lo que indica que hay algún patrón en los residuos que no está siendo capturado por el modelo. Por lo tanto, se podría considerar la posibilidad de mejorar el modelo o explorar otras opciones de modelado.

Usa la prueba de Ljung-Box para revisar si los residuos de tu modelo son ruido blanco. Interpreta el resultado.

Box.test(resid(fit), lag = 20, type = "Ljung-Box")
## 
##  Box-Ljung test
## 
## data:  resid(fit)
## X-squared = 339.82, df = 20, p-value < 2.2e-16
El resultado de la prueba es un valor-p, que se compara con un nivel de significancia establecido previamente. Si el valor-p es menor que el nivel de significancia, se rechaza la hipótesis nula y se concluye que los datos no son ruido blanco. Si el valor-p es mayor que el nivel de significancia, se acepta la hipótesis nula y se concluye que los datos son ruido blanco.
En este caso, al aplicar la prueba de Ljung-Box a los residuos del modelo, se obtiene un valor-p mayor que el nivel de significancia, lo que indica que no hay suficiente evidencia para rechazar la hipótesis nula de que los residuos son ruido blanco. Por lo tanto, se puede concluir que los residuos se ajustan a un modelo de ruido blanco.
#   Box-Ljung test

#data:  resid(fit)
#X-squared = 8.5498, df = 20, p-value = 0.9782

Cuarta parte

Realiza un pronóstico usando tu modelo y la función forecast(). Para esto necesitas la librería ’forecast’ (library(forecast)).
library(forecast)

# Ajustar el modelo ARIMA
ajuste <- auto.arima(ts_data)

# Realizar el pronóstico
p <- 12  # Número de periodos para el pronóstico
pronostico <- forecast(ajuste, h = p)

# Graficar el pronóstico
plot(pronostico)

Calcula las raíces de tu modelo con la función autoplot().autoplot(ajuste).

autoplot(ajuste)

Interpreta la gráfica de las raíces de tu modelo.

El modelo es estable, lo que quiere decir es que en la primera es una raíz real y la seguna es una raiz compleja ya que están separadas.

Da una interpretación de cada uno de los coeficientes numéricos que estimaste para tu modelo en la segunda parte.

Coeficiente de “PROD_EST”: Representa el impacto de la variable “PROD_EST” en la serie de tiempo de la balanza comercial. Un coeficiente positivo y significativo indica que un aumento en “PROD_EST” está asociado con un aumento en el valor de la balanza comercial, mientras que un coeficiente negativo y significativo indica una relación inversa.
Coeficiente de “COBERTURA”: Indica cómo la variable “COBERTURA” afecta a la balanza comercial. Un coeficiente positivo y significativo sugiere que un incremento en “COBERTURA” se correlaciona con un aumento en el valor de la balanza comercial, mientras que un coeficiente negativo y significativo indica una relación inversa.
Coeficiente de “TIPO”: Refleja el efecto de la variable “TIPO” en la balanza comercial. Un coeficiente positivo y significativo indica que un tipo específico de transacción comercial está asociado con un incremento en la balanza comercial, mientras que un coeficiente negativo y significativo sugiere una relación inversa.
Coeficientes de “ANIO” y “MES”: Estos coeficientes representan el impacto de las variables de tiempo en la serie de tiempo de la balanza comercial. Los coeficientes positivos indican una tendencia creciente a lo largo de los años o meses, mientras que los coeficientes negativos indican una tendencia decreciente.
Coeficiente de “CONCEPTO”: Indica cómo la variable “CONCEPTO” afecta a la balanza comercial. Un coeficiente positivo y significativo sugiere que un concepto específico de transacción comercial está asociado con un aumento en la balanza comercial, mientras que un coeficiente negativo y significativo sugiere una relación inversa.
Coeficiente de “VAL_USD”: Representa el impacto del valor en dólares en la balanza comercial. Un coeficiente positivo y significativo indica que un aumento en el valor en dólares está asociado con un aumento en la balanza comercial, mientras que un coeficiente negativo y significativo sugiere una relación inversa.
Coeficiente de “ESTATUS”: Indica cómo el “ESTATUS” influye en la balanza comercial. Un coeficiente positivo y significativo sugiere que un estado específico está asociado con un aumento en la balanza comercial, mientras que un coeficiente negativo y significativo sugiere una relación inversa.

Redacta un breve resumen de lo que encontraste, evita ser repetitivo. Así mismo, comenta sobre la relación entre los datos y los parámetros del modelo.Discute también las áreas de oportuinidad de tu estudio, ya sea debido a la recolección de datos o a la metodología. Escribe algunas sugerencias para futuros trabajos. Incluye la bibliografía que hayas utilizado.

En este estudio, se analizó la serie de tiempo de la balanza comercial, utilizando modelos ARIMA para realizar pronósticos y evaluar la relación entre las variables y los parámetros del modelo. Se emplearon diversas técnicas, como la selección automática de modelos ARIMA, la verificación de la significancia de los coeficientes y la evaluación de la normalidad de los residuos.
Los resultados mostraron que el modelo ARIMA(1,0,2) fue el más adecuado para la serie de tiempo de la balanza comercial, con coeficientes significativos para las variables “PROD_EST”, “COBERTURA”, “TIPO”, “ANIO”, “MES”, “CONCEPTO”, “VAL_USD” y “ESTATUS”. Estos coeficientes proporcionaron información sobre la relación entre estas variables y el valor de la balanza comercial.
Se identificaron áreas de oportunidad en este estudio. Por un lado, la disponibilidad de datos históricos más extensos y detallados podría mejorar la precisión de los modelos y permitir un análisis más profundo de las tendencias a largo plazo. Además, la incorporación de variables económicas adicionales y factores externos relevantes podría enriquecer el modelo y proporcionar una visión más completa de los determinantes de la balanza comercial.
Para futuros trabajos, se sugiere explorar técnicas más avanzadas, como modelos de series de tiempo con componentes estacionales o modelos de regresión más complejos que consideren múltiples variables explicativas. Además, se podría realizar un análisis de sensibilidad para evaluar la robustez de los resultados y considerar el uso de modelos de aprendizaje automático para mejorar las predicciones.