Introducción

El Índice Mensual de Actividad Económica (IMAE), conocido también como IVAE, es el indicador que utiliza el Banco Central de Reserva de El Salvador para aproximar mensualmente el comportamiento del Producto Interno Bruto. La serie utilizada en este trabajo corresponde a los datos no ajustados estacionalmente ni por calendario, publicados por la Secretaría Ejecutiva del Consejo Monetario Centroamericano (SECMCA), para el período enero de 2018 a marzo de 2026 (99 observaciones mensuales).

El objetivo de este informe es aplicar el método clásico de descomposición mediante medias móviles para separar la serie en sus cuatro componentes teóricos:

Se aplican los dos modelos clásicos:

\[\text{Modelo Aditivo:} \quad Y_t = T_t + S_t + I_t\] \[\text{Modelo Multiplicativo:} \quad Y_t = T_t \times S_t \times I_t\]

Datos

imae <- c(
105.1,102.5,108.4,108,112.5,113.6,108.8,111.9,107.5,105.9,112.2,120,
107.8,106.1,112.6,109.7,114.7,114.7,111.1,113.2,111.8,108.8,116.8,122.7,
109.1,109.6,103.9,87.4,89.8,96.2,97.9,103.8,107.6,105.5,111.3,120.5,
107.2,107.6,113.4,110.7,115.8,117.6,112.2,115.2,114.7,111.8,118.7,125.8,
111.3,111.7,118.9,113.2,122.2,120,116.2,120.8,117.4,116,121.9,129.8,
115.2,113.5,122.5,116.3,127,126.4,120.4,123.2,118,117,127.8,133.5,
121.5,119.6,119.8,122.5,129.6,123,123.5,124.6,118.2,123.9,128.6,137.3,
123.2,120.4,126.9,124.6,133.7,128.9,127.9,128.2,126,127.1,134.1,144.4,
128.5,125.3,133
)

# Serie de tiempo mensual, inicia en enero 2018
y <- ts(imae, start = c(2018, 1), frequency = 12)

fechas <- seq(as.Date("2018-01-01"), by = "month", length.out = length(imae))

cat("Número de observaciones:", length(y), "\n")
## Número de observaciones: 99
cat("Periodo:", format(min(fechas), "%b-%Y"), "a", format(max(fechas), "%b-%Y"), "\n")
## Periodo: Jan-2018 a Mar-2026

Serie original

plot(y, main = "IMAE El Salvador (Niveles del índice, sin ajuste estacional)",
     ylab = "Índice", xlab = "Año", col = "steelblue4", lwd = 2)
grid()

Se observa con claridad la fuerte caída del índice durante el segundo trimestre de 2020 (pandemia de COVID-19) y una recuperación sostenida posterior, además de un patrón estacional recurrente con repuntes hacia fin de año.

Metodología: cálculo de la tendencia-ciclo

Dado que la serie es mensual (periodo estacional = 12, un número par), la media móvil simple de orden 12 no queda centrada en un mes real, sino entre dos meses. Para corregir esto se aplica el método clásico de la media móvil centrada 2x12, que promedia dos medias móviles consecutivas de orden 12. Esto equivale a usar los siguientes pesos sobre 13 observaciones consecutivas:

\[T_t = \frac{0.5\,y_{t-6} + y_{t-5} + \dots + y_{t+5} + 0.5\,y_{t+6}}{12}\]

w <- c(0.5, rep(1, 11), 0.5) / 12
T_t <- stats::filter(y, filter = w, method = "convo", sides = 2)

plot(y, col = "grey60", lwd = 1, main = "Serie original y Tendencia-Ciclo (MA 2x12)",
     ylab = "Índice", xlab = "Año")
lines(T_t, col = "firebrick", lwd = 2.5)
legend("topleft", legend = c("IMAE observado", "Tendencia-Ciclo"),
       col = c("grey60", "firebrick"), lwd = c(1, 2.5), bty = "n")
grid()

Por la naturaleza de la media móvil centrada, se pierden 6 observaciones al inicio y 6 al final de la serie (no hay suficientes datos vecinos para centrar el promedio).

Modelo aditivo

Componente estacional

En el modelo aditivo se obtiene primero la serie “destendenciada” restando la tendencia: \(Y_t - T_t = S_t + I_t\). Luego se promedia esta diferencia por cada mes del año (enero con enero, febrero con febrero, etc.) para obtener un índice estacional bruto, y finalmente se ajusta para que la suma de los 12 índices sea igual a cero (condición del modelo aditivo).

detrend_add <- y - T_t
S_raw_add <- tapply(detrend_add, cycle(y), mean, na.rm = TRUE)
S_add <- S_raw_add - mean(S_raw_add)

S_add_tabla <- data.frame(Mes = month.abb, `Índice estacional` = round(S_add, 3))
knitr::kable(S_add_tabla, row.names = FALSE,
             caption = "Índices estacionales - Modelo aditivo")
Índices estacionales - Modelo aditivo
Mes Índice.estacional
Jan -2.631
Feb -3.814
Mar 0.194
Apr -4.843
May 1.815
Jun 0.682
Jul -1.958
Aug 0.664
Sep -2.045
Oct -2.899
Nov 3.791
Dec 11.045
cat("Comprobación: la suma de los índices estacionales es", round(sum(S_add), 6),
    "(debe ser ≈ 0)\n")
## Comprobación: la suma de los índices estacionales es 0 (debe ser ≈ 0)

Componente irregular

S_add_ts <- ts(rep(S_add, length.out = length(y)), start = start(y), frequency = 12)
I_add <- y - T_t - S_add_ts

Tabla resumen del modelo aditivo

tabla_add <- data.frame(
  Fecha       = format(fechas, "%b-%Y"),
  Observado   = round(as.numeric(y), 1),
  Tendencia   = round(as.numeric(T_t), 2),
  Estacional  = round(as.numeric(S_add_ts), 2),
  Irregular   = round(as.numeric(I_add), 2)
)
knitr::kable(tabla_add, row.names = FALSE,
             caption = "Descomposición aditiva mes a mes (primeras y últimas filas)")
Descomposición aditiva mes a mes (primeras y últimas filas)
Fecha Observado Tendencia Estacional Irregular
Jan-2018 105.1 NA -2.63 NA
Feb-2018 102.5 NA -3.81 NA
Mar-2018 108.4 NA 0.19 NA
Apr-2018 108.0 NA -4.84 NA
May-2018 112.5 NA 1.81 NA
Jun-2018 113.6 NA 0.68 NA
Jul-2018 108.8 109.81 -1.96 0.95
Aug-2018 111.9 110.07 0.66 1.16
Sep-2018 107.5 110.40 -2.05 -0.85
Oct-2018 105.9 110.65 -2.90 -1.85
Nov-2018 112.2 110.81 3.79 -2.40
Dec-2018 120.0 110.95 11.04 -1.99
Jan-2019 107.8 111.09 -2.63 -0.66
Feb-2019 106.1 111.24 -3.81 -1.32
Mar-2019 112.6 111.47 0.19 0.94
Apr-2019 109.7 111.77 -4.84 2.77
May-2019 114.7 112.08 1.81 0.80
Jun-2019 114.7 112.39 0.68 1.63
Jul-2019 111.1 112.55 -1.96 0.50
Aug-2019 113.2 112.75 0.66 -0.22
Sep-2019 111.8 112.54 -2.05 1.31
Oct-2019 108.8 111.25 -2.90 0.45
Nov-2019 116.8 109.28 3.79 3.73
Dec-2019 122.7 107.47 11.04 4.18
Jan-2020 109.1 106.15 -2.63 5.58
Feb-2020 109.6 105.21 -3.81 8.21
Mar-2020 103.9 104.64 0.19 -0.94
Apr-2020 87.4 104.33 -4.84 -12.09
May-2020 89.8 103.96 1.81 -15.98
Jun-2020 96.2 103.64 0.68 -8.12
Jul-2020 97.9 103.47 -1.96 -3.61
Aug-2020 103.8 103.31 0.66 -0.17
Sep-2020 107.6 103.62 -2.05 6.02
Oct-2020 105.5 104.99 -2.90 3.41
Nov-2020 111.3 107.04 3.79 0.47
Dec-2020 120.5 109.02 11.04 0.44
Jan-2021 107.2 110.50 -2.63 -0.67
Feb-2021 107.6 111.58 -3.81 -0.16
Mar-2021 113.4 112.35 0.19 0.86
Apr-2021 110.7 112.90 -4.84 2.64
May-2021 115.8 113.48 1.81 0.51
Jun-2021 117.6 114.00 0.68 2.91
Jul-2021 112.2 114.40 -1.96 -0.24
Aug-2021 115.2 114.74 0.66 -0.20
Sep-2021 114.7 115.14 -2.05 1.61
Oct-2021 111.8 115.47 -2.90 -0.77
Nov-2021 118.7 115.84 3.79 -0.93
Dec-2021 125.8 116.21 11.04 -1.45
Jan-2022 111.3 116.47 -2.63 -2.54
Feb-2022 111.7 116.88 -3.81 -1.36
Mar-2022 118.9 117.22 0.19 1.49
Apr-2022 113.2 117.51 -4.84 0.53
May-2022 122.2 117.82 1.81 2.57
Jun-2022 120.0 118.12 0.68 1.20
Jul-2022 116.2 118.45 -1.96 -0.29
Aug-2022 120.8 118.68 0.66 1.45
Sep-2022 117.4 118.91 -2.05 0.54
Oct-2022 116.0 119.19 -2.90 -0.29
Nov-2022 121.9 119.52 3.79 -1.41
Dec-2022 129.8 119.98 11.04 -1.23
Jan-2023 115.2 120.42 -2.63 -2.59
Feb-2023 113.5 120.70 -3.81 -3.39
Mar-2023 122.5 120.82 0.19 1.48
Apr-2023 116.3 120.89 -4.84 0.25
May-2023 127.0 121.18 1.81 4.01
Jun-2023 126.4 121.58 0.68 4.14
Jul-2023 120.4 122.00 -1.96 0.36
Aug-2023 123.2 122.51 0.66 0.02
Sep-2023 118.0 122.65 -2.05 -2.61
Oct-2023 117.0 122.80 -2.90 -2.90
Nov-2023 127.8 123.17 3.79 0.84
Dec-2023 133.5 123.13 11.04 -0.68
Jan-2024 121.5 123.12 -2.63 1.01
Feb-2024 119.6 123.31 -3.81 0.11
Mar-2024 119.8 123.38 0.19 -3.77
Apr-2024 122.5 123.67 -4.84 3.67
May-2024 129.6 123.99 1.81 3.79
Jun-2024 123.0 124.18 0.68 -1.87
Jul-2024 123.5 124.41 -1.96 1.05
Aug-2024 124.6 124.52 0.66 -0.58
Sep-2024 118.2 124.85 -2.05 -4.60
Oct-2024 123.9 125.23 -2.90 1.57
Nov-2024 128.6 125.49 3.79 -0.68
Dec-2024 137.3 125.90 11.04 0.35
Jan-2025 123.2 126.33 -2.63 -0.50
Feb-2025 120.4 126.67 -3.81 -2.45
Mar-2025 126.9 127.14 0.19 -0.44
Apr-2025 124.6 127.60 -4.84 1.84
May-2025 133.7 127.96 1.81 3.92
Jun-2025 128.9 128.49 0.68 -0.27
Jul-2025 127.9 129.00 -1.96 0.85
Aug-2025 128.2 129.43 0.66 -1.89
Sep-2025 126.0 129.89 -2.05 -1.84
Oct-2025 127.1 NA -2.90 NA
Nov-2025 134.1 NA 3.79 NA
Dec-2025 144.4 NA 11.04 NA
Jan-2026 128.5 NA -2.63 NA
Feb-2026 125.3 NA -3.81 NA
Mar-2026 133.0 NA 0.19 NA

Gráfico de los componentes (modelo aditivo)

decomp_add <- list(x = y, seasonal = S_add_ts, trend = T_t, random = I_add,
                    figure = S_add, type = "additive")
class(decomp_add) <- "decomposed.ts"
plot(decomp_add)

Modelo multiplicativo

Componente estacional

En el modelo multiplicativo se obtiene la razón entre la serie original y la tendencia: \(Y_t / T_t = S_t \times I_t\). Se promedia esta razón por cada mes del año para obtener el índice estacional bruto, y se normaliza para que la suma de los 12 índices sea igual a 12 (es decir, que el promedio sea 1), condición propia del modelo multiplicativo.

detrend_mult <- y / T_t
S_raw_mult <- tapply(detrend_mult, cycle(y), mean, na.rm = TRUE)
S_mult <- S_raw_mult * (12 / sum(S_raw_mult))

S_mult_tabla <- data.frame(Mes = month.abb, `Índice estacional` = round(S_mult, 4))
knitr::kable(S_mult_tabla, row.names = FALSE,
             caption = "Índices estacionales - Modelo multiplicativo")
Índices estacionales - Modelo multiplicativo
Mes Índice.estacional
Jan 0.9781
Feb 0.9686
Mar 1.0020
Apr 0.9566
May 1.0124
Jun 1.0048
Jul 0.9827
Aug 1.0061
Sep 0.9841
Oct 0.9754
Nov 1.0332
Dec 1.0960
cat("Comprobación: la suma de los índices estacionales es", round(sum(S_mult), 6),
    "(debe ser ≈ 12)\n")
## Comprobación: la suma de los índices estacionales es 12 (debe ser ≈ 12)

Componente irregular

S_mult_ts <- ts(rep(S_mult, length.out = length(y)), start = start(y), frequency = 12)
I_mult <- y / (T_t * S_mult_ts)

Tabla resumen del modelo multiplicativo

tabla_mult <- data.frame(
  Fecha       = format(fechas, "%b-%Y"),
  Observado   = round(as.numeric(y), 1),
  Tendencia   = round(as.numeric(T_t), 2),
  Estacional  = round(as.numeric(S_mult_ts), 3),
  Irregular   = round(as.numeric(I_mult), 3)
)
knitr::kable(tabla_mult, row.names = FALSE,
             caption = "Descomposición multiplicativa mes a mes")
Descomposición multiplicativa mes a mes
Fecha Observado Tendencia Estacional Irregular
Jan-2018 105.1 NA 0.978 NA
Feb-2018 102.5 NA 0.969 NA
Mar-2018 108.4 NA 1.002 NA
Apr-2018 108.0 NA 0.957 NA
May-2018 112.5 NA 1.012 NA
Jun-2018 113.6 NA 1.005 NA
Jul-2018 108.8 109.81 0.983 1.008
Aug-2018 111.9 110.07 1.006 1.010
Sep-2018 107.5 110.40 0.984 0.989
Oct-2018 105.9 110.65 0.975 0.981
Nov-2018 112.2 110.81 1.033 0.980
Dec-2018 120.0 110.95 1.096 0.987
Jan-2019 107.8 111.09 0.978 0.992
Feb-2019 106.1 111.24 0.969 0.985
Mar-2019 112.6 111.47 1.002 1.008
Apr-2019 109.7 111.77 0.957 1.026
May-2019 114.7 112.08 1.012 1.011
Jun-2019 114.7 112.39 1.005 1.016
Jul-2019 111.1 112.55 0.983 1.004
Aug-2019 113.2 112.75 1.006 0.998
Sep-2019 111.8 112.54 0.984 1.010
Oct-2019 108.8 111.25 0.975 1.003
Nov-2019 116.8 109.28 1.033 1.034
Dec-2019 122.7 107.47 1.096 1.042
Jan-2020 109.1 106.15 0.978 1.051
Feb-2020 109.6 105.21 0.969 1.075
Mar-2020 103.9 104.64 1.002 0.991
Apr-2020 87.4 104.33 0.957 0.876
May-2020 89.8 103.96 1.012 0.853
Jun-2020 96.2 103.64 1.005 0.924
Jul-2020 97.9 103.47 0.983 0.963
Aug-2020 103.8 103.31 1.006 0.999
Sep-2020 107.6 103.62 0.984 1.055
Oct-2020 105.5 104.99 0.975 1.030
Nov-2020 111.3 107.04 1.033 1.006
Dec-2020 120.5 109.02 1.096 1.008
Jan-2021 107.2 110.50 0.978 0.992
Feb-2021 107.6 111.58 0.969 0.996
Mar-2021 113.4 112.35 1.002 1.007
Apr-2021 110.7 112.90 0.957 1.025
May-2021 115.8 113.48 1.012 1.008
Jun-2021 117.6 114.00 1.005 1.027
Jul-2021 112.2 114.40 0.983 0.998
Aug-2021 115.2 114.74 1.006 0.998
Sep-2021 114.7 115.14 0.984 1.012
Oct-2021 111.8 115.47 0.975 0.993
Nov-2021 118.7 115.84 1.033 0.992
Dec-2021 125.8 116.21 1.096 0.988
Jan-2022 111.3 116.47 0.978 0.977
Feb-2022 111.7 116.88 0.969 0.987
Mar-2022 118.9 117.22 1.002 1.012
Apr-2022 113.2 117.51 0.957 1.007
May-2022 122.2 117.82 1.012 1.024
Jun-2022 120.0 118.12 1.005 1.011
Jul-2022 116.2 118.45 0.983 0.998
Aug-2022 120.8 118.68 1.006 1.012
Sep-2022 117.4 118.91 0.984 1.003
Oct-2022 116.0 119.19 0.975 0.998
Nov-2022 121.9 119.52 1.033 0.987
Dec-2022 129.8 119.98 1.096 0.987
Jan-2023 115.2 120.42 0.978 0.978
Feb-2023 113.5 120.70 0.969 0.971
Mar-2023 122.5 120.82 1.002 1.012
Apr-2023 116.3 120.89 0.957 1.006
May-2023 127.0 121.18 1.012 1.035
Jun-2023 126.4 121.58 1.005 1.035
Jul-2023 120.4 122.00 0.983 1.004
Aug-2023 123.2 122.51 1.006 1.000
Sep-2023 118.0 122.65 0.984 0.978
Oct-2023 117.0 122.80 0.975 0.977
Nov-2023 127.8 123.17 1.033 1.004
Dec-2023 133.5 123.13 1.096 0.989
Jan-2024 121.5 123.12 0.978 1.009
Feb-2024 119.6 123.31 0.969 1.001
Mar-2024 119.8 123.38 1.002 0.969
Apr-2024 122.5 123.67 0.957 1.036
May-2024 129.6 123.99 1.012 1.032
Jun-2024 123.0 124.18 1.005 0.986
Jul-2024 123.5 124.41 0.983 1.010
Aug-2024 124.6 124.52 1.006 0.995
Sep-2024 118.2 124.85 0.984 0.962
Oct-2024 123.9 125.23 0.975 1.014
Nov-2024 128.6 125.49 1.033 0.992
Dec-2024 137.3 125.90 1.096 0.995
Jan-2025 123.2 126.33 0.978 0.997
Feb-2025 120.4 126.67 0.969 0.981
Mar-2025 126.9 127.14 1.002 0.996
Apr-2025 124.6 127.60 0.957 1.021
May-2025 133.7 127.96 1.012 1.032
Jun-2025 128.9 128.49 1.005 0.998
Jul-2025 127.9 129.00 0.983 1.009
Aug-2025 128.2 129.43 1.006 0.985
Sep-2025 126.0 129.89 0.984 0.986
Oct-2025 127.1 NA 0.975 NA
Nov-2025 134.1 NA 1.033 NA
Dec-2025 144.4 NA 1.096 NA
Jan-2026 128.5 NA 0.978 NA
Feb-2026 125.3 NA 0.969 NA
Mar-2026 133.0 NA 1.002 NA

Gráfico de los componentes (modelo multiplicativo)

decomp_mult <- list(x = y, seasonal = S_mult_ts, trend = T_t, random = I_mult,
                     figure = S_mult, type = "multiplicative")
class(decomp_mult) <- "decomposed.ts"
plot(decomp_mult)

Comparación de los dos modelos

Una forma objetiva de comparar qué modelo describe mejor la serie es observar la dispersión del componente irregular: mientras menor sea su variabilidad, mejor capturan la tendencia y la estacionalidad la mayor parte del movimiento de la serie, dejando un residuo más “limpio” (cercano al ruido aleatorio).

sd_add  <- sd(I_add, na.rm = TRUE)
sd_mult <- sd(I_mult, na.rm = TRUE)   # ronda alrededor de 1 en el modelo multiplicativo

comparacion <- data.frame(
  Modelo = c("Aditivo", "Multiplicativo"),
  `Desviación estándar del irregular` = c(round(sd_add, 3), round(sd_mult, 4)),
  `Escala` = c("Mismas unidades que el índice", "Proporción respecto a 1")
)
knitr::kable(comparacion, row.names = FALSE)
Modelo Desviación.estándar.del.irregular Escala
Aditivo 3.2620 Mismas unidades que el índice
Multiplicativo 0.0304 Proporción respecto a 1

Adicionalmente, el comportamiento de la amplitud estacional ayuda a decidir entre ambos modelos: si la amplitud de las oscilaciones estacionales crece a medida que el nivel de la serie aumenta, el modelo multiplicativo es más apropiado; si la amplitud se mantiene relativamente constante en el tiempo, el modelo aditivo es suficiente. En la serie del IMAE, los picos estacionales de diciembre muestran una ligera tendencia a crecer en magnitud absoluta a medida que el índice general crece, lo que favorece levemente al modelo multiplicativo, aunque ambos modelos describen razonablemente bien la serie dado que la variación estacional no es extremadamente pronunciada.

Validación con la función decompose() de R

Para validar que el procedimiento manual fue calculado correctamente, se compara contra la función decompose() incluida en el paquete base stats de R, la cual implementa el mismo método clásico de medias móviles.

dc_add  <- decompose(y, type = "additive")
dc_mult <- decompose(y, type = "multiplicative")

cat("Correlación entre tendencia manual y decompose() [aditivo]:",
    round(cor(T_t, dc_add$trend, use = "complete.obs"), 6), "\n")
## Correlación entre tendencia manual y decompose() [aditivo]: 1
cat("Diferencia máxima absoluta entre índices estacionales (aditivo):",
    round(max(abs(S_add - dc_add$figure)), 8), "\n")
## Diferencia máxima absoluta entre índices estacionales (aditivo): 0
cat("Diferencia máxima absoluta entre índices estacionales (multiplicativo):",
    round(max(abs(S_mult - dc_mult$figure)), 8), "\n")
## Diferencia máxima absoluta entre índices estacionales (multiplicativo): 0

Las diferencias son prácticamente nulas (orden de \(10^{-8}\) o menores), lo que confirma que el cálculo manual mediante medias móviles centradas reproduce exactamente el método clásico de descomposición.

Conclusiones

Fuente de los datos: Secretaría Ejecutiva del Consejo Monetario Centroamericano (SECMCA), Índice Mensual de la Actividad Económica - El Salvador, datos no ajustados estacionalmente ni por calendario.