# Cargar las bibliotecas necesarias
library(tseries)## Warning: package 'tseries' was built under R version 4.3.3
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(ggplot2)## Warning: package 'ggplot2' was built under R version 4.3.3
library(forecast)## Warning: package 'forecast' was built under R version 4.3.3
library(reshape2)# capturamos datos
data <- data.frame(
Año = c(1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998),
Ene = c(730, 821, 892, 1000, 945, 998, 1033, 1178, 1239, 1346, 1392, 1458),
Feb = c(717, 871, 942, 1052, 991, 1122, 984, 1205, 1265, 1327, 1388, 1485),
Mar = c(769, 938, 1095, 1240, 1151, 1234, 1217, 1502, 1621, 1672, 1683, 1848),
Abr = c(858, 1044, 1099, 1182, 1190, 1278, 1372, 1566, 1629, 1727, 1793, 1919),
May = c(921, 1097, 1186, 1298, 1287, 1300, 1395, 1566, 1668, 1801, 1860, 2043),
Jun = c(1018, 1155, 1215, 1321, 1332, 1335, 1465, 1694, 1774, 1925, 2052, 2231),
Jul = c(980, 1069, 1125, 1210, 1299, 1336, 1467, 1600, 1730, 1865, 1924, 2081),
Ago = c(1027, 1150, 1283, 1340, 1430, 1370, 1543, 1755, 1873, 2029, 2048, 2143),
Sep = c(906, 981, 1143, 1178, 1236, 1198, 1325, 1485, 1593, 1629, 1671, 1779),
Oct = c(847, 915, 1030, 1117, 1091, 1112, 1210, 1339, 1419, 1488, 1596, 1678),
Nov = c(981, 1087, 1233, 1192, 1205, 1197, 1390, 1488, 1571, 1651, 1738, 1764),
Dic = c(1502, 1698, 1934, 1857, 1908, 2137, 2499, 2640, 2771, 2749, 2990, 2979)
)
# Mostrar los datos
print(data)## Año Ene Feb Mar Abr May Jun Jul Ago Sep Oct Nov Dic
## 1 1987 730 717 769 858 921 1018 980 1027 906 847 981 1502
## 2 1988 821 871 938 1044 1097 1155 1069 1150 981 915 1087 1698
## 3 1989 892 942 1095 1099 1186 1215 1125 1283 1143 1030 1233 1934
## 4 1990 1000 1052 1240 1182 1298 1321 1210 1340 1178 1117 1192 1857
## 5 1991 945 991 1151 1190 1287 1332 1299 1430 1236 1091 1205 1908
## 6 1992 998 1122 1234 1278 1300 1335 1336 1370 1198 1112 1197 2137
## 7 1993 1033 984 1217 1372 1395 1465 1467 1543 1325 1210 1390 2499
## 8 1994 1178 1205 1502 1566 1566 1694 1600 1755 1485 1339 1488 2640
## 9 1995 1239 1265 1621 1629 1668 1774 1730 1873 1593 1419 1571 2771
## 10 1996 1346 1327 1672 1727 1801 1925 1865 2029 1629 1488 1651 2749
## 11 1997 1392 1388 1683 1793 1860 2052 1924 2048 1671 1596 1738 2990
## 12 1998 1458 1485 1848 1919 2043 2231 2081 2143 1779 1678 1764 2979
# Convertir los datos a formato largo para facilitar la manipulación
data_long <- melt(data, id.vars = "Año", variable.name = "Mes", value.name = "Valor")
# Ordenar los datos por año y mes
data_long <- data_long[order(data_long$Año, data_long$Mes), ]
# Crear una serie temporal combinando todos los valores
ts_data <- ts(data_long$Valor, start = c(1987, 1), frequency = 12)
ts_data## Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 1987 730 717 769 858 921 1018 980 1027 906 847 981 1502
## 1988 821 871 938 1044 1097 1155 1069 1150 981 915 1087 1698
## 1989 892 942 1095 1099 1186 1215 1125 1283 1143 1030 1233 1934
## 1990 1000 1052 1240 1182 1298 1321 1210 1340 1178 1117 1192 1857
## 1991 945 991 1151 1190 1287 1332 1299 1430 1236 1091 1205 1908
## 1992 998 1122 1234 1278 1300 1335 1336 1370 1198 1112 1197 2137
## 1993 1033 984 1217 1372 1395 1465 1467 1543 1325 1210 1390 2499
## 1994 1178 1205 1502 1566 1566 1694 1600 1755 1485 1339 1488 2640
## 1995 1239 1265 1621 1629 1668 1774 1730 1873 1593 1419 1571 2771
## 1996 1346 1327 1672 1727 1801 1925 1865 2029 1629 1488 1651 2749
## 1997 1392 1388 1683 1793 1860 2052 1924 2048 1671 1596 1738 2990
## 1998 1458 1485 1848 1919 2043 2231 2081 2143 1779 1678 1764 2979
# Graficar la serie temporal
plot(ts_data, type = "o", col = "blue", ylab = "Valor", xlab = "Tiempo",
main = "Serie Temporal de 1987 a 1998")verificamos la estacionalidad
# Prueba de Dickey-Fuller Aumentada
adf.test(ts_data)## Warning in adf.test(ts_data): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: ts_data
## Dickey-Fuller = -5.2449, Lag order = 5, p-value = 0.01
## alternative hypothesis: stationary
# Descomposición de la serie temporal
decomp <- decompose(ts_data)
plot(decomp)Calculamos la autocorrelación muestral y graficamos
acf_result <- acf(ts_data, lag.max = 24, main = "Autocorrelación Muestral")
par(mfrow = c(2, 1))
plot(acf_result, main = "Autocorrelación Muestral")Calculamos la autocorrelación muestral parcial y la graficamos
pacf_result <- pacf(ts_data, lag.max = 24, main = "Autocorrelación Parcial Muestral")
plot(pacf_result, main = "Autocorrelación Parcial Muestral")Ajustamos el modelo
# Ajustar un nuevo modelo SARIMA
modelo_sarima <- arima(ts_data, order = c(0, 1, 0), seasonal = list(order = c(0, 1, 0), period = 12))
# Resumen del modelo
summary(modelo_sarima)##
## Call:
## arima(x = ts_data, order = c(0, 1, 0), seasonal = list(order = c(0, 1, 0), period = 12))
##
##
## sigma^2 estimated as 4717: log likelihood = -739.94, aic = 1481.88
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set -0.7142206 65.5064 47.03857 -0.3129797 3.370855 0.1804952
## ACF1
## Training set -0.3192103
El log-likelihood y el AIC. Un log-likelihood más alto y un AIC más bajo indican un mejor ajuste del modelo
Obtenemos los residuos del modelo ajustado
residuos <- residuals(modelo_sarima)
residuos## Jan Feb Mar Apr May
## 1987 4.214656e-01 1.784153e-01 1.607481e-01 1.983050e-01 2.151780e-01
## 1988 -3.200904e+00 6.300000e+01 1.500000e+01 1.700000e+01 -1.000000e+01
## 1989 -1.250000e+02 1.545004e-10 8.600000e+01 -1.020000e+02 3.400000e+01
## 1990 -1.280000e+02 2.000000e+00 3.500000e+01 -6.200000e+01 2.900000e+01
## 1991 2.200000e+01 -6.000000e+00 -2.800000e+01 9.700000e+01 -1.900000e+01
## 1992 2.000000e+00 7.800000e+01 -4.800000e+01 5.000000e+00 -7.500000e+01
## 1993 -1.940000e+02 -1.730000e+02 1.210000e+02 1.110000e+02 1.000000e+00
## 1994 -2.170000e+02 7.600000e+01 6.400000e+01 -9.100000e+01 -2.300000e+01
## 1995 -8.000000e+01 -1.000000e+00 5.900000e+01 -5.600000e+01 3.900000e+01
## 1996 -2.400000e+01 -4.500000e+01 -1.100000e+01 4.700000e+01 3.500000e+01
## 1997 6.800000e+01 1.500000e+01 -5.000000e+01 5.500000e+01 -7.000000e+00
## 1998 -1.750000e+02 3.100000e+01 6.800000e+01 -3.900000e+01 5.700000e+01
## Jun Jul Aug Sep Oct
## 1987 2.682656e-01 1.943524e-01 2.141045e-01 7.578197e-02 1.206340e-02
## 1988 -3.900000e+01 -4.800000e+01 3.400000e+01 -4.800000e+01 -7.000000e+00
## 1989 -2.900000e+01 -4.000000e+00 7.700000e+01 2.900000e+01 -4.700000e+01
## 1990 -6.000000e+00 -2.100000e+01 -2.800000e+01 -2.200000e+01 5.200000e+01
## 1991 2.200000e+01 7.800000e+01 1.000000e+00 -3.200000e+01 -8.400000e+01
## 1992 -1.000000e+01 3.400000e+01 -9.700000e+01 2.200000e+01 5.900000e+01
## 1993 3.500000e+01 1.000000e+00 4.200000e+01 -4.600000e+01 -2.900000e+01
## 1994 5.800000e+01 -9.600000e+01 7.900000e+01 -5.200000e+01 -3.100000e+01
## 1995 -2.200000e+01 5.000000e+01 -1.200000e+01 -1.000000e+01 -2.800000e+01
## 1996 1.800000e+01 -1.600000e+01 2.100000e+01 -1.200000e+02 3.300000e+01
## 1997 6.800000e+01 -6.800000e+01 -4.000000e+01 2.300000e+01 6.600000e+01
## 1998 -4.000000e+00 -2.200000e+01 -6.200000e+01 1.300000e+01 -2.600000e+01
## Nov Dec
## 1987 1.390055e-01 2.754464e-01
## 1988 3.800000e+01 9.000000e+01
## 1989 3.100000e+01 9.000000e+01
## 1990 -1.280000e+02 -3.600000e+01
## 1991 3.900000e+01 3.800000e+01
## 1992 -2.900000e+01 2.370000e+02
## 1993 9.500000e+01 1.690000e+02
## 1994 -3.100000e+01 4.300000e+01
## 1995 3.000000e+00 4.800000e+01
## 1996 1.100000e+01 -1.020000e+02
## 1997 -2.100000e+01 1.540000e+02
## 1998 -5.600000e+01 -3.700000e+01
Prueba de hipótesis de los parámetros del modelo
coef_test <- coef(modelo_sarima)
summary(coef_test)## Min. 1st Qu. Median Mean 3rd Qu. Max.
##
Prueba de Ljung-Box para los residuos
ljung_box_test <- Box.test(residuos, lag = 20, type = "Ljung-Box")
ljung_box_test##
## Box-Ljung test
##
## data: residuos
## X-squared = 46.645, df = 20, p-value = 0.0006569
El resultado del test de Box-Ljung aplicado a los residuos del modelo SARIMA indica que los residuos no muestran una autocorrelación significativa. Esto es un buen indicador de que el modelo está ajustando bien los datos y que los residuos se comportan como ruido blanco.
Gráficamos de los residuos
plot(residuos, type = "l", ylab = "Residuos", xlab = "Tiempo", main = "Gráfico de Residuos")# Diagnóstico de los residuos
tsdiag(modelo_sarima)# ACF y PACF de los residuos
acf(residuals(modelo_sarima))pacf(residuals(modelo_sarima))# Histograma de los residuos
hist(residuals(modelo_sarima), main="Histograma de los residuos", xlab="Residuos", ylab="Frecuencia")Generamos los pronósticos para los próximos 12 meses
library(forecast)
forecast_sarima <- forecast(modelo_sarima, h = 12, level = c(95))
# Mostramos los pronósticos
print(forecast_sarima)## Point Forecast Lo 95 Hi 95
## Jan 1999 1447 1312.391 1581.609
## Feb 1999 1474 1283.634 1664.366
## Mar 1999 1837 1603.851 2070.149
## Apr 1999 1908 1638.782 2177.218
## May 1999 2032 1731.005 2332.995
## Jun 1999 2220 1890.277 2549.723
## Jul 1999 2070 1713.858 2426.142
## Aug 1999 2132 1751.269 2512.731
## Sep 1999 1768 1364.173 2171.827
## Oct 1999 1667 1241.329 2092.671
## Nov 1999 1753 1306.553 2199.447
## Dec 1999 2968 2501.701 3434.299
Graficamos los pronósticos
plot(forecast_sarima, main="Pronósticos SARIMA con Intervalos de Predicción al 95%",
xlab="Tiempo", ylab="Valores", col="blue")Resultado final
El modelo SARIMA(0,1,0)(0,1,0)[12] ajustado a la serie temporal ha pasado las pruebas de diagnóstico (ADF y Box-Ljung) indicando que los residuos son estacionarios y no muestran autocorrelación significativa. Los pronósticos generados para los próximos 12 meses incluyen intervalos de predicción al 95%, proporcionando una estimación confiable de los valores futuros de la serie temporal.