Índice de Transmisión Económica y Bienestar Social (ITEBS-SV)

UNIVERSIDAD DE EL SALVADOR

FACULTAD DE CIENCIAS ECONÓMICAS

ESCUELA DE ECONOMIA

Docente: Mtro. Balmore Alexis Rodríguez Ochoa

Materia: Metodos para el Analisis Economico

Tema: Índice de Transmisión Económica y Bienestar Social (ITEBS-SV)

ESTUDIANTE:

APELLIDOS NOMBRES CARNET
Rodriguez Claros Santos Isaac RC12013

Fecha: 7 de Septiembre de 2026

Ciudad Universitaria, San Miguel, El Salvador

::: ::::

1. INTRODUCCION

La evaluación de la coyuntura económica en países en desarrollo requiere ir más allá del análisis exclusivo del Producto Interno Bruto (PIB), integrando indicadores de frecuencia mensual que reflejen de forma oportuna la realidad material de los hogares. En El Salvador, el dinamismo productivo, el choque de precios en los alimentos, el flujo de recursos externos y las condiciones del mercado laboral formal interactúan de manera constante para configurar las condiciones de vida de la población.

Para analizar esta dinámica de forma cuantitativa y estructurada, el presente trabajo introduce el Índice de Transmisión Económica y Bienestar Social de El Salvador (ITEBS-SV). Este indicador sintético multidimensional está compuesto por tres dimensiones analíticas y seis variables clave obtenidas del Banco Central de Reserva de El Salvador (BCR) y del Instituto Salvadoreño del Seguro Social (ISSS):

Dimensión 1: Tracción Productiva: Captura el ritmo de la actividad económica agregada y comercial mediante el índice general del Índice de Volumen de la Actividad Económica (ivae_global_index) y el índice específico del sector comercio, restaurantes y hoteles (ivae_comercio_index).

Dimensión 2: Capacidad de Compra: Evalúa la presión financiera y alimentaria de los hogares al contrastar la entrada de recursos externos a través del ingreso de remesas familiares (remesas_familiares_usd) frente al costo mensual de la Canasta Básica Alimentaria Urbana (costo_cba_urbana_usd).

Dimensión 3: Empleo y Salarios: Mide la solidez y calidad del mercado laboral formal a través del total de trabajadores cotizantes activos al Seguro Social (cotizantes_activos_isss) y el salario nominal medio mensual de dichos cotizantes (salario_medio_isss_usd).

Mediante esta integración de datos de alta frecuencia, el ITEBS-SV se consolida como una herramienta técnica de monitoreo diseñada para capturar con precisión de qué manera los impulsos del sector real y financiero se transmiten hacia la capacidad adquisitiva y la estabilidad laboral de la sociedad salvadoreña.

2. Objetivos

Objetivo general

Construir un índice sintético multidimensional que permita medir y analizar la transmisión de las variables macroeconómicas sobre el bienestar social y la capacidad de compra de las familias en El Salvador.

Objetivos específicos

  1. Clasificar las variables socioeconómicas mensuales del BCR e ISSS en tres dimensiones conceptuales coherentes: Tracción Productiva, Capacidad de Compra, y Empleo y Salarios.

  2. Normalizar los indicadores mediante el método Min-Max (o estandarización según el comportamiento de la serie temporal), expresándolos en una escala común y adimensional para su adecuada agregación.

  3. Calcular subíndices dimensionales y un índice sintético global (ITEBS-SV) bajo un esquema de ponderación técnica que refleje la incidencia de cada dimensión en el bienestar.

  4. Analizar la evolución temporal del índice, identificando los periodos de mayor y menor bienestar social, así como las dimensiones clave que explican sus variaciones principales.

  5. Documentar el procedimiento de forma reproducible en RStudio, garantizando la trazabilidad desde la extracción de datos de las fuentes oficiales hasta el cálculo final de las series.

3. Enfoque teórico

Definición del índice

Un índice sintético o indicador compuesto es una medida agregada que resume, en un valor único, la información contenida en un conjunto de indicadores simples que miden distintas facetas de un mismo fenómeno multidimensional. Su utilidad radica en permitir el monitoreo y seguimiento temporal de dinámicas complejas cuando ninguna variable individual capta por sí sola la magnitud total del concepto de interés.

El Índice de Transmisión Económica y Bienestar Social (ITEBS-SV) que aquí se construye mide la capacidad y velocidad con la que los impulsos macroeconómicos y productivos del país se traducen en la capacidad de compra y la estabilidad laboral formal de las familias en El Salvador. Se trata de un índice de transmisión socioeconómica de alta frecuencia, no de un índice de pobreza multidimensional estructural ni de desarrollo humano de largo plazo: mide la sensibilidad y vulnerabilidad del bienestar coyuntural ante el entorno económico, no las carencias sociales acumuladas a lo largo de décadas.

Esta delimitación es relevante porque, en la literatura sobre economía del bienestar y macroeconomía del consumo, se distinguen habitualmente tres niveles o etapas del ciclo de transmisión:

La tracción del sector real (primera etapa): La capacidad de la economía para generar actividad, valor agregado y dinamismo comercial.

La capacidad de absorción y liquidez (segunda etapa): El flujo de ingresos directos (como las remesas) y la resistencia del poder adquisitivo frente al costo de la canasta alimentaria.

La consolidación de condiciones laborales (tercera etapa): La formalización del empleo y el nivel salarial alcanzado que sostienen la calidad de vida de manera estable.

El presente ejercicio se sitúa en la intersección de estas tres etapas, midiendo cómo la producción macroeconómica se propaga de manera directa hacia la capacidad adquisitiva e inserción laboral de los hogares salvadoreños.

4. Dimensiones e indicadores

La base de datos se consolida a partir de seis series temporales de frecuencia mensual provenientes del Banco Central de Reserva de El Salvador (BCR) y del Instituto Salvadoreño del Seguro Social (ISSS). Estas variables se agrupan en tres dimensiones conceptuales que captan los distintos eslabones del proceso de transmisión económica hacia el bienestar:

Dimensión

Concepto que capta

Indicadores

D1. Tracción Productiva

El ritmo de actividad del sector real de la economía y la dinámica de los sectores clave generadores de valor agregado y empleo comercial.

Índx. de Volumen de la Actividad Económica General (ivae_global_index); Índx. de Volumen del Comercio, Restaurantes y Hoteles (ivae_comercio_index).

D2. Capacidad de Compra

La liquidez directa recibida por los hogares desde el exterior y su relación de contención frente a la presión del costo de la canasta alimentaria básica.

Ingreso de Remesas Familiares en USD (remesas_familiares_usd); Costo de la Canasta Básica Alimentaria Urbana en USD (costo_cba_urbana_usd).

D3. Empleo y Salarios

La solidez, absorción y calidad del mercado laboral formal como vía principal de sostenibilidad del ingreso familiar.

Cotizantes Activos al Seguro Social (cotizantes_activos_isss); Salario Nominal Medio Mensual de Cotizantes en USD (salario_medio_isss_usd).

Justificación de la clasificación. La estructura tripartita del índice responde al circuito a través del cual la macroeconomía incide en la vida cotidiana de la población salvadoreña. La Tracción Productiva actúa como la fuerza motora de la oferta agregada: sin dinamismo en la producción global y comercial, se contrae la capacidad del sistema para sostener la actividad interna. Sin embargo, la producción nacional por sí sola no determina el consumo inmediato; por ello, la Capacidad de Compra evalúa el poder adquisitivo real de los hogares, contrastando el flujo de remesas —fuente crucial de liquidez familiar en El Salvador— con la barrera de acceso que representa el costo de la canasta alimentaria urbana. Finalmente, la dimensión de Empleo y Salarios mide la canalización de dicho entorno en la economía formal, diferenciando la masa laboral activa del ingreso promedio percibido. Desacoplar el empleo formal del ingreso y del costo alimentario permite identificar tensiones estructurales, tales como períodos donde la economía crece o el empleo aumenta, pero el salario real se deteriora frente al costo de la vida.

5. Metodología aplicada

Fuente de datos

La información utilizada procede de las bases de datos y registros administrativos del Banco Central de Reserva de El Salvador (BCR) y del Instituto Salvadoreño del Seguro Social (ISSS). Para la construcción del índice se conformó una base de datos de frecuencia mensual que consolida los seis indicadores que aquí se emplean: el Índice de Volumen de la Actividad Económica General (ivae_global_index), el IVAE del sector comercio, restaurantes y hoteles (ivae_comercio_index), los ingresos por remesas familiares en millones de USD (remesas_familiares_usd), el costo de la Canasta Básica Alimentaria Urbana en USD (costo_cba_urbana_usd), el total de trabajadores cotizantes activos al Seguro Social (cotizantes_activos_isss) y el salario nominal medio mensual de dichos cotizantes en USD (salario_medio_isss_usd).

Trabajar con registros administrativos y métricas macroeconómicas de frecuencia mensual tiene tres implicaciones metodológicas clave para este ejercicio. Primera, al tratarse de series temporales de alta frecuencia, el índice no ofrece una captura estática en un punto del tiempo, sino un monitoreo continuo de la evolución, tendencia y sensibilidad de la transmisión económica mes a mes. Segunda, las variables provienen de las fuentes oficiales primarias encargadas de la contabilidad nacional y la seguridad social en El Salvador, lo que garantiza la homogenización de los criterios de captura y la validez técnica de la información. Tercera, los datos corresponden a agregados de nivel nacional: registran la dinámica macroeconómica, el costo promedio de la vida urbana y la masa laboral formal, lo que confirma la delimitación del ITEBS-SV como un índice de transmisión socioeconómica coyuntural y no como un indicador de pobreza estructural o desigualdad territorial a nivel microeconómico.

Las series de tiempo originales fueron alineadas cronológicamente y organizadas en una matriz de datos longitudinal. Ese conjunto de datos es el que se almacena en el archivo de trabajo ITEBS_SV_DATA.xlsx (o .csv), insumo directo del código de procesamiento en RStudio. Al integrar variables expresadas en distintas unidades de medida (índices en base 100, montos monetarios en USD y recuentos de personas), se hace indispensable un proceso previo de normalización antes de su agregación dimensional.

6. Procedimiento

La construcción del Índice de Transmisión Económica y Bienestar Social de El Salvador (ITEBS-SV) se desarrolla mediante cuatro etapas metodológicas interconectadas: Etapa 1. Normalización por Min-Max. Las seis variables se transforman a una escala adimensional \([0,1]\) para hacerlas comparables entre sí, aplicando la fórmula correspondiente según la orientación o polaridad de cada indicador respecto al bienestar:

Variables de polaridad positiva: A mayor valor del indicador, mayor es la tracción económica o el bienestar. Se aplica a ivae_global_index, ivae_comercio_index, remesas_familiares_usd, cotizantes_activos_isss y salario_medio_isss_usd:

\[ X_{ij}^{\text{norm}} = \frac{X_{ij} - \min(X_j)}{\max(X_j) - \min(X_j)} \]

Variables de polaridad negativa: A mayor valor del indicador, mayor es la presión financiera y el deterioro del bienestar (efecto de costo). Se aplica a la Canasta Básica Alimentaria Urbana (costo_cba_urbana_usd), invirtiendo su escala para que valores más altos reflejen mayor contención o menor encarecimiento:

\[ X_{tj}^{\text{norm}} = \frac{\max(X_j) - X_{tj}}{\max(X_j) - \min(X_j)} \] Donde \(X_{tj}\) representa el valor del indicador \(j\) en el mes \(t\), mientras que \(\min(X_j)\) y \(\max(X_j)\) son los valores mínimo y máximo históricos observados a lo largo de toda la serie temporal.

Etapa 2. Subíndices dimensionales. Para cada mes \(t\), se calcula el promedio aritmético simple de las variables normalizadas que integran cada una de las tres dimensiones:

\[ ISub_{ik} = \frac{1}{n_k} \sum_{j \in D_k} X_{ij}^{norm} \]

Donde \(D_k\) representa el conjunto de indicadores pertenecientes a la dimensión \(k\), y \(n_k = 2\) es el número de indicadores por dimensión:

Subíndice de Tracción Productiva (\(ISub_{t,\text{Trac}}\)): Promedio de ivae_global_index e ivae_comercio_index normalizados.

Subíndice de Capacidad de Compra (\(ISub_{t,\text{Compra}}\)): Promedio de remesas_familiares_usd y costo_cba_urbana_usd normalizados (esta última invertida).

Subíndice de Empleo y Salarios (\(ISub_{t,\text{Emp}}\)): Promedio de cotizantes_activos_isss y salario_medio_isss_usd normalizados.

Etapa 3. Índice sintético global (ITEBS-SV). El índice global mensual se obtiene calculando la media aritmética de los tres subíndices dimensionales bajo un esquema de ponderación equitativa (un tercio para cada dimensión):

\[ ITEBS\_SV_t = \frac{1}{3}\left( ISub_{t,\text{Trac}} + ISub_{t,\text{Compra}} + ISub_{t,\text{Emp}} \right) \]

El resultado final se ubica en el rango \([0,1]\), donde valores cercanos a \(1\) indican períodos de alta transmisión económica y óptimo bienestar social coyuntural, mientras que valores cercanos a \(0\) reflejan fases de estancamiento productivo, pérdida de poder adquisitivo y deterioro del mercado laboral.

Etapa 4. Análisis de tendencias y dinámica temporal. Se evalúa la evolución longitudinal del \(ITEBS\_SV_t\) a través del tiempo, identificando ciclos de expansión, puntos de inflexión coyunturales y los subíndices dimensionales que explican las variaciones principales en la calidad de vida de los hogares salvadoreños.

7. Supuestos y limitaciones

La ponderación equitativa supone que la Tracción Productiva, la Capacidad de Compra y el Empleo y Salarios contribuyen en igual medida a la transmisión del entorno económico hacia el bienestar social de los hogares salvadoreños. Constituye el supuesto más transparente, neutral y utilizado en la construcción de índices compuestos agregados. Sin embargo, representa una decisión metodológica sustantiva y no un hallazgo empírico: asignar pesos diferenciados —por ejemplo, otorgar mayor ponderación a la Capacidad de Compra por la alta sensibilidad del costo alimentario y las remesas— alteraría la magnitud final de las variaciones del índice.

La agregación aritmética empleada en los subíndices y en el índice global asume un principio de compensabilidad perfecta. Esto implica que una caída severa en la dimensión de Empleo y Salarios o un encarecimiento de la Canasta Básica Alimentaria Urbana puede verse numéricamente neutralizada por un repunte extraordinario en el ingreso de remesas o en el IVAE Comercio. En escenarios donde se busque penalizar los desequilibrios coyunturales entre dimensiones, la literatura metodológica sugiere emplear esquemas no compensatorios, como la media geométrica (adoptada por el PNUD para el Índice de Desarrollo Humano).

La normalización Min-Max sobre series de tiempo es relativa al periodo histórico observado. Los valores 0 y 1 no representan colapso absoluto ni un estado de bienestar perfecto, sino los extremos mínimos y máximos registrados por los indicadores del BCR e ISSS durante el intervalo temporal analizado. Esto significa que la incorporación de nuevos datos mensuales futuros o la modificación de la ventana de análisis alterará los valores de referencia (\(\min\) y \(\max\)), reescalando los resultados históricos.

Por último, el índice opera con agregados macroeconómicos y promedios nacionales, lo que limita su capacidad para captar heterogeneidades territoriales, dinámicas de la economía informal (no registrada en el ISSS) o la desigualdad en la distribución del ingreso entre distintos estratos socioeconómicos de El Salvador.

8. Resultados del índice

Preparación del entorno y carga de datos.

# install.packages(c("readxl","dplyr","tidyr","ggplot2","fmsb","scales",
#                    "knitr","kableExtra"))

library(readxl)      # lectura del archivo Excel
library(dplyr)       # manipulación de datos
library(tidyr)       # reestructuración de datos para graficar
library(ggplot2)     # gráficos
library(fmsb)        # gráfico de radar
library(scales)      # utilidades de escala y transparencia
library(knitr)       # tablas
library(kableExtra)  # formato de tablas en HTML
library(readxl)
library(dplyr)
 library(readxl)
Indice_de_Volumen_de_la_Actividad_Economica_IVAE_Serie_desestacionalizada <- read_excel("C:/Users/isaac/OneDrive - Universidad Gerardo Barrios/Escritorio/Indice_de_Volumen_de_la_Actividad_Economica_(IVAE)._Serie_desestacionalizada.xlsx")
View(Indice_de_Volumen_de_la_Actividad_Economica_IVAE_Serie_desestacionalizada)
library(readxl)
Ingresos_mensuales_de_remesas_familiares <- read_excel("C:/Users/isaac/OneDrive - Universidad Gerardo Barrios/Escritorio/Ingresos_mensuales_de_remesas_familiares.xlsx")
View(Ingresos_mensuales_de_remesas_familiares)
library(readxl)
Índice_de_Precios_al_Consumidor_IPC_1_ <- read_excel("C:/Users/isaac/OneDrive - Universidad Gerardo Barrios/Escritorio/Índice_de_Precios_al_Consumidor_(IPC) (1).xlsx")
View(Índice_de_Precios_al_Consumidor_IPC_1_)
library(readxl)
base_cotizantes_a_mayo_2023 <- read_excel("C:/Users/isaac/OneDrive - Universidad Gerardo Barrios/Escritorio/base_cotizantes_a_mayo_2023.xlsx")
View(base_cotizantes_a_mayo_2023)
library(readxl)
library(dplyr)
library(stringr)

# ------------------------------------------------------------------------------
# DEFINICIÓN DE RUTAS CON RESPALDO LOCAL / DESK
# ------------------------------------------------------------------------------
dir_respaldo <- "C:/Users/isaac/OneDrive - Universidad Gerardo Barrios/Escritorio"

obtener_ruta <- function(nombre_archivo) {
  if (file.exists(nombre_archivo)) {
    return(nombre_archivo)
  } else {
    ruta_alt <- file.path(dir_respaldo, nombre_archivo)
    if (file.exists(ruta_alt)) {
      return(ruta_alt)
    } else {
      stop("No se encontró el archivo: ", nombre_archivo)
    }
  }
}

ruta_ivae       <- obtener_ruta("Indice_de_Volumen_de_la_Actividad_Economica_(IVAE)._Serie_desestacionalizada.xlsx")
ruta_remesas    <- obtener_ruta("Ingresos_mensuales_de_remesas_familiares.xlsx")
ruta_ipc        <- obtener_ruta("Índice_de_Precios_al_Consumidor_(IPC) (1).xlsx")
ruta_cotizantes <- obtener_ruta("base_cotizantes_a_mayo_2023.xlsx")

# ------------------------------------------------------------------------------
# FUNCIONES AUXILIARES ROBUSTAS
# ------------------------------------------------------------------------------
limpiar_texto <- function(texto) {
  texto |>
    as.character() |>
    str_trim() |>
    tolower() |>
    iconv(from = "UTF-8", to = "ASCII//TRANSLIT")
}

# Encuentra la fila que contiene la palabra clave (ej. 'concepto') para usarla como encabezado
cargar_excel_inteligente <- function(ruta, palabra_clave = "concepto") {
  df_raw <- read_excel(ruta, col_names = FALSE)
  
  # Buscar en qué fila se encuentra la palabra clave
  fila_hdr <- 0
  for (i in 1:min(10, nrow(df_raw))) {
    valores_fila <- limpiar_texto(df_raw[i, ])
    if (any(str_detect(valores_fila, palabra_clave), na.rm = TRUE)) {
      fila_hdr <- i
      break
    }
  }
  
  if (fila_hdr == 0) {
    stop("No se pudo identificar la fila de encabezados con la palabra '", palabra_clave, "' en ", ruta)
  }
  
  # Extraer encabezados y datos
  encabezados <- as.character(df_raw[fila_hdr, ])
  encabezados <- str_trim(encabezados)
  
  df_datos <- df_raw[(fila_hdr + 1):nrow(df_raw), ]
  names(df_datos) <- encabezados
  
  # Renombrar columna principal
  idx_concepto <- which(limpiar_texto(encabezados) == palabra_clave)
  if (length(idx_concepto) > 0) {
    names(df_datos)[idx_concepto[1]] <- "concepto"
  }
  
  return(df_datos)
}

ubicar_columna <- function(df_names, patron) {
  nombres_simples <- limpiar_texto(df_names)
  idx <- grep(patron, nombres_simples)
  if (length(idx) == 0) {
    stop("No se encontró ninguna columna con el patrón: '", patron, "'")
  }
  df_names[idx[1]]
}

# ------------------------------------------------------------------------------
# 1. CARGA Y LIMPIEZA: IVAE
# ------------------------------------------------------------------------------
df_ivae <- cargar_excel_inteligente(ruta_ivae, "concepto") |>
  filter(!is.na(concepto), concepto != "")

# ------------------------------------------------------------------------------
# 2. CARGA Y LIMPIEZA: REMESAS FAMILIARES
# ------------------------------------------------------------------------------
df_remesas <- cargar_excel_inteligente(ruta_remesas, "concepto") |>
  filter(!is.na(concepto), concepto != "", !str_detect(tolower(concepto), "notas"))

# ------------------------------------------------------------------------------
# 3. CARGA Y LIMPIEZA: ÍNDICE DE PRECIOS AL CONSUMIDOR (IPC)
# ------------------------------------------------------------------------------
df_ipc <- cargar_excel_inteligente(ruta_ipc, "concepto") |>
  filter(!is.na(concepto), concepto != "")

# ------------------------------------------------------------------------------
# 4. CARGA Y LIMPIEZA: BASE DE COTIZANTES (ISSS)
# ------------------------------------------------------------------------------
df_cotizantes_raw <- read_excel(ruta_cotizantes, sheet = 1)

col_actividad <- ubicar_columna(names(df_cotizantes_raw), "actividad")
col_patrono   <- ubicar_columna(names(df_cotizantes_raw), "patrono")
col_trabajad  <- ubicar_columna(names(df_cotizantes_raw), "trabajad")
col_salario   <- ubicar_columna(names(df_cotizantes_raw), "salario")
col_periodo   <- ubicar_columna(names(df_cotizantes_raw), "periodo")

df_cotizantes <- df_cotizantes_raw |>
  rename(
    actividad     = all_of(col_actividad),
    patronos      = all_of(col_patrono),
    trabajadores  = all_of(col_trabajad),
    salario_total = all_of(col_salario),
    periodo       = all_of(col_periodo)
  ) |>
  select(periodo, actividad, patronos, trabajadores, salario_total)

# ------------------------------------------------------------------------------
# RESUMEN Y NOTIFICACIÓN
# ------------------------------------------------------------------------------
cat("==================================================\n")
## ==================================================
cat(" ARCHIVOS CARGADOS Y PROCESADOS CORRECTAMENTE\n")
##  ARCHIVOS CARGADOS Y PROCESADOS CORRECTAMENTE
cat("==================================================\n")
## ==================================================
cat("IVAE:       ", nrow(df_ivae), "filas |", ncol(df_ivae) - 1, "columnas temporales\n")
## IVAE:        11 filas | 144 columnas temporales
cat("Remesas:    ", nrow(df_remesas), "filas |", ncol(df_remesas) - 1, "columnas temporales\n")
## Remesas:     1 filas | 144 columnas temporales
cat("IPC:        ", nrow(df_ipc), "filas |", ncol(df_ipc) - 1, "columnas temporales\n")
## IPC:         14 filas | 12 columnas temporales
cat("Cotizantes: ", nrow(df_cotizantes), "filas |", ncol(df_cotizantes), "columnas seleccionadas\n")
## Cotizantes:  3128 filas | 5 columnas seleccionadas

9. Estadísticos descriptivos de las variables originales

library(dplyr)
library(tidyr)
library(stringr)
library(knitr)
library(kableExtra)

# ==============================================================================
# 1. EXTRACCIÓN Y LIMPIEZA DE DATOS POR SEPARADO
# ==============================================================================

# A. IVAE General
v_ivae <- df_ivae |>
  filter(str_detect(concepto, "^IVAE")) |>
  select(-concepto) |>
  unlist() |>
  as.numeric()
v_ivae <- v_ivae[!is.na(v_ivae)]

# B. Remesas Familiares
v_remesas <- df_remesas |>
  filter(row_number() == 1) |>
  select(-concepto) |>
  unlist() |>
  as.numeric()
v_remesas <- v_remesas[!is.na(v_remesas)]

# C. IPC General
v_ipc <- df_ipc |>
  filter(str_detect(concepto, "1\\s+Índice general|1\\s+Indice general")) |>
  select(-concepto) |>
  unlist() |>
  as.numeric()
v_ipc <- v_ipc[!is.na(v_ipc)]

# D. Cotizantes ISSS
v_cotizantes <- df_cotizantes |>
  group_by(periodo) |>
  summarise(total_trabajadores = sum(trabajadores, na.rm = TRUE), .groups = "drop") |>
  pull(total_trabajadores)

# ==============================================================================
# 2. CONSOLIDACIÓN EN FORMATO UNIFICADO (SOPORTA DIFERENTES TAMAÑOS)
# ==============================================================================

datos_unificados <- bind_rows(
  data.frame(Variable = "IVAE General", Valor = v_ivae),
  data.frame(Variable = "Remesas (Millones USD)", Valor = v_remesas),
  data.frame(Variable = "IPC General", Valor = v_ipc),
  data.frame(Variable = "Cotizantes ISSS", Valor = v_cotizantes)
)

# ==============================================================================
# 3. CÁLCULO DE ESTADÍSTICOS DESCRIPTIVOS Y TABLA FORMATO KABLE
# ==============================================================================

variables_originales <- c("IVAE General", "Remesas (Millones USD)", "IPC General", "Cotizantes ISSS")

descriptivos <- datos_unificados |>
  filter(Variable %in% variables_originales) |>
  group_by(Variable) |>
  summarise(
    Media        = mean(Valor, na.rm = TRUE),
    Mínimo       = min(Valor, na.rm = TRUE),
    Máximo       = max(Valor, na.rm = TRUE),
    `Desv. est.` = sd(Valor, na.rm = TRUE),
    .groups = "drop"
  ) |>
  mutate(`Razón máx/mín` = Máximo / Mínimo)

kable(descriptivos, digits = 3,
      caption = "Estadísticos descriptivos consolidados de las variables analizadas") |>
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Estadísticos descriptivos consolidados de las variables analizadas
Variable Media Mínimo Máximo Desv. est. Razón máx/mín
Cotizantes ISSS 960963.6 957704.0 964271.0 2417.286 1.007
IPC General 116.3 108.7 130.2 8.339 1.198
IVAE General 112.3 87.3 131.9 9.420 1.511
Remesas (Millones USD) 535.1 282.2 961.1 163.860 3.406

La tabla revela la naturaleza contrastante entre los agregados de estabilidad macroeconómica y las variables de flujo o de choque externo: mientras que el empleo formal (Cotizantes ISSS) y el nivel general de precios (IPC) muestran un comportamiento altamente estable e inercial —con razones entre el máximo y el mínimo observado de tan solo 1.01 y 1.20 respectivamente—, los ingresos por Remesas familiares presentan una volatilidad y expansión pronunciada, donde el mayor flujo registrado registrado casi múltiplica por 3.4 al nivel mínimo del periodo. Por su parte, la actividad económica real (IVAE General) exhibe una variabilidad moderada (razón máx/mín de 1.51), reflejando las fluctuaciones del ciclo económico frente a choques coyunturales. Ambos grupos de variables miden dimensiones de dinamismo y vulnerabilidad macroeconómica de naturaleza muy distinta, lo que justifica plenamente su estandarización e integración en subíndices independientes.

10. Definición de dimensiones

# --- PUNTO DE MODIFICACIÓN DE LA COMPOSICIÓN DIMENSIONAL ---------------------
# Agrupación de las variables económicas y laborales en dimensiones conceptuales

dim_traccion_productiva <- c("IVAE General", "Remesas (Millones USD)")
dim_capacidad_compra    <- c("IPC General")
dim_mercado_laboral     <- c("Cotizantes ISSS")

dimensiones <- list(
  "Tracción Productiva"         = dim_traccion_productiva,
  "Capacidad de Compra / Precios" = dim_capacidad_compra,
  "Mercado Laboral / Empleo"    = dim_mercado_laboral
)

# Registro explícito de la composición utilizada
data.frame(
  Dimensión = names(dimensiones),
  Indicadores = sapply(dimensiones, paste, collapse = ", "),
  `N° indicadores` = sapply(dimensiones, length),
  check.names = FALSE, row.names = NULL
) |>
  kable(caption = "Composición dimensional del índice macroeconómico") |>
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Composición dimensional del índice macroeconómico
Dimensión Indicadores N° indicadores
Tracción Productiva IVAE General, Remesas (Millones USD) 2
Capacidad de Compra / Precios IPC General 1
Mercado Laboral / Empleo Cotizantes ISSS 1

11. Normalización Min-Max

# Definición de la función de normalización Min-Max
min_max_norm <- function(x) {
  (x - min(x, na.rm = TRUE)) / (max(x, na.rm = TRUE) - min(x, na.rm = TRUE))
}

# Aplicación de la normalización a la tabla de datos unificados
datos_norm <- datos_unificados |>
  group_by(Variable) |>
  mutate(Valor_norm = min_max_norm(Valor)) |>
  ungroup()

# Verificación: comprobación de que cada indicador normalizado quede strictly en [0, 1]
verificacion_norm <- datos_norm |>
  group_by(Variable) |>
  summarise(
    Mínimo = min(Valor_norm, na.rm = TRUE),
    Máximo = max(Valor_norm, na.rm = TRUE),
    .groups = "drop"
  ) |>
  pivot_longer(cols = c(Mínimo, Máximo), names_to = "Estadístico", values_to = "Valor") |>
  mutate(Indicador = paste(Variable, Estadístico, sep = "_")) |>
  select(Indicador, Valor)

# Presentación en tabla con kableExtra y scroll_box
kable(verificacion_norm, digits = 2, 
      caption = "Verificación del rango de las variables macroeconómicas normalizadas") |>
  kable_styling(bootstrap_options = c("striped", "condensed"), full_width = FALSE) |>
  scroll_box(height = "220px")
Verificación del rango de las variables macroeconómicas normalizadas
Indicador Valor
Cotizantes ISSS_Mínimo 0
Cotizantes ISSS_Máximo 1
IPC General_Mínimo 0
IPC General_Máximo 1
IVAE General_Mínimo 0
IVAE General_Máximo 1
Remesas (Millones USD)_Mínimo 0
Remesas (Millones USD)_Máximo 1

12. Cálculo de subíndices e índice global

# ==============================================================================
# CÁLCULO DE SUBÍNDICES E ÍNDICE GLOBAL SINTÉTICO (IGM)
# ==============================================================================

# 1. Transformación de datos normalizados a formato ancho para poder operar por filas
macro_norm_ancho <- datos_norm |>
  group_by(Variable) |>
  mutate(observacion = row_number()) |>
  ungroup() |>
  select(observacion, Variable, Valor_norm) |>
  pivot_wider(names_from = Variable, values_from = Valor_norm)

# 2. Cálculo de los subíndices por dimensión y del índice global (IGM)
macro_indice <- macro_norm_ancho |>
  rowwise() |>
  mutate(
    ISub_Traccion   = mean(c_across(all_of(dim_traccion_productiva)), na.rm = TRUE),
    ISub_Precios    = mean(c_across(all_of(dim_capacidad_compra)), na.rm = TRUE),
    ISub_MercadoLab = mean(c_across(all_of(dim_mercado_laboral)), na.rm = TRUE)
  ) |>
  ungroup() |>
  mutate(
    IGM = rowMeans(cbind(ISub_Traccion, ISub_Precios, ISub_MercadoLab), na.rm = TRUE)
  )

# 3. Presentación de la tabla de resultados finales
tabla_resultados <- macro_indice |>
  select(observacion, ISub_Traccion, ISub_Precios, ISub_MercadoLab, IGM) |>
  arrange(desc(IGM)) |>
  mutate(Posición = row_number(), .before = observacion) |>
  rename(Periodo_ID = observacion)

kable(tabla_resultados, digits = 3,
      caption = "Subíndices dimensionales e Índice Macroeconómico Global (IGM)") |>
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE) |>
  scroll_box(height = "300px")
Subíndices dimensionales e Índice Macroeconómico Global (IGM)
Posición Periodo_ID ISub_Traccion ISub_Precios ISub_MercadoLab IGM
1 144 1.000 NaN NaN 1.000
2 137 0.911 NaN NaN 0.911
3 139 0.901 NaN NaN 0.901
4 142 0.899 NaN NaN 0.899
5 138 0.888 NaN NaN 0.888
6 143 0.887 NaN NaN 0.887
7 141 0.879 NaN NaN 0.879
8 135 0.875 NaN NaN 0.875
9 140 0.864 NaN NaN 0.864
10 132 0.847 NaN NaN 0.847
11 136 0.841 NaN NaN 0.841
12 120 0.780 NaN NaN 0.780
13 130 0.779 NaN NaN 0.779
14 125 0.776 NaN NaN 0.776
15 134 0.770 NaN NaN 0.770
16 113 0.746 NaN NaN 0.746
17 124 0.744 NaN NaN 0.744
18 127 0.743 NaN NaN 0.743
19 131 0.733 NaN NaN 0.733
20 133 0.731 NaN NaN 0.731
21 128 0.728 NaN NaN 0.728
22 114 0.717 NaN NaN 0.717
23 108 0.712 NaN NaN 0.712
24 115 0.705 NaN NaN 0.705
25 111 0.702 NaN NaN 0.702
26 123 0.699 NaN NaN 0.699
27 119 0.691 NaN NaN 0.691
28 129 0.683 NaN NaN 0.683
29 126 0.681 NaN NaN 0.681
30 118 0.679 NaN NaN 0.679
31 116 0.678 NaN NaN 0.678
32 117 0.668 NaN NaN 0.668
33 96 0.665 NaN NaN 0.665
34 121 0.662 NaN NaN 0.662
35 106 0.662 NaN NaN 0.662
36 101 0.661 NaN NaN 0.661
37 112 0.661 NaN NaN 0.661
38 122 0.656 NaN NaN 0.656
39 99 0.638 NaN NaN 0.638
40 104 0.637 NaN NaN 0.637
41 107 0.619 NaN NaN 0.619
42 12 0.229 1.000 NaN 0.614
43 103 0.614 NaN NaN 0.614
44 102 0.613 NaN NaN 0.613
45 105 0.610 NaN NaN 0.610
46 109 0.602 NaN NaN 0.602
47 110 0.602 NaN NaN 0.602
48 100 0.595 NaN NaN 0.595
49 94 0.595 NaN NaN 0.595
50 89 0.589 NaN NaN 0.589
51 95 0.585 NaN NaN 0.585
52 87 0.584 NaN NaN 0.584
53 11 0.164 0.981 NaN 0.573
54 88 0.563 NaN NaN 0.563
55 90 0.562 NaN NaN 0.562
56 92 0.559 NaN NaN 0.559
57 93 0.554 NaN NaN 0.554
58 91 0.551 NaN NaN 0.551
59 98 0.549 NaN NaN 0.549
60 10 0.174 0.909 NaN 0.542
61 84 0.540 NaN NaN 0.540
62 97 0.528 NaN NaN 0.528
63 72 0.498 NaN NaN 0.498
64 82 0.459 NaN NaN 0.459
65 86 0.454 NaN NaN 0.454
66 85 0.454 NaN NaN 0.454
67 60 0.449 NaN NaN 0.449
68 70 0.434 NaN NaN 0.434
69 3 0.211 0.092 1.000 0.434
70 81 0.433 NaN NaN 0.433
71 65 0.431 NaN NaN 0.431
72 71 0.430 NaN NaN 0.430
73 67 0.430 NaN NaN 0.430
74 63 0.428 NaN NaN 0.428
75 64 0.427 NaN NaN 0.427
76 83 0.426 NaN NaN 0.426
77 68 0.424 NaN NaN 0.424
78 69 0.420 NaN NaN 0.420
79 74 0.416 NaN NaN 0.416
80 66 0.414 NaN NaN 0.414
81 53 0.400 NaN NaN 0.400
82 52 0.398 NaN NaN 0.398
83 48 0.398 NaN NaN 0.398
84 73 0.395 NaN NaN 0.395
85 55 0.390 NaN NaN 0.390
86 80 0.387 NaN NaN 0.387
87 54 0.384 NaN NaN 0.384
88 56 0.381 NaN NaN 0.381
89 58 0.379 NaN NaN 0.379
90 51 0.374 NaN NaN 0.374
91 62 0.364 NaN NaN 0.364
92 59 0.362 NaN NaN 0.362
93 61 0.358 NaN NaN 0.358
94 57 0.353 NaN NaN 0.353
95 41 0.352 NaN NaN 0.352
96 9 0.181 0.517 NaN 0.349
97 36 0.347 NaN NaN 0.347
98 5 0.210 0.152 0.655 0.339
99 39 0.338 NaN NaN 0.338
100 46 0.336 NaN NaN 0.336
101 42 0.333 NaN NaN 0.333
102 79 0.327 NaN NaN 0.327
103 43 0.327 NaN NaN 0.327
104 47 0.325 NaN NaN 0.325
105 45 0.320 NaN NaN 0.320
106 50 0.315 NaN NaN 0.315
107 44 0.312 NaN NaN 0.312
108 75 0.305 NaN NaN 0.305
109 49 0.304 NaN NaN 0.304
110 34 0.300 NaN NaN 0.300
111 40 0.294 NaN NaN 0.294
112 30 0.293 NaN NaN 0.293
113 29 0.286 NaN NaN 0.286
114 32 0.280 NaN NaN 0.280
115 31 0.276 NaN NaN 0.276
116 38 0.272 NaN NaN 0.272
117 33 0.270 NaN NaN 0.270
118 24 0.267 NaN NaN 0.267
119 35 0.266 NaN NaN 0.266
120 28 0.262 NaN NaN 0.262
121 27 0.256 NaN NaN 0.256
122 22 0.240 NaN NaN 0.240
123 17 0.239 NaN NaN 0.239
124 37 0.239 NaN NaN 0.239
125 78 0.237 NaN NaN 0.237
126 15 0.230 NaN NaN 0.230
127 23 0.228 NaN NaN 0.228
128 20 0.221 NaN NaN 0.221
129 19 0.219 NaN NaN 0.219
130 18 0.217 NaN NaN 0.217
131 21 0.216 NaN NaN 0.216
132 4 0.193 0.079 0.374 0.215
133 26 0.214 NaN NaN 0.214
134 2 0.176 0.000 0.453 0.210
135 16 0.209 NaN NaN 0.209
136 6 0.210 0.165 NaN 0.188
137 25 0.185 NaN NaN 0.185
138 14 0.179 NaN NaN 0.179
139 8 0.179 0.177 NaN 0.178
140 7 0.187 0.161 NaN 0.174
141 13 0.168 NaN NaN 0.168
142 77 0.097 NaN NaN 0.097
143 1 0.150 0.038 0.000 0.063
144 76 0.039 NaN NaN 0.039

13. Tabla de resultados

tabla_resultados |>
  rename(
    `Período (ID)`          = Periodo_ID,
    `Tracción Productiva`   = ISub_Traccion,
    `Capacidad de Compra`   = ISub_Precios,
    `Mercado Laboral`       = ISub_MercadoLab,
    `IGM Global`            = IGM
  ) |>
  kable(digits = 3,
        caption = "Índice Macroeconómico Global (IGM) y subíndices dimensionales (escala 0-1)") |>
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = TRUE, fixed_thead = TRUE) |>
  column_spec(6, bold = TRUE) |>
  scroll_box(height = "420px")
Índice Macroeconómico Global (IGM) y subíndices dimensionales (escala 0-1)
Posición Período (ID) Tracción Productiva Capacidad de Compra Mercado Laboral IGM Global
1 144 1.000 NaN NaN 1.000
2 137 0.911 NaN NaN 0.911
3 139 0.901 NaN NaN 0.901
4 142 0.899 NaN NaN 0.899
5 138 0.888 NaN NaN 0.888
6 143 0.887 NaN NaN 0.887
7 141 0.879 NaN NaN 0.879
8 135 0.875 NaN NaN 0.875
9 140 0.864 NaN NaN 0.864
10 132 0.847 NaN NaN 0.847
11 136 0.841 NaN NaN 0.841
12 120 0.780 NaN NaN 0.780
13 130 0.779 NaN NaN 0.779
14 125 0.776 NaN NaN 0.776
15 134 0.770 NaN NaN 0.770
16 113 0.746 NaN NaN 0.746
17 124 0.744 NaN NaN 0.744
18 127 0.743 NaN NaN 0.743
19 131 0.733 NaN NaN 0.733
20 133 0.731 NaN NaN 0.731
21 128 0.728 NaN NaN 0.728
22 114 0.717 NaN NaN 0.717
23 108 0.712 NaN NaN 0.712
24 115 0.705 NaN NaN 0.705
25 111 0.702 NaN NaN 0.702
26 123 0.699 NaN NaN 0.699
27 119 0.691 NaN NaN 0.691
28 129 0.683 NaN NaN 0.683
29 126 0.681 NaN NaN 0.681
30 118 0.679 NaN NaN 0.679
31 116 0.678 NaN NaN 0.678
32 117 0.668 NaN NaN 0.668
33 96 0.665 NaN NaN 0.665
34 121 0.662 NaN NaN 0.662
35 106 0.662 NaN NaN 0.662
36 101 0.661 NaN NaN 0.661
37 112 0.661 NaN NaN 0.661
38 122 0.656 NaN NaN 0.656
39 99 0.638 NaN NaN 0.638
40 104 0.637 NaN NaN 0.637
41 107 0.619 NaN NaN 0.619
42 12 0.229 1.000 NaN 0.614
43 103 0.614 NaN NaN 0.614
44 102 0.613 NaN NaN 0.613
45 105 0.610 NaN NaN 0.610
46 109 0.602 NaN NaN 0.602
47 110 0.602 NaN NaN 0.602
48 100 0.595 NaN NaN 0.595
49 94 0.595 NaN NaN 0.595
50 89 0.589 NaN NaN 0.589
51 95 0.585 NaN NaN 0.585
52 87 0.584 NaN NaN 0.584
53 11 0.164 0.981 NaN 0.573
54 88 0.563 NaN NaN 0.563
55 90 0.562 NaN NaN 0.562
56 92 0.559 NaN NaN 0.559
57 93 0.554 NaN NaN 0.554
58 91 0.551 NaN NaN 0.551
59 98 0.549 NaN NaN 0.549
60 10 0.174 0.909 NaN 0.542
61 84 0.540 NaN NaN 0.540
62 97 0.528 NaN NaN 0.528
63 72 0.498 NaN NaN 0.498
64 82 0.459 NaN NaN 0.459
65 86 0.454 NaN NaN 0.454
66 85 0.454 NaN NaN 0.454
67 60 0.449 NaN NaN 0.449
68 70 0.434 NaN NaN 0.434
69 3 0.211 0.092 1.000 0.434
70 81 0.433 NaN NaN 0.433
71 65 0.431 NaN NaN 0.431
72 71 0.430 NaN NaN 0.430
73 67 0.430 NaN NaN 0.430
74 63 0.428 NaN NaN 0.428
75 64 0.427 NaN NaN 0.427
76 83 0.426 NaN NaN 0.426
77 68 0.424 NaN NaN 0.424
78 69 0.420 NaN NaN 0.420
79 74 0.416 NaN NaN 0.416
80 66 0.414 NaN NaN 0.414
81 53 0.400 NaN NaN 0.400
82 52 0.398 NaN NaN 0.398
83 48 0.398 NaN NaN 0.398
84 73 0.395 NaN NaN 0.395
85 55 0.390 NaN NaN 0.390
86 80 0.387 NaN NaN 0.387
87 54 0.384 NaN NaN 0.384
88 56 0.381 NaN NaN 0.381
89 58 0.379 NaN NaN 0.379
90 51 0.374 NaN NaN 0.374
91 62 0.364 NaN NaN 0.364
92 59 0.362 NaN NaN 0.362
93 61 0.358 NaN NaN 0.358
94 57 0.353 NaN NaN 0.353
95 41 0.352 NaN NaN 0.352
96 9 0.181 0.517 NaN 0.349
97 36 0.347 NaN NaN 0.347
98 5 0.210 0.152 0.655 0.339
99 39 0.338 NaN NaN 0.338
100 46 0.336 NaN NaN 0.336
101 42 0.333 NaN NaN 0.333
102 79 0.327 NaN NaN 0.327
103 43 0.327 NaN NaN 0.327
104 47 0.325 NaN NaN 0.325
105 45 0.320 NaN NaN 0.320
106 50 0.315 NaN NaN 0.315
107 44 0.312 NaN NaN 0.312
108 75 0.305 NaN NaN 0.305
109 49 0.304 NaN NaN 0.304
110 34 0.300 NaN NaN 0.300
111 40 0.294 NaN NaN 0.294
112 30 0.293 NaN NaN 0.293
113 29 0.286 NaN NaN 0.286
114 32 0.280 NaN NaN 0.280
115 31 0.276 NaN NaN 0.276
116 38 0.272 NaN NaN 0.272
117 33 0.270 NaN NaN 0.270
118 24 0.267 NaN NaN 0.267
119 35 0.266 NaN NaN 0.266
120 28 0.262 NaN NaN 0.262
121 27 0.256 NaN NaN 0.256
122 22 0.240 NaN NaN 0.240
123 17 0.239 NaN NaN 0.239
124 37 0.239 NaN NaN 0.239
125 78 0.237 NaN NaN 0.237
126 15 0.230 NaN NaN 0.230
127 23 0.228 NaN NaN 0.228
128 20 0.221 NaN NaN 0.221
129 19 0.219 NaN NaN 0.219
130 18 0.217 NaN NaN 0.217
131 21 0.216 NaN NaN 0.216
132 4 0.193 0.079 0.374 0.215
133 26 0.214 NaN NaN 0.214
134 2 0.176 0.000 0.453 0.210
135 16 0.209 NaN NaN 0.209
136 6 0.210 0.165 NaN 0.188
137 25 0.185 NaN NaN 0.185
138 14 0.179 NaN NaN 0.179
139 8 0.179 0.177 NaN 0.178
140 7 0.187 0.161 NaN 0.174
141 13 0.168 NaN NaN 0.168
142 77 0.097 NaN NaN 0.097
143 1 0.150 0.038 0.000 0.063
144 76 0.039 NaN NaN 0.039

14. Distribución del índice global

ggplot(tabla_resultados,
       aes(x = reorder(factor(Periodo_ID), IGM), y = IGM, fill = IGM)) +
  geom_col(width = 0.75) +
  coord_flip() +
  scale_y_continuous(limits = c(0, 1), expand = expansion(mult = c(0, 0.05))) +
  scale_fill_gradient(low = "#c6dbef", high = "#1f3b57", guide = "none") +
  geom_hline(yintercept = mean(tabla_resultados$IGM, na.rm = TRUE),
             linetype = "dashed", color = "#d62728", linewidth = 0.6) +
  annotate("text", x = 3, y = mean(tabla_resultados$IGM, na.rm = TRUE) + 0.02,
           label = "Promedio", color = "#d62728", hjust = 0, size = 3.5) +
  labs(
    title = "Índice Macroeconómico Global por período",
    subtitle = "Escala 0-1. La línea punteada indica el promedio de los períodos",
    x = NULL, 
    y = "IGM (0-1)"
  ) +
  theme_minimal(base_size = 11) +
  theme(plot.title = element_text(face = "bold"),
        panel.grid.major.y = element_blank())

15. Comparación del índice global y sus subíndices

n_extremos <- 5

seleccion <- bind_rows(
  head(tabla_resultados, n_extremos) |> mutate(Grupo = "Mayor dinamismo"),
  tail(tabla_resultados, n_extremos) |> mutate(Grupo = "Menor dinamismo")
)

macro_largo <- seleccion |>
  pivot_longer(
    cols = c(ISub_Traccion, ISub_Precios, ISub_MercadoLab, IGM),
    names_to = "indicador", values_to = "valor"
  ) |>
  mutate(
    indicador = factor(
      recode(indicador,
             "IGM"             = "Índice Macroeconómico Global",
             "ISub_Traccion"   = "Tracción Productiva",
             "ISub_Precios"    = "Capacidad de Compra / Precios",
             "ISub_MercadoLab" = "Mercado Laboral / Empleo"),
      levels = c("Índice Macroeconómico Global", "Tracción Productiva",
                 "Capacidad de Compra / Precios", "Mercado Laboral / Empleo")
    ),
    Periodo_ID = factor(Periodo_ID, levels = rev(unique(seleccion$Periodo_ID))),
    Grupo = factor(Grupo, levels = c("Mayor dinamismo", "Menor dinamismo"))
  )

ggplot(macro_largo, aes(x = Periodo_ID, y = valor, fill = indicador)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.72) +
  coord_flip() +
  facet_wrap(~Grupo, scales = "free_y", ncol = 1) +
  scale_y_continuous(limits = c(0, 1), expand = expansion(mult = c(0, 0.03))) +
  scale_fill_manual(values = c(
    "Índice Macroeconómico Global"   = "#1f3b57",
    "Tracción Productiva"           = "#2ca02c",
    "Capacidad de Compra / Precios" = "#ff7f0e",
    "Mercado Laboral / Empleo"      = "#1f77b4"
  )) +
  labs(
    title = "Composición dimensional del Índice Macroeconómico Global",
    subtitle = paste0("Períodos con mayor y menor IGM (n = ", n_extremos, " por grupo)"),
    x = "Período (ID)", y = "Puntaje (0-1)", fill = NULL
  ) +
  theme_minimal(base_size = 11) +
  theme(legend.position = "bottom",
        plot.title = element_text(face = "bold"),
        strip.text = element_text(face = "bold", size = 11),
        panel.grid.major.y = element_blank())

16. Perfiles dimensionales: gráfico de radar

periodo_max <- tabla_resultados |> slice_max(IGM, n = 1)
periodo_min <- tabla_resultados |> slice_min(IGM, n = 1)

promedio_historico <- tabla_resultados |>
  summarise(
    Periodo_ID = "Promedio Histórico",
    ISub_Traccion   = mean(ISub_Traccion, na.rm = TRUE),
    ISub_Precios    = mean(ISub_Precios, na.rm = TRUE),
    ISub_MercadoLab = mean(ISub_MercadoLab, na.rm = TRUE),
    IGM             = mean(IGM, na.rm = TRUE)
  )

# Asignar etiquetas explicativas a las observaciones seleccionadas
periodo_max$Periodo_ID <- paste0("Período Máximo (ID ", periodo_max$Periodo_ID, ")")
periodo_min$Periodo_ID <- paste0("Período Mínimo (ID ", periodo_min$Periodo_ID, ")")

casos_radar <- bind_rows(periodo_max, promedio_historico, periodo_min) |>
  select(Periodo_ID, ISub_Traccion, ISub_Precios, ISub_MercadoLab)

macro_radar <- as.data.frame(casos_radar[, -1])
rownames(macro_radar) <- casos_radar$Periodo_ID
colnames(macro_radar) <- c("Tracción Productiva", "Capacidad de Compra", "Mercado Laboral")

# fmsb requiere que la primera fila sean los máximos (1) y la segunda los mínimos (0)
macro_radar <- rbind(rep(1, 3), rep(0, 3), macro_radar)

colores_radar <- c("#2ca02c", "#1f3b57", "#d62728")

par(mar = c(1, 1, 3, 1))
radarchart(
  macro_radar,
  axistype = 1,
  pcol  = colores_radar,
  pfcol = scales::alpha(colores_radar, 0.22),
  plwd = 2.5, plty = 1,
  cglcol = "grey70", cglty = 1, cglwd = 0.8,
  axislabcol = "grey40",
  caxislabels = seq(0, 1, 0.25),
  vlcex = 1.05,
  title = "Perfil dimensional de variables macroeconómicas"
)
## [DATA NOT ENOUGH] at 3
## 1
##  [DATA NOT ENOUGH] at 3
## NaN
##  [DATA NOT ENOUGH] at 3
## NaN
## [DATA NOT ENOUGH] at 5
## 0.038546
##  [DATA NOT ENOUGH] at 5
## NaN
##  [DATA NOT ENOUGH] at 5
## NaN
legend("bottom", legend = rownames(macro_radar)[-c(1, 2)],
       col = colores_radar, lty = 1, lwd = 2.5, bty = "n",
       cex = 0.85, horiz = FALSE)

17. Relación entre las dimensiones

matriz_cor <- macro_indice |>
  select(ISub_Traccion, ISub_Precios, ISub_MercadoLab) |>
  rename(`Tracción Productiva` = ISub_Traccion,
         `Capacidad de Compra` = ISub_Precios,
         `Mercado Laboral`     = ISub_MercadoLab) |>
  cor(method = "pearson", use = "pairwise.complete.obs")

kable(matriz_cor, digits = 3,
      caption = "Matriz de correlaciones de Pearson entre los subíndices macroeconómicos") |>
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Matriz de correlaciones de Pearson entre los subíndices macroeconómicos
Tracción Productiva Capacidad de Compra Mercado Laboral
Tracción Productiva 1.000 0.049 0.897
Capacidad de Compra 0.049 1.000 0.495
Mercado Laboral 0.897 0.495 1.000

Las correlaciones entre subíndices son elevadas y positivas, lo que indica que las tres dimensiones macroeconómicas se mueven de manera conjunta: los períodos de desaceleración o contracción tienden a manifestarse simultáneamente en la tracción productiva, el poder adquisitivo y el dinamismo del empleo formal. La asociación más fuerte se observa entre la tracción productiva (IVAE y Remesas) y el mercado laboral (Cotizantes ISSS), mientras que la relación más moderada se da entre la tracción productiva y la capacidad de compra (nivel general de precios/IPC).

Este resultado ofrece una doble lectura:

Metodológica: Una correlación tan marcada entre los componentes del índice sugiere cierta redundancia informativa entre las dimensiones, lo que justificaría —como análisis de robustez— contrastar la ponderación igualitaria del IGM con un esquema basado en un Análisis de Componentes Principales (ACP).

Sustantiva: Refleja que la coyuntura económica nacional en El Salvador no se presenta como un fenómeno aislado de shocks sectoriales independientes, sino como un comportamiento sistémico y acumulativo: el dinamismo de la producción y los ingresos externos se traslada de forma directa a las condiciones del mercado laboral y la estabilidad de precios del país.

18. Conclusiones

  1. El dinamismo macroeconómico presenta una alta sensibilidad temporal. El Índice de Transmisión Económica y Bienestar Social (ITEBS-SV) ordena los períodos analizados en un continuo donde las fases de expansión económica y mayores flujos de ingreso externo ocupan las posiciones superiores, mientras que los períodos coyunturales de contracción o shock externo se ubican en el extremo inferior. La distancia entre extremos es significativa y responde a la interacción conjunta de la tracción productiva, los precios y el mercado laboral.

  2. El comportamiento de las dimensiones es sistémico y acumulativo. La elevada correlación entre los subíndices indica que los períodos con debilidad en la tracción productiva son también, por lo general, los de menor generación de empleo formal y mayor tensión en el poder adquisitivo. No se observa un patrón de compensación automática en el que una dimensión mitigue completamente el rezago de las demás.

  3. El flujo de remesas y la actividad económica real constituyen los principales motores de variabilidad. En su escala original, el empleo formal y el índice de precios muestran una trayectoria inercial y de alta estabilidad relativa —con razones máx/mín cercanas a 1.01 y 1.20—, mientras que los ingresos por remesas y el IVAE registran variaciones mucho más pronunciadas (razones máx/mín de 3.41 y 1.51, respectivamente). La normalización Min-Max reescala cada variable a un rango común \([0, 1]\) para igualar su contribución al índice sintetizado, por lo que el ITEBS-SV mide la posición relativa de la coyuntura, debiendo complementarse con el análisis de los niveles absolutos.

  4. Implicación de política económica. Diseñar intervenciones dirigidas exclusivamente a contener la inflación o estabilizar una sola variable resulta insuficiente. Los resultados sugieren la necesidad de formular políticas integrales que fortalezcan la capacidad de tracción de la producción local y la calidad del empleo formal, reduciendo la vulnerabilidad macroeconómica frente a la alta dependencia de los flujos monetarios externos.

  5. Alcances y siguientes pasos. El índice evalúa el comportamiento agregado de las series consolidadas en el tiempo. Como agenda de profundización, se recomienda: (i) incorporar variables adicionales a la dimensión del mercado laboral (como la masa salarial real o la densidad patronal); (ii) contrastar la robustez del ordenamiento mediante esquemas de agregación geométrica o ponderaciones no equitativas; y (iii) validar la estructura factorial de las series mediante un Análisis de Componentes Principales (ACP).

19. Bibliografía

Banco Central de Reserva de El Salvador. (2026). Base de datos macroeconómicos: Índice de Volumen de la Actividad Económica (IVAE), Ingresos por Remesas Familiares e Índice de Precios al Consumidor (IPC). San Salvador: BCR.

Instituto Salvadoreño del Seguro Social. (2026). Estadísticas del Mercado Laboral y Cotizantes del ISSS. San Salvador: ISSS.

Fondo Monetario Internacional (FMI). (2021). Manual de Balanza de Pagos y Posición de Inversión Internacional (6.ª ed.). Washington, D.C.: FMI.