# =============================================================================
#### EJERCICIO 2
# =============================================================================
install.packages("openxlsx")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.5'
## (as 'lib' is unspecified)
install.packages("ggplot2")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.5'
## (as 'lib' is unspecified)
install.packages("tseries")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.5'
## (as 'lib' is unspecified)
install.packages("urca")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.5'
## (as 'lib' is unspecified)
# Cargar librerías necesarias
library(openxlsx)
library(ggplot2)
library(tseries)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(urca)
# Leer los datos
library(readxl)
X1_SERIES_DE_TIEMPO <- read_excel("1. SERIES DE TIEMPO.xlsx")
datos <- X1_SERIES_DE_TIEMPO
head(datos)
## # A tibble: 6 × 4
## YEAR GDP INF UNEM
## <dbl> <dbl> <dbl> <dbl>
## 1 1980 105636475674. 26.6 9.10
## 2 1981 108041683800. 27.5 8.13
## 3 1982 109066373587. 24.7 11.5
## 4 1983 110783030360. 19.5 11.1
## 5 1984 114495019344. 16.4 13
## 6 1985 118052501182. 24.0 13.9
# Convertir a series de tiempo
year <- datos$YEAR
gdp <- datos$GDP
inf <- datos$INF
unem <- datos$UNEM
# Crear series temporales (anual, empezando en 1980)
gdp_ts <- ts(gdp, start = 1980, frequency = 1)
inf_ts <- ts(inf, start = 1980, frequency = 1)
unem_ts <- ts(unem, start = 1980, frequency = 1)
# a) Gráficos y descripción
# GDP
plot(gdp_ts, main = "PIB (1980-2018)", ylab = "PIB (pesos constantes)", xlab = "Año")

# Inflación
plot(inf_ts, main = "Inflación (1980-2018)", ylab = "Inflación (%)", xlab = "Año")

# Desempleo
plot(unem_ts, main = "Tasa de Desempleo (1980-2018)", ylab = "Desempleo (%)", xlab = "Año")

# b) Prueba ADF para determinar orden de integración
# Transformar GDP a logaritmo (Ly)
ly_ts <- log(gdp_ts)
# Prueba ADF para Ly (PIB en logaritmos)
adf_ly <- adf.test(ly_ts)
adf_ly_table <- data.frame(
Serie = "Ly (log(GDP))",
Estadístico = adf_ly$statistic,
Valor_p = adf_ly$p.value,
Resultado = ifelse(adf_ly$p.value < 0.05, "Estacionaria", "No estacionaria")
)
# Prueba ADF para inflación
adf_inf <- adf.test(inf_ts)
adf_inf_table <- data.frame(
Serie = "Inflación",
Estadístico = adf_inf$statistic,
Valor_p = adf_inf$p.value,
Resultado = ifelse(adf_inf$p.value < 0.05, "Estacionaria", "No estacionaria")
)
# Prueba ADF para desempleo
adf_unem <- adf.test(unem_ts)
adf_unem_table <- data.frame(
Serie = "Desempleo",
Estadístico = adf_unem$statistic,
Valor_p = adf_unem$p.value,
Resultado = ifelse(adf_unem$p.value < 0.05, "Estacionaria", "No estacionaria")
)
# Combinar resultados en una tabla
resultados_adf <- rbind(adf_ly_table, adf_inf_table, adf_unem_table)
print(resultados_adf)
## Serie Estadístico Valor_p Resultado
## Dickey-Fuller Ly (log(GDP)) -2.950170 0.2012845 No estacionaria
## Dickey-Fuller1 Inflación -2.574419 0.3484359 No estacionaria
## Dickey-Fuller2 Desempleo -2.258976 0.4719693 No estacionaria
# Si alguna serie no es estacionaria, se debe diferenciar y repetir la prueba
# Por ejemplo, si Ly no es estacionaria:
d_ly <- diff(ly_ts)
adf_d_ly <- adf.test(d_ly)
adf_d_ly_table <- data.frame(
Serie = "D(Ly)",
Estadístico = adf_d_ly$statistic,
Valor_p = adf_d_ly$p.value,
Resultado = ifelse(adf_d_ly$p.value < 0.05, "Estacionaria", "No estacionaria")
)
# Agregar a la tabla de resultados
resultados_adf <- rbind(resultados_adf, adf_d_ly_table)
print(resultados_adf)
## Serie Estadístico Valor_p Resultado
## Dickey-Fuller Ly (log(GDP)) -2.950170 0.2012845 No estacionaria
## Dickey-Fuller1 Inflación -2.574419 0.3484359 No estacionaria
## Dickey-Fuller2 Desempleo -2.258976 0.4719693 No estacionaria
## Dickey-Fuller3 D(Ly) -3.020348 0.1745807 No estacionaria
# ---------------------------------------------------------------------
# ANÁLISIS DE LOS GRÁFICOS (Debes redactar esto en tu informe):
# ---------------------------------------------------------------------
# 1. PIB (GDP):
# - Tendencia: Creciente a lo largo del tiempo → No estacionaria.
# - Variabilidad: Aumenta con el tiempo → Posible heterocedasticidad.
# - Comportamiento: Muestra ciclos económicos (ej: caídas en crisis).
# 2. Inflación (inf):
# - Tendencia: Volátil, con picos en los 80-90s y disminución después → Posiblemente estacionaria después de diferenciar.
# - Estacionalidad: No clara en datos anuales.
# 3. Desempleo (UNEM):
# - Tendencia: Fluctuante, con picos alrededor del año 2000 → No estacionaria.
# - Ciclos: Relacionados con crisis económicas.
# ---------------------------------------------------------------------
# INTERPRETACIÓN PRUEBA ADF (Basado en la tabla resultados_adf):
# ---------------------------------------------------------------------
# Ejemplo de interpretación (debes adaptar según tus resultados):
# - Ly (log(PIB)):
# - Valor-p > 0.05 → No rechazo H0 (raíz unitaria) → Serie no estacionaria.
# - Conclusión: El PIB en logaritmos es I(1). Se debe diferenciar 1 vez.
# - Inflación:
# - Valor-p < 0.05 → Rechazo H0 → Serie estacionaria → I(0).
# - Desempleo:
# - Valor-p > 0.05 → No estacionaria → I(1) o más.
# =============================================================================
#### EJERCICIO 3
# =============================================================================
# Cargar librerías
library(openxlsx)
library(ggplot2)
library(forecast)
library(tseries)
# Leer datos
X2_Lakehuron <- read_excel("2. Lakehuron.xlsx")
head(X2_Lakehuron)
## # A tibble: 6 × 2
## year lakehuron
## <dbl> <dbl>
## 1 1875 580.
## 2 1876 582.
## 3 1877 581.
## 4 1878 581.
## 5 1879 580.
## 6 1880 580.
datos <- X2_Lakehuron
lake_ts <- ts(datos$lakehuron, start = 1875, frequency = 1)
# a) Gráfico y descripción
plot(lake_ts, main = "Nivel del Lago Hurón (1875-1972)",
ylab = "Nivel (pies)", xlab = "Año")

# La serie parece estacionaria en media y varianza.
# b) Metodología Box-Jenkins
# Identificación: Graficar ACF y PACF
acf(lake_ts, main = "FAC - Lago Hurón")

pacf(lake_ts, main = "FACP - Lago Hurón")

# Los cortes en ACF y PACF sugieren un posible AR(1) o AR(2)
# Probamos modelos AR(1) y AR(2)
modelo_ar1 <- arima(lake_ts, order = c(1,0,0))
modelo_ar2 <- arima(lake_ts, order = c(2,0,0))
# Comparar modelos por AIC
AIC(modelo_ar1, modelo_ar2)
## df AIC
## modelo_ar1 3 219.1959
## modelo_ar2 4 215.2664
# El modelo con menor AIC es preferible.
# Verificación de residuos
checkresiduals(modelo_ar2)

##
## Ljung-Box test
##
## data: Residuals from ARIMA(2,0,0) with non-zero mean
## Q* = 5.9457, df = 8, p-value = 0.6533
##
## Model df: 2. Total lags used: 10
# Los residuos deben ser ruido blanco (no correlacionados, media cero)
# c) Pronóstico para 1973-1975
pronostico <- forecast(modelo_ar2, h = 3)
plot(pronostico, main = "Pronóstico Lago Hurón 1973-1975",
xlab = "Año", ylab = "Nivel (pies)")

# d) Tabla de valores pronosticados
tabla_pronostico <- data.frame(
Año = 1973:1975,
Pronóstico = pronostico$mean,
LI_95 = pronostico$lower[,2],
LS_95 = pronostico$upper[,2]
)
print(tabla_pronostico)
## Año Pronóstico LI_95 LS_95
## 1 1973 579.7896 578.4333 581.1458
## 2 1974 579.5942 577.6339 581.5545
## 3 1975 579.4329 577.1659 581.6999
# ---------------------------------------------------------------------
# ELECCIÓN DEL MODELO (Basado en ACF/PACF y criterios de información):
# ---------------------------------------------------------------------
# Ejemplo:
# - ACF decae lentamente → indica no estacionariedad (o estacionalidad).
# - PACF tiene pico en lag 1 y 2 → sugiere AR(2).
# - Modelo elegido: ARIMA(2,0,0) o ARIMA(1,0,0) según AIC.
# ---------------------------------------------------------------------
# VALIDACIÓN DE RESIDUOS:
# ---------------------------------------------------------------------
# - Residuos deben ser ruido blanco (prueba Ljung-Box p-value > 0.05).
# - Si no son ruido blanco → el modelo no captura toda la información.
# ---------------------------------------------------------------------
# PRONÓSTICO:
# ---------------------------------------------------------------------
# - Interpretar:
# "El nivel del lago se espera que sea X pies en 1973, con un intervalo de confianza del 95% entre [LÍMITE INFERIOR] y [LÍMITE SUPERIOR]".
# =============================================================================
#### EJERCICIO 4
# =============================================================================
# Cargar librerías
install.packages("forecast")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.5'
## (as 'lib' is unspecified)
library(openxlsx)
library(ggplot2)
library(forecast)
library(tseries)
# Leer datos
X3_growthpn <- read_excel("3. growthpn.xls")
datos <- X3_growthpn
y_ts <- ts(datos$y, start = 1720, frequency = 1)
# e) Gráfico y descripción
plot(y_ts, main = "Crecimiento de la producción de materia prima X (1720-2018)",
ylab = "Crecimiento (%)", xlab = "Año")

# La serie parece oscilar alrededor de una media constante, pero hay periodos de alta volatilidad.
# f) Prueba de estacionariedad (ADF)
adf_test <- adf.test(y_ts)
## Warning in adf.test(y_ts): p-value smaller than printed p-value
adf_table <- data.frame(
Estadístico = adf_test$statistic,
Valor_p = adf_test$p.value,
Resultado = ifelse(adf_test$p.value < 0.05, "Estacionaria", "No estacionaria")
)
print(adf_table)
## Estadístico Valor_p Resultado
## Dickey-Fuller -4.779711 0.01 Estacionaria
# Si no es estacionaria, diferenciar
if(adf_test$p.value >= 0.05) {
d_y_ts <- diff(y_ts)
adf_test_d <- adf.test(d_y_ts)
adf_table_d <- data.frame(
Serie = "Diferencia primera",
Estadístico = adf_test_d$statistic,
Valor_p = adf_test_d$p.value,
Resultado = ifelse(adf_test_d$p.value < 0.05, "Estacionaria", "No estacionaria")
)
print(adf_table_d)
} else {
d_y_ts <- y_ts # Usar la serie original si ya es estacionaria
}
# g) Metodología Box-Jenkins
# Identificación: ACF y PACF de la serie estacionaria
acf(d_y_ts, main = "FAC - Serie diferenciada")

pacf(d_y_ts, main = "FACP - Serie diferenciada")

# Ajustar modelos candidatos (ej: ARIMA(1,1,0), ARIMA(0,1,1), ARIMA(1,1,1))
modelo_arima1 <- arima(y_ts, order = c(1,1,0))
modelo_arima2 <- arima(y_ts, order = c(0,1,1))
modelo_arima3 <- arima(y_ts, order = c(1,1,1))
# Comparar por AIC
AIC(modelo_arima1, modelo_arima2, modelo_arima3)
## df AIC
## modelo_arima1 2 953.1826
## modelo_arima2 2 893.4786
## modelo_arima3 3 891.3725
# Seleccionar el mejor modelo (menor AIC)
mejor_modelo <- modelo_arima3 # Por ejemplo, si ARIMA(1,1,1) tiene el menor AIC
# Verificación de residuos
checkresiduals(mejor_modelo)

##
## Ljung-Box test
##
## data: Residuals from ARIMA(1,1,1)
## Q* = 24.979, df = 8, p-value = 0.001567
##
## Model df: 2. Total lags used: 10
# Deben ser ruido blanco (prueba Ljung-Box no significativa)
# Ecuación del modelo seleccionado
summary(mejor_modelo)
##
## Call:
## arima(x = y_ts, order = c(1, 1, 1))
##
## Coefficients:
## ar1 ma1
## -0.1575 0.8073
## s.e. 0.0763 0.0451
##
## sigma^2 estimated as 1.139: log likelihood = -442.69, aic = 891.37
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 0.004853448 1.065618 0.8683175 6.149398 49.94742 0.8586963
## ACF1
## Training set -0.02149932
# h) Pronóstico para 2019 y 2020
pronostico <- forecast(mejor_modelo, h = 2)
plot(pronostico, main = "Pronóstico de crecimiento para 2019-2020",
xlab = "Año", ylab = "Crecimiento (%)")

# Tabla de pronósticos
tabla_pronostico <- data.frame(
Año = 2019:2020,
Pronóstico = pronostico$mean,
LI_95 = pronostico$lower[,2],
LS_95 = pronostico$upper[,2]
)
print(tabla_pronostico)
## Año Pronóstico LI_95 LS_95
## 1 2019 6.166802 4.074727 8.258877
## 2 2020 6.073719 2.037720 10.109719
# ---------------------------------------------------------------------
# PRUEBA ADF:
# ---------------------------------------------------------------------
# - Si valor-p < 0.05 → serie estacionaria → no necesita diferenciación.
# - Si valor-p > 0.05 → serie no estacionaria → diferenciar.
# ---------------------------------------------------------------------
# ELECCIÓN DEL MODELO:
# ---------------------------------------------------------------------
# - Usar ACF/PACF para identificar órdenes p, d, q.
# - Comparar modelos con AIC/BIC (menor es mejor).
# ---------------------------------------------------------------------
# PRONÓSTICO:
# ---------------------------------------------------------------------
# - Ej: "Se espera un crecimiento del X% en 2019, con un intervalo de confianza del 95% entre [LÍMITE INFERIOR] y [LÍMITE SUPERIOR]".
# =============================================================================
#### EJERCICIO 5 - RESUMEN DE ARTÍCULOS EMPÍRICOS
# =============================================================================
# -----------------------------------------------------------------------------
# 1. "Short-run electricity demand forecast in Maharashtra" (Ghosh & Das, 2002)
# -----------------------------------------------------------------------------
# a. Problema de investigación:
# El estudio aborda la crítica necesidad de predecir la demanda eléctrica máxima mensual
# en Maharashtra, India, donde la electricidad no puede almacenarse y presenta fluctuaciones
# estacionales y diarias significativas. La planificación de capacidad instalada y la
# operación eficiente del sistema eléctrico dependen fundamentalmente de pronósticos precisos,
# especialmente en un contexto de crecimiento económico e industrialización acelerada.
# b. Metodología utilizada:
# Se implementó la metodología Box-Jenkins con un modelo SARIMA multiplicativo utilizando
# datos mensuales desde abril de 1980 hasta junio de 1999. El proceso incluyó: identificación
# de no estacionariedad mediante la prueba ADF y análisis gráfico de autocorrelación;
# aplicación de diferencias regular (d=1) y estacional (D=1 con s=12) para lograr estacionariedad;
# evaluación exhaustiva de 21 combinaciones de modelos mediante criterios de información (AIC y SBC);
# y validación rigurosa mediante análisis de residuos y cálculo del error cuadrático medio (RMSE).
# c. Modelo final estimado:
# El modelo seleccionado fue ARIMA(0,1,3)(0,1,1)₁₂, que demostró el mejor ajuste según los
# criterios de información y superó las validaciones de diagnóstico, mostrando residuos que
# se comportan como ruido blanco y un RMSE consistentemente bajo.
# d. Resultados principales:
# La serie de demanda eléctrica exhibió un patrón estacional marcado y una tendencia creciente
# estable. Las proyecciones para los 18 meses siguientes indicaron una continuación de esta
# tendencia con fluctuaciones estacionales predecibles, sin cambios estructurales abruptos.
# Los intervalos de confianza del 95% mostraron una precisión aceptable para la planificación
# operativa del sistema eléctrico.
# e. Conclusiones:
# Los modelos SARIMA constituyen herramientas confiables y robustas para pronósticos de
# demanda eléctrica de corto plazo, permitiendo una planificación eficiente de inversiones
# y operaciones en el sector energético. La metodología demostró ser particularmente útil
# para capturar patrones estacionales complejos en economías en desarrollo con crecimiento
# industrial acelerado.
# f. Limitaciones identificadas:
# El modelo no incorpora variables exógenas críticas como precios de la energía, políticas
# públicas, cambios tecnológicos o eventos económicos abruptos. Su utilidad se limita a
# horizontes de corto y mediano plazo, y su precisión disminuye significativamente ante
# cambios estructurales en el sistema eléctrico o la economía.
# -----------------------------------------------------------------------------
# 2. "Application of seasonal time series model in the precipitation forecast"
# (Wang et al., 2013)
# -----------------------------------------------------------------------------
# a. Problema de investigación:
# La investigación aborda el desafío de predecir precipitaciones mensuales en Shouguang, China,
# caracterizadas por alta variabilidad, aleatoriedad y marcada estacionalidad. La motivación
# principal es agrícola: optimizar el aprovechamiento del agua de lluvia y reducir la extracción
# de aguas subterráneas mediante una planificación de riego basada en pronósticos confiables.
# b. Metodología utilizada:
# Se aplicó un modelo SARIMA siguiendo la metodología Box-Jenkins utilizando datos mensuales
# desde enero de 1996 hasta diciembre de 2008 para entrenamiento y 2009 para validación.
# El procedimiento incluyó: transformación de la serie mediante diferenciación estacional
# (s=12) para eliminar no estacionariedad; identificación de órdenes mediante análisis
# exhaustivo de ACF y PACF; selección de modelo mediante minimización de AIC y SC; estimación
# de parámetros por mínimos cuadrados no lineales; y validación mediante pruebas de ruido
# blanco en residuos.
# c. Modelo final estimado:
# El modelo óptimo fue SARIMA(2,0,2)(1,1,1)₁₂, que mostró superioridad frente a otras
# especificaciones en términos de criterios de información y capacidad predictiva, con
# coeficientes estadísticamente significativos y residuos que cumplen con los supuestos
# de no autocorrelación.
# d. Resultados principales:
# Las predicciones para 2009 mostraron errores relativos menores al 20% en 8 de los 12 meses,
# demostrando buena precisión predictiva. Los mayores errores ocurrieron en meses con lluvias
# mínimas (enero y diciembre) y durante sequías atípicas (mayo y septiembre), donde el modelo
# subestimó la severidad de las condiciones extremas.
# e. Conclusiones:
# Los modelos SARIMA son adecuados para predecir precipitaciones en regiones con estacionalidad
# marcada, proporcionando información valiosa para la gestión sostenible de recursos hídricos
# en agricultura. La metodología ofrece un balance adecuado entre complejidad y capacidad
# predictiva para apoyar decisiones de planificación de riego.
# f. Limitaciones identificadas:
# La precisión del modelo disminuye significativamente durante eventos climáticos extremos
# no observados previamente en la serie histórica. Requiere actualización constante con
# datos recientes para mantener su validez predictiva y no captura adecuadamente cambios
# climáticos de largo plazo.
# -----------------------------------------------------------------------------
# 3. "Application of the ARIMA model on the COVID-2019 epidemic dataset"
# (Benvenuto et al., 2020)
# -----------------------------------------------------------------------------
# a. Problema de investigación:
# El estudio aborda la urgente necesidad de predecir la evolución temprana del COVID-19
# utilizando datos limitados y variables. En el contexto de una emergencia sanitaria global,
# se buscó proporcionar pronósticos rápidos y objetivos para apoyar decisiones de control
# epidemiológico y asignación de recursos médicos.
# b. Metodología utilizada:
# Se aplicaron modelos ARIMA a series diarias de prevalencia e incidencia de casos entre
# el 20 de enero y el 10 de febrero de 2020. La metodología incluyó: construcción de series
# temporales a partir de datos de Johns Hopkins University; pruebas de estacionariedad ADF;
# transformaciones logarítmicas y de diferencias; identificación de modelos mediante ACF y PACF;
# estimación de parámetros con el software Gretl; y validación mediante intervalos de confianza
# y análisis de residuos.
# c. Modelo final estimado:
# Para prevalencia: ARIMA(1,0,4); para incidencia: ARIMA(1,0,3). Ambos modelos mostraron
# ajuste adecuado y capacidad predictiva dentro de los límites de incertidumbre impuestos
# por la disponibilidad limitada de datos.
# d. Resultados principales:
# Los modelos proyectaron una tendencia hacia la estabilización de casos (plateau epidemiológico)
# con intervalos de confianza del 95% que, aunque amplios, proporcionaron orientación útil
# para la toma de decisiones iniciales. La incidencia mostró una ligera disminución en su
# tasa de crecimiento, sugiriendo posibles efectos tempranos de las medidas de control.
# e. Conclusiones:
# Los modelos ARIMA demostraron ser herramientas valiosas para pronósticos epidemiológicos
# en contextos de emergencia y datos limitados. La metodología econométrica puede aplicarse
# efectivamente más allá del ámbito económico, proporcionando insights cuantitativos rápidos
# durante crisis sanitarias.
# f. Limitaciones identificadas:
# La extrema sensibilidad a la calidad y consistencia de los datos (definición de "caso",
# retrasos en reportes); utilidad limitada a horizontes de muy corto plazo; incapacidad
# para capturar dinámicas no lineales y factores epidemiológicos complejos; y vulnerabilidad
# a cambios abruptos por mutaciones virales o intervenciones sanitarias.
# =============================================================================
# CONCLUSIÓN GENERAL
# =============================================================================
# Los tres artículos demuestran consistentemente la utilidad de los modelos ARIMA/SARIMA
# en diversos campos aplicados, destacando su flexibilidad para modelar patrones temporales
# y estacionales en contextos de incertidumbre. Sin embargo, comparten limitaciones fundamentales:
# sensibilidad a cambios estructurales no modelados, dependencia crítica de la calidad de los datos,
# y utilidad principalmente en horizontes de corto plazo. Estos modelos deben verse como
# herramientas complementarias dentro de un arsenal analítico más amplio, particularmente
# en contextos volátiles donde factores exógenos pueden dominar la dinámica del sistema.