INDICADOR SINTETICO: DESIGUALDAD Y DESARROLLO ECONOMICO

NICOLE AGUILAR

2025-06-11

Librerias

library(wbstats)
library(dplyr)
library(tidyverse)
library(magrittr)
library(hablar)
library(ggplot2)
library(plotly)
library(TSstudio)
library(readxl)
library(readr)
library(writexl)
library(kableExtra)
library(openxlsx)
library(ineq)
library(purrr)

EL SALVADOR

Obtención de datos

# Dimensión Económica
D_Economica <- wb_data(indicator = c("SI.POV.GINI", #Índice de Gin
                                    "SI.DST.FRST.20", #Participación en el ingreso del 20% peor remunerado
                                    "SI.DST.05TH.20", #Participación en el ingreso del 20% mejor remunerado
                                    "NY.GDP.PCAP.PP.KD", #PIB per cápita, PPA($a precios internacionales cons
                                    "NY.GDP.PCAP.KD.ZG", #Crecimiento del PIB per cápita (% anual)
                                    "NY.GNS.ICTR.ZS", #Ahorro bruto (% del PIB)
                                    "FS.AST.PRVT.GD.ZS"), #Crédito interno al sector privado (% del PIB)
                      country = c("SLV"),
                      start_date = 2010,
                      end_date = 2023, 
                      lang = "es")

D_Social <- wb_data(indicator = c("SL.TLF.ADVN.ZS", #Fuerza laboral con educación avanzada (% del total)
                                  "EG.ELC.ACCS.ZS", #Acceso a la electricidad (% de la población)
                                  "HD.HCI.OVRL", #Índice de Capital Humano (escala de 0 a 1)
                                  "NY.ADJ.AEDU.GN.ZS", #Ahorro ajustado: gasto en educación (% del INB)
                                  "SL.UEM.TOTL.ZS"), #Desempleo, total (% de la fuerza laboral total)
                 country = c("SLV"), 
                 start_date = 2010,
                 end_date = 2023, 
                 lang = "es")

# Batería del indicador sintetico
bateria_indicador_sintetico<- D_Economica %>% merge(D_Social, by.x =  c("country","iso3c","iso2c","date"),by.y =c("country","iso3c","iso2c","date"), all.x = T ) 

Normalización de los datos

# funciones de normalizacion de Carlos Ademir Perez Alas.
norm_directa<-function(x){(x-min(x,na.rm = TRUE))/(max(x,na.rm = TRUE)-min(x, na.rm = TRUE))} #positiva
norm_inversa<-function(x){(max(x, na.rm = TRUE)-x)/(max(x, na.rm = TRUE)-min(x, na.rm = TRUE))} #negativa

# Seleccionando las variables con correlación positiva 
bateria_indicador_sintetico %>% 
  select(FS.AST.PRVT.GD.ZS, 
         NY.GDP.PCAP.PP.KD, 
         SI.DST.FRST.20, 
         NY.GDP.PCAP.KD.ZG,
         NY.GNS.ICTR.ZS, 
         NY.ADJ.AEDU.GN.ZS, 
         SL.TLF.ADVN.ZS, 
         HD.HCI.OVRL, 
         EG.ELC.ACCS.ZS) %>% 
  apply(MARGIN = 2,FUN = norm_directa) %>% 
  as.data.frame() -> variables_corr_positiva_h

# Seleccionando las variables con correlación negativa 
bateria_indicador_sintetico %>% 
  select(SI.POV.GINI, 
         SI.DST.05TH.20, 
         SL.UEM.TOTL.ZS) %>% 
  apply(MARGIN = 2,FUN = norm_inversa) %>% 
  as.data.frame() -> variables_corr_negativa_h

# Union de datos normalizados
bateria_normalizada<-bind_cols(variables_corr_positiva_h,variables_corr_negativa_h)

Imputación de datos

# Imputación de datos por la media
bateria_normalizada <-bateria_normalizada%>%
  mutate(across(everything(), ~ ifelse(is.na(.), round(mean(., na.rm = TRUE), 2), .)))

Calculo de las ponderaciones

Función

### Método CRITIC Funcion creada por Carlos Ademir Perez Alas, obtenida de https://rpubs.com/ca_ademir/critic_entropia
# Método CRITIC 
ponderadores_critic <- function(matriz_datos) {
  # Desviaciones de las variables
  sigma <- apply(X = matriz_datos, MARGIN = 2, sd)
  # Correlaciones entre las variables
  rho <- cor(matriz_datos)
  # Suma de las correlaciones excedentes
  cj <- apply(X = 1 - rho, MARGIN = 2, sum)
  # Cálculos de ponderadores
  pesos_brutos <- sigma * cj
  pesos_normalizados <- prop.table(pesos_brutos)
  # Salida de resultados
  resultados <- list(pesos_brutos = pesos_brutos,
                     pesos_normalizados = pesos_normalizados)
  return(resultados) 
}

Ponderaciones Variables

#Dimensión Económica
w_D_economica <- bateria_normalizada %>%
  select("SI.POV.GINI",
         "SI.DST.FRST.20",
         "SI.DST.05TH.20",
         "NY.GDP.PCAP.PP.KD",
         "NY.GDP.PCAP.KD.ZG",
         "NY.GNS.ICTR.ZS",
         "FS.AST.PRVT.GD.ZS")

Pesos_economicos <- ponderadores_critic(matriz_datos = w_D_economica)
Pesos_economicos$pesos_normalizados
##       SI.POV.GINI    SI.DST.FRST.20    SI.DST.05TH.20 NY.GDP.PCAP.PP.KD 
##         0.1084869         0.1897271         0.1107287         0.1117348 
## NY.GDP.PCAP.KD.ZG    NY.GNS.ICTR.ZS FS.AST.PRVT.GD.ZS 
##         0.1824812         0.1430002         0.1538411
#Dimensión Social
w_D_social <- bateria_normalizada %>%
  select("SL.TLF.ADVN.ZS",
         "EG.ELC.ACCS.ZS",
         "NY.ADJ.AEDU.GN.ZS",
         "SL.UEM.TOTL.ZS")

Pesos_sociales <- ponderadores_critic(matriz_datos = w_D_social)
Pesos_sociales$pesos_normalizados
##    SL.TLF.ADVN.ZS    EG.ELC.ACCS.ZS NY.ADJ.AEDU.GN.ZS    SL.UEM.TOTL.ZS 
##         0.3016527         0.2809699         0.2294359         0.1879414

Multiplicación de Ponderaciones por datos normalizados para obtener Dimensión

# Matriz pesos económicos
Pesos_E <- Pesos_economicos$pesos_normalizados %>% as.vector.data.frame()
n <- 14
W_E <- map2(Pesos_E,n,.f = rep) %>% as.data.frame() # Repetimos los pesos para cada año

### Repetimos cada fila de W_E para que coincida con w_D_economica
veces <- nrow(w_D_economica) / nrow(W_E)  # cuántas veces repetir (debería ser entero)
if (veces %% 1 != 0) {
  stop("No es posible repetir filas: el número de filas no es múltiplo exacto.")
}
W_E_expandido <- W_E[rep(1:nrow(W_E), each = veces), ]

## Multiplicación y obtención de la dimensión
Multi_E <- w_D_economica * W_E_expandido 
Multi_E <- Multi_E %>% 
  mutate(Dimension_Economica = round(rowSums(across(everything())), 2))
Multi_E <- Multi_E %>% select(Dimension_Economica)


# Matriz pesos sociales
Pesos_S <- Pesos_sociales$pesos_normalizados %>% as.vector.data.frame()
n <- 14
W_S <- map2(Pesos_S,n,.f = rep) %>% as.data.frame()

### Repetimos cada fila de W_S para que coincida con w_D_social
veces_s <- nrow(w_D_social) / nrow(W_S)
if (veces_s %% 1 != 0) {
  stop("No es posible repetir filas: el número de filas no es múltiplo exacto.")
}
W_S_expandido <- W_S[rep(1:nrow(W_S), each = veces_s), ]

## Multiplicación y obtención de la dimensión
Multi_S <- w_D_social * W_S_expandido 
Multi_S <- Multi_S %>% 
  mutate(Dimension_Social= round(rowSums (Multi_S[ , 1:4]),2))
Multi_S <- Multi_S %>% select(Dimension_Social)


#Union de dimensiones
Bateria_dimensiones <- cbind(Multi_E,Multi_S)

Ponderaciones de dimensiones

Pesos_dimensiones <- ponderadores_critic(matriz_datos = Bateria_dimensiones)
Pesos_dimensiones$pesos_normalizados
## Dimension_Economica    Dimension_Social 
##           0.6044705           0.3955295
# Matriz pesos sociales
Pesos_D <- Pesos_dimensiones$pesos_normalizados %>% as.vector.data.frame()
n <- 14
W_D <- map2(Pesos_D,n,.f = rep) %>% as.data.frame()

### Expandir pesos para que coincidan con las 42 filas
W_D_expandido <- W_D[rep(1:nrow(W_D), each = nrow(Bateria_dimensiones)/nrow(W_D)), ]

## Multiplicación y obtención de la dimensión
Indicador_Sintetico <- Bateria_dimensiones * W_D_expandido
Indicador_Sintetico <- Indicador_Sintetico %>% 
  mutate(Indicador_Sintetico_Calculado= round(rowSums (Indicador_Sintetico[ , 1:2]),2))
Indicador_Sintetico <-Indicador_Sintetico %>% select(Indicador_Sintetico_Calculado)


Tabla_completa <- D_Economica %>% select(date,country)
Tabla_completa<-bind_cols(Tabla_completa,Bateria_dimensiones,Indicador_Sintetico)

Exportar Tabla a Excel

write_xlsx(Tabla_completa,"Tabla de Indicador Sintetico El Salvador.xlsx")

NORTEAMERICA

Obtención de datos

# Dimensión Económica
D_Economica <- wb_data(indicator = c("SI.POV.GINI", #Índice de Gin
                                    "SI.DST.FRST.20", #Participación en el ingreso del 20% peor remunerado
                                    "SI.DST.05TH.20", #Participación en el ingreso del 20% mejor remunerado
                                    "NY.GDP.PCAP.PP.KD", #PIB per cápita, PPA($a precios internacionales cons
                                    "NY.GDP.PCAP.KD.ZG", #Crecimiento del PIB per cápita (% anual)
                                    "NY.GNS.ICTR.ZS", #Ahorro bruto (% del PIB)
                                    "FS.AST.PRVT.GD.ZS"), #Crédito interno al sector privado (% del PIB)
                      country = c("CAN", "USA", "MEX"),
                      start_date = 2010,
                      end_date = 2023, 
                      lang = "es")

D_Social <- wb_data(indicator = c("SL.TLF.ADVN.ZS", #Fuerza laboral con educación avanzada (% del total)
                                  "EG.ELC.ACCS.ZS", #Acceso a la electricidad (% de la población)
                                  "HD.HCI.OVRL", #Índice de Capital Humano (escala de 0 a 1)
                                  "NY.ADJ.AEDU.GN.ZS", #Ahorro ajustado: gasto en educación (% del INB)
                                  "SL.UEM.TOTL.ZS"), #Desempleo, total (% de la fuerza laboral total)
                 country = c("CAN", "USA", "MEX"),
                 start_date = 2010,
                 end_date = 2023, 
                 lang = "es")

# Batería del indicador sintetico
bateria_indicador_sintetico<- D_Economica %>% merge(D_Social, by.x =  c("country","iso3c","iso2c","date"),by.y =c("country","iso3c","iso2c","date"), all.x = T ) 

Normalización de los datos

# funciones de normalizacion de Carlos Ademir Perez Alas.
norm_directa<-function(x){(x-min(x,na.rm = TRUE))/(max(x,na.rm = TRUE)-min(x, na.rm = TRUE))} #positiva
norm_inversa<-function(x){(max(x, na.rm = TRUE)-x)/(max(x, na.rm = TRUE)-min(x, na.rm = TRUE))} #negativa

# Seleccionando las variables con correlación positiva 
bateria_indicador_sintetico %>% 
  select(FS.AST.PRVT.GD.ZS, 
         NY.GDP.PCAP.PP.KD, 
         SI.DST.FRST.20, 
         NY.GDP.PCAP.KD.ZG,
         NY.GNS.ICTR.ZS, 
         NY.ADJ.AEDU.GN.ZS, 
         SL.TLF.ADVN.ZS, 
         HD.HCI.OVRL, 
         EG.ELC.ACCS.ZS) %>% 
  apply(MARGIN = 2,FUN = norm_directa) %>% 
  as.data.frame() -> variables_corr_positiva_h

# Seleccionando las variables con correlación negativa 
bateria_indicador_sintetico %>% 
  select(SI.POV.GINI, 
         SI.DST.05TH.20, 
         SL.UEM.TOTL.ZS) %>% 
  apply(MARGIN = 2,FUN = norm_inversa) %>% 
  as.data.frame() -> variables_corr_negativa_h

# Union de datos normalizados
bateria_normalizada<-bind_cols(variables_corr_positiva_h,variables_corr_negativa_h)

Imputación de datos

# Imputación de datos por la media
bateria_normalizada <-bateria_normalizada%>%
  mutate(across(everything(), ~ ifelse(is.na(.), round(mean(., na.rm = TRUE), 2), .)))

Calculo de las ponderaciones

Función

### Método CRITIC Funcion creada por Carlos Ademir Perez Alas, obtenida de https://rpubs.com/ca_ademir/critic_entropia
# Método CRITIC 
ponderadores_critic <- function(matriz_datos) {
  # Desviaciones de las variables
  sigma <- apply(X = matriz_datos, MARGIN = 2, sd)
  # Correlaciones entre las variables
  rho <- cor(matriz_datos)
  # Suma de las correlaciones excedentes
  cj <- apply(X = 1 - rho, MARGIN = 2, sum)
  # Cálculos de ponderadores
  pesos_brutos <- sigma * cj
  pesos_normalizados <- prop.table(pesos_brutos)
  # Salida de resultados
  resultados <- list(pesos_brutos = pesos_brutos,
                     pesos_normalizados = pesos_normalizados)
  return(resultados) 
}

Ponderaciones Variables

#Dimensión Económica
w_D_economica <- bateria_normalizada %>%
  select("SI.POV.GINI",
         "SI.DST.FRST.20",
         "SI.DST.05TH.20",
         "NY.GDP.PCAP.PP.KD",
         "NY.GDP.PCAP.KD.ZG",
         "NY.GNS.ICTR.ZS",
         "FS.AST.PRVT.GD.ZS")

Pesos_economicos <- ponderadores_critic(matriz_datos = w_D_economica)
Pesos_economicos$pesos_normalizados
##       SI.POV.GINI    SI.DST.FRST.20    SI.DST.05TH.20 NY.GDP.PCAP.PP.KD 
##         0.1050505         0.1136711         0.1040450         0.1833562 
## NY.GDP.PCAP.KD.ZG    NY.GNS.ICTR.ZS FS.AST.PRVT.GD.ZS 
##         0.1362662         0.1554661         0.2021450
#Dimensión Social
w_D_social <- bateria_normalizada %>%
  select("SL.TLF.ADVN.ZS",
         "EG.ELC.ACCS.ZS",
         "NY.ADJ.AEDU.GN.ZS",
         "SL.UEM.TOTL.ZS")

Pesos_sociales <- ponderadores_critic(matriz_datos = w_D_social)
Pesos_sociales$pesos_normalizados
##    SL.TLF.ADVN.ZS    EG.ELC.ACCS.ZS NY.ADJ.AEDU.GN.ZS    SL.UEM.TOTL.ZS 
##         0.2180351         0.3659787         0.1887125         0.2272737

Multiplicación de Ponderaciones por datos normalizados para obtener Dimensión

# Matriz pesos económicos
Pesos_E <- Pesos_economicos$pesos_normalizados %>% as.vector.data.frame()
n <- 14
W_E <- map2(Pesos_E,n,.f = rep) %>% as.data.frame()

### Repetimos cada fila de W_E para que coincida con w_D_economica
veces <- nrow(w_D_economica) / nrow(W_E)  # cuántas veces repetir (debería ser entero)
if (veces %% 1 != 0) {
  stop("No es posible repetir filas: el número de filas no es múltiplo exacto.")
}
W_E_expandido <- W_E[rep(1:nrow(W_E), each = veces), ]

## Multiplicación y obtención de la dimensión
Multi_E <- w_D_economica * W_E_expandido 
Multi_E <- Multi_E %>% 
  mutate(Dimension_Economica = round(rowSums(across(everything())), 2))
Multi_E <- Multi_E %>% select(Dimension_Economica)


# Matriz pesos sociales
Pesos_S <- Pesos_sociales$pesos_normalizados %>% as.vector.data.frame()
n <- 14
W_S <- map2(Pesos_S,n,.f = rep) %>% as.data.frame()

### Repetimos cada fila de W_S para que coincida con w_D_social
veces_s <- nrow(w_D_social) / nrow(W_S)
if (veces_s %% 1 != 0) {
  stop("No es posible repetir filas: el número de filas no es múltiplo exacto.")
}
W_S_expandido <- W_S[rep(1:nrow(W_S), each = veces_s), ]

## Multiplicación y obtención de la dimensión
Multi_S <- w_D_social * W_S_expandido 
Multi_S <- Multi_S %>% 
  mutate(Dimension_Social= round(rowSums (Multi_S[ , 1:4]),2))
Multi_S <- Multi_S %>% select(Dimension_Social)


#Union de dimensiones
Bateria_dimensiones <- cbind(Multi_E,Multi_S)

Ponderaciones de dimensiones

Pesos_dimensiones <- ponderadores_critic(matriz_datos = Bateria_dimensiones)
Pesos_dimensiones$pesos_normalizados
## Dimension_Economica    Dimension_Social 
##           0.6690044           0.3309956
# Matriz pesos sociales
Pesos_D <- Pesos_dimensiones$pesos_normalizados %>% as.vector.data.frame()
n <- 14
W_D <- map2(Pesos_D,n,.f = rep) %>% as.data.frame()

### Expandir pesos para que coincidan con las 42 filas
W_D_expandido <- W_D[rep(1:nrow(W_D), each = nrow(Bateria_dimensiones)/nrow(W_D)), ]

## Multiplicación y obtención de la dimensión
Indicador_Sintetico <- Bateria_dimensiones * W_D_expandido
Indicador_Sintetico <- Indicador_Sintetico %>% 
  mutate(Indicador_Sintetico_Calculado= round(rowSums (Indicador_Sintetico[ , 1:2]),2))
Indicador_Sintetico <-Indicador_Sintetico %>% select(Indicador_Sintetico_Calculado)


Tabla_completa <- D_Economica %>% select(date,country)
Tabla_completa<-bind_cols(Tabla_completa,Bateria_dimensiones,Indicador_Sintetico)

CENTROAMERICA

Obtención de datos

# Dimensión Económica
D_Economica <- wb_data(indicator = c("SI.POV.GINI",
                                    "SI.DST.FRST.20",
                                    "SI.DST.05TH.20",
                                    "NY.GDP.PCAP.PP.KD",
                                    "NY.GDP.PCAP.KD.ZG",
                                    "NY.GNS.ICTR.ZS",
                                    "FS.AST.PRVT.GD.ZS"),
                      country = c("BLZ", "GTM", "HND", "NIC", "CRI", "PAN"),
                      start_date = 2010,
                      end_date = 2023, 
                      lang = "es")

D_Social <- wb_data(indicator = c("SL.TLF.ADVN.ZS",
                                  "EG.ELC.ACCS.ZS",
                                  "HD.HCI.OVRL",
                                  "NY.ADJ.AEDU.GN.ZS",
                                  "SL.UEM.TOTL.ZS"),
                 country = c("CAN", "USA", "MEX"), 
                 start_date = 2010,
                 end_date = 2023, 
                 lang = "es")

# Batería del indicador sintetico
bateria_indicador_sintetico<- D_Economica %>% merge(D_Social, by.x =  c("country","iso3c","iso2c","date"),by.y =c("country","iso3c","iso2c","date"), all.x = T ) 

Normalización de los datos

# funciones de normalizacion de Carlos Ademir Perez Alas.
norm_directa<-function(x){(x-min(x,na.rm = TRUE))/(max(x,na.rm = TRUE)-min(x, na.rm = TRUE))} #positiva
norm_inversa<-function(x){(max(x, na.rm = TRUE)-x)/(max(x, na.rm = TRUE)-min(x, na.rm = TRUE))} #negativa

# Seleccionando las variables con correlación positiva 
bateria_indicador_sintetico %>% 
  select(FS.AST.PRVT.GD.ZS, 
         NY.GDP.PCAP.PP.KD, 
         SI.DST.FRST.20, 
         NY.GDP.PCAP.KD.ZG,
         NY.GNS.ICTR.ZS, 
         NY.ADJ.AEDU.GN.ZS, 
         SL.TLF.ADVN.ZS, 
         HD.HCI.OVRL, 
         EG.ELC.ACCS.ZS) %>% 
  apply(MARGIN = 2,FUN = norm_directa) %>% 
  as.data.frame() -> variables_corr_positiva_h

# Seleccionando las variables con correlación negativa 
bateria_indicador_sintetico %>% 
  select(SI.POV.GINI, 
         SI.DST.05TH.20, 
         SL.UEM.TOTL.ZS) %>% 
  apply(MARGIN = 2,FUN = norm_inversa) %>% 
  as.data.frame() -> variables_corr_negativa_h

# Union de datos normalizados
bateria_normalizada<-bind_cols(variables_corr_positiva_h,variables_corr_negativa_h)

Imputación de datos

# Imputación de datos por la media
bateria_normalizada <-bateria_normalizada%>%
  mutate(across(everything(), ~ ifelse(is.na(.), round(mean(., na.rm = TRUE), 2), .)))

Calculo de las ponderaciones

Función

### Método CRITIC Funcion creada por Carlos Ademir Perez Alas, obtenida de https://rpubs.com/ca_ademir/critic_entropia
# Método CRITIC 
ponderadores_critic <- function(matriz_datos) {
  # Desviaciones de las variables
  sigma <- apply(X = matriz_datos, MARGIN = 2, sd)
  # Correlaciones entre las variables
  rho <- cor(matriz_datos)
  # Suma de las correlaciones excedentes
  cj <- apply(X = 1 - rho, MARGIN = 2, sum)
  # Cálculos de ponderadores
  pesos_brutos <- sigma * cj
  pesos_normalizados <- prop.table(pesos_brutos)
  # Salida de resultados
  resultados <- list(pesos_brutos = pesos_brutos,
                     pesos_normalizados = pesos_normalizados)
  return(resultados) 
}

Ponderaciones Variables

#Dimensión Económica
w_D_economica <- bateria_normalizada %>%
  select("SI.POV.GINI",
         "SI.DST.FRST.20",
         "SI.DST.05TH.20",
         "NY.GDP.PCAP.PP.KD",
         "NY.GDP.PCAP.KD.ZG",
         "NY.GNS.ICTR.ZS",
         "FS.AST.PRVT.GD.ZS")

Pesos_economicos <- ponderadores_critic(matriz_datos = w_D_economica)
Pesos_economicos$pesos_normalizados
##       SI.POV.GINI    SI.DST.FRST.20    SI.DST.05TH.20 NY.GDP.PCAP.PP.KD 
##        0.08318655        0.11191646        0.08458804        0.20550772 
## NY.GDP.PCAP.KD.ZG    NY.GNS.ICTR.ZS FS.AST.PRVT.GD.ZS 
##        0.12103189        0.20950260        0.18426674
#Dimensión Social
w_D_social <- bateria_normalizada %>%
  select("SL.TLF.ADVN.ZS",
         "EG.ELC.ACCS.ZS",
         "NY.ADJ.AEDU.GN.ZS",
         "SL.UEM.TOTL.ZS")

Pesos_sociales <- ponderadores_critic(matriz_datos = w_D_social)
Pesos_sociales$pesos_normalizados
##    SL.TLF.ADVN.ZS    EG.ELC.ACCS.ZS NY.ADJ.AEDU.GN.ZS    SL.UEM.TOTL.ZS 
##                NA                NA                NA                NA

Multiplicación de Ponderaciones por datos normalizados para obtener Dimensión

# Matriz pesos económicos
Pesos_E <- Pesos_economicos$pesos_normalizados %>% as.vector.data.frame()
n <- 14
W_E <- map2(Pesos_E,n,.f = rep) %>% as.data.frame()

### Repetimos cada fila de W_E para que coincida con w_D_economica
veces <- nrow(w_D_economica) / nrow(W_E)  # cuántas veces repetir (debería ser entero)
if (veces %% 1 != 0) {
  stop("No es posible repetir filas: el número de filas no es múltiplo exacto.")
}
W_E_expandido <- W_E[rep(1:nrow(W_E), each = veces), ]

## Multiplicación y obtención de la dimensión
Multi_E <- w_D_economica * W_E_expandido 
Multi_E <- Multi_E %>% 
  mutate(Dimension_Economica = round(rowSums(across(everything())), 2))
Multi_E <- Multi_E %>% select(Dimension_Economica)


# Matriz pesos sociales
Pesos_S <- Pesos_sociales$pesos_normalizados %>% as.vector.data.frame()
n <- 14
W_S <- map2(Pesos_S,n,.f = rep) %>% as.data.frame()

### Repetimos cada fila de W_S para que coincida con w_D_social
veces_s <- nrow(w_D_social) / nrow(W_S)
if (veces_s %% 1 != 0) {
  stop("No es posible repetir filas: el número de filas no es múltiplo exacto.")
}
W_S_expandido <- W_S[rep(1:nrow(W_S), each = veces_s), ]

## Multiplicación y obtención de la dimensión
Multi_S <- w_D_social * W_S_expandido 
Multi_S <- Multi_S %>% 
  mutate(Dimension_Social= round(rowSums (Multi_S[ , 1:4]),2))
Multi_S <- Multi_S %>% select(Dimension_Social)


#Union de dimensiones
Bateria_dimensiones <- cbind(Multi_E,Multi_S)

Ponderaciones de dimensiones

Pesos_dimensiones <- ponderadores_critic(matriz_datos = Bateria_dimensiones)
Pesos_dimensiones$pesos_normalizados
## Dimension_Economica    Dimension_Social 
##                  NA                  NA
# Matriz pesos sociales
Pesos_D <- Pesos_dimensiones$pesos_normalizados %>% as.vector.data.frame()
n <- 14
W_D <- map2(Pesos_D,n,.f = rep) %>% as.data.frame()

### Expandir pesos para que coincidan con las 42 filas
W_D_expandido <- W_D[rep(1:nrow(W_D), each = nrow(Bateria_dimensiones)/nrow(W_D)), ]

## Multiplicación y obtención de la dimensión
Indicador_Sintetico <- Bateria_dimensiones * W_D_expandido
Indicador_Sintetico <- Indicador_Sintetico %>% 
  mutate(Indicador_Sintetico_Calculado= round(rowSums (Indicador_Sintetico[ , 1:2]),2))
Indicador_Sintetico <-Indicador_Sintetico %>% select(Indicador_Sintetico_Calculado)


Tabla_completa <- D_Economica %>% select(date,country)
Tabla_completa<-bind_cols(Tabla_completa,Bateria_dimensiones,Indicador_Sintetico)

CARIBE

Obtención de datos

# Dimensión Económica
D_Economica <- wb_data(indicator = c("SI.POV.GINI", #Índice de Gin
                                    "SI.DST.FRST.20", #Participación en el ingreso del 20% peor remunerado
                                    "SI.DST.05TH.20", #Participación en el ingreso del 20% mejor remunerado
                                    "NY.GDP.PCAP.PP.KD", #PIB per cápita, PPA($a precios internacionales cons
                                    "NY.GDP.PCAP.KD.ZG", #Crecimiento del PIB per cápita (% anual)
                                    "NY.GNS.ICTR.ZS", #Ahorro bruto (% del PIB)
                                    "FS.AST.PRVT.GD.ZS"), #Crédito interno al sector privado (% del PIB)
                      country = c("HTI", "CUB", "JAM", "DOM"),
                      start_date = 2010,
                      end_date = 2023, 
                      lang = "es")

D_Social <- wb_data(indicator = c("SL.TLF.ADVN.ZS", #Fuerza laboral con educación avanzada (% del total)
                                  "EG.ELC.ACCS.ZS", #Acceso a la electricidad (% de la población)
                                  "HD.HCI.OVRL", #Índice de Capital Humano (escala de 0 a 1)
                                  "NY.ADJ.AEDU.GN.ZS", #Ahorro ajustado: gasto en educación (% del INB)
                                  "SL.UEM.TOTL.ZS"), #Desempleo, total (% de la fuerza laboral total)
                 country = c("HTI", "CUB", "JAM", "DOM"), 
                 start_date = 2010,
                 end_date = 2023, 
                 lang = "es")

# Batería del indicador sintetico
bateria_indicador_sintetico<- D_Economica %>% merge(D_Social, by.x =  c("country","iso3c","iso2c","date"),by.y =c("country","iso3c","iso2c","date"), all.x = T ) 

Normalización de los datos

# funciones de normalizacion de Carlos Ademir Perez Alas.
norm_directa<-function(x){(x-min(x,na.rm = TRUE))/(max(x,na.rm = TRUE)-min(x, na.rm = TRUE))} #positiva
norm_inversa<-function(x){(max(x, na.rm = TRUE)-x)/(max(x, na.rm = TRUE)-min(x, na.rm = TRUE))} #negativa

# Seleccionando las variables con correlación positiva 
bateria_indicador_sintetico %>% 
  select(FS.AST.PRVT.GD.ZS, #
         NY.GDP.PCAP.PP.KD, #
         SI.DST.FRST.20, #
         NY.GDP.PCAP.KD.ZG,# crec del pib pc
         NY.GNS.ICTR.ZS, #
         NY.ADJ.AEDU.GN.ZS, #
         SL.TLF.ADVN.ZS, #
         HD.HCI.OVRL, #
         EG.ELC.ACCS.ZS) %>% #
  apply(MARGIN = 2,FUN = norm_directa) %>% 
  as.data.frame() -> variables_corr_positiva_h

# Seleccionando las variables con correlación negativa 
bateria_indicador_sintetico %>% 
  select(SI.POV.GINI, #
         SI.DST.05TH.20, #
         SL.UEM.TOTL.ZS) %>% #
  apply(MARGIN = 2,FUN = norm_inversa) %>% 
  as.data.frame() -> variables_corr_negativa_h

# Union de datos normalizados
bateria_normalizada<-bind_cols(variables_corr_positiva_h,variables_corr_negativa_h)

Imputación de datos

# Imputación de datos por la media
bateria_normalizada <-bateria_normalizada%>%
  mutate(across(everything(), ~ ifelse(is.na(.), round(mean(., na.rm = TRUE), 2), .)))

Calculo de las ponderaciones

Función

### Método CRITIC Funcion creada por Carlos Ademir Perez Alas, obtenida de https://rpubs.com/ca_ademir/critic_entropia
# Método CRITIC 
ponderadores_critic <- function(matriz_datos) {
  # Desviaciones de las variables
  sigma <- apply(X = matriz_datos, MARGIN = 2, sd)
  # Correlaciones entre las variables
  rho <- cor(matriz_datos)
  # Suma de las correlaciones excedentes
  cj <- apply(X = 1 - rho, MARGIN = 2, sum)
  # Cálculos de ponderadores
  pesos_brutos <- sigma * cj
  pesos_normalizados <- prop.table(pesos_brutos)
  # Salida de resultados
  resultados <- list(pesos_brutos = pesos_brutos,
                     pesos_normalizados = pesos_normalizados)
  return(resultados) 
}

Ponderaciones Variables

#Dimensión Económica
w_D_economica <- bateria_normalizada %>%
  select("SI.POV.GINI",
         "SI.DST.FRST.20",
         "SI.DST.05TH.20",
         "NY.GDP.PCAP.PP.KD",
         "NY.GDP.PCAP.KD.ZG",
         "NY.GNS.ICTR.ZS",
         "FS.AST.PRVT.GD.ZS")

Pesos_economicos <- ponderadores_critic(matriz_datos = w_D_economica)
Pesos_economicos$pesos_normalizados
##       SI.POV.GINI    SI.DST.FRST.20    SI.DST.05TH.20 NY.GDP.PCAP.PP.KD 
##        0.10482629        0.09550845        0.10989457        0.20625012 
## NY.GDP.PCAP.KD.ZG    NY.GNS.ICTR.ZS FS.AST.PRVT.GD.ZS 
##        0.16544016        0.14185295        0.17622745
#Dimensión Social
w_D_social <- bateria_normalizada %>%
  select("SL.TLF.ADVN.ZS",
         "EG.ELC.ACCS.ZS",
         "NY.ADJ.AEDU.GN.ZS",
         "SL.UEM.TOTL.ZS")

Pesos_sociales <- ponderadores_critic(matriz_datos = w_D_social)
Pesos_sociales$pesos_normalizados
##    SL.TLF.ADVN.ZS    EG.ELC.ACCS.ZS NY.ADJ.AEDU.GN.ZS    SL.UEM.TOTL.ZS 
##         0.2387921         0.2581573         0.3127602         0.1902904

Multiplicación de Ponderaciones por datos normalizados para obtener Dimensión

# Matriz pesos económicos
Pesos_E <- Pesos_economicos$pesos_normalizados %>% as.vector.data.frame()
n <- 14
W_E <- map2(Pesos_E,n,.f = rep) %>% as.data.frame()

### Repetimos cada fila de W_E para que coincida con w_D_economica
veces <- nrow(w_D_economica) / nrow(W_E)  # cuántas veces repetir (debería ser entero)
if (veces %% 1 != 0) {
  stop("No es posible repetir filas: el número de filas no es múltiplo exacto.")
}
W_E_expandido <- W_E[rep(1:nrow(W_E), each = veces), ]

## Multiplicación y obtención de la dimensión
Multi_E <- w_D_economica * W_E_expandido 
Multi_E <- Multi_E %>% 
  mutate(Dimension_Economica = round(rowSums(across(everything())), 2))
Multi_E <- Multi_E %>% select(Dimension_Economica)


# Matriz pesos sociales
Pesos_S <- Pesos_sociales$pesos_normalizados %>% as.vector.data.frame()
n <- 14
W_S <- map2(Pesos_S,n,.f = rep) %>% as.data.frame()

### Repetimos cada fila de W_S para que coincida con w_D_social
veces_s <- nrow(w_D_social) / nrow(W_S)
if (veces_s %% 1 != 0) {
  stop("No es posible repetir filas: el número de filas no es múltiplo exacto.")
}
W_S_expandido <- W_S[rep(1:nrow(W_S), each = veces_s), ]

## Multiplicación y obtención de la dimensión
Multi_S <- w_D_social * W_S_expandido 
Multi_S <- Multi_S %>% 
  mutate(Dimension_Social= round(rowSums (Multi_S[ , 1:4]),2))
Multi_S <- Multi_S %>% select(Dimension_Social)


#Union de dimensiones
Bateria_dimensiones <- cbind(Multi_E,Multi_S)

Ponderaciones de dimensiones

Pesos_dimensiones <- ponderadores_critic(matriz_datos = Bateria_dimensiones)
Pesos_dimensiones$pesos_normalizados
## Dimension_Economica    Dimension_Social 
##           0.3593288           0.6406712
# Matriz pesos sociales
Pesos_D <- Pesos_dimensiones$pesos_normalizados %>% as.vector.data.frame()
n <- 14
W_D <- map2(Pesos_D,n,.f = rep) %>% as.data.frame()

### Expandir pesos para que coincidan con las 42 filas
W_D_expandido <- W_D[rep(1:nrow(W_D), each = nrow(Bateria_dimensiones)/nrow(W_D)), ]

## Multiplicación y obtención de la dimensión
Indicador_Sintetico <- Bateria_dimensiones * W_D_expandido
Indicador_Sintetico <- Indicador_Sintetico %>% 
  mutate(Indicador_Sintetico_Calculado= round(rowSums (Indicador_Sintetico[ , 1:2]),2))
Indicador_Sintetico <-Indicador_Sintetico %>% select(Indicador_Sintetico_Calculado)


Tabla_completa <- D_Economica %>% select(date,country)
Tabla_completa<-bind_cols(Tabla_completa,Bateria_dimensiones,Indicador_Sintetico)

SURAMERICA

Obtención de datos

datos_ejemplo<-wb_data(indicator = "SI.POV.GINI", 
                       country = c("BLZ", "GTM", "HND", "NIC", "CRI", "PAN"),
                       start_date = 2010,
                       end_date = 2023,
                       lang = "es")

# Dimensión Económica
D_Economica <- wb_data(indicator = c("SI.POV.GINI",
                                    "SI.DST.FRST.20",
                                    "SI.DST.05TH.20",
                                    "NY.GDP.PCAP.PP.KD",
                                    "NY.GDP.PCAP.KD.ZG",
                                    "NY.GNS.ICTR.ZS",
                                    "FS.AST.PRVT.GD.ZS"),
                      country = c("COL", "VEN", "PER", "CHL", "BOL", "ARG", "BRA"),
                      start_date = 2010,
                      end_date = 2023, 
                      lang = "es")

D_Social <- wb_data(indicator = c("SL.TLF.ADVN.ZS",
                                  "EG.ELC.ACCS.ZS",
                                  "HD.HCI.OVRL",
                                  "NY.ADJ.AEDU.GN.ZS",
                                  "SL.UEM.TOTL.ZS"),
                 country = c("COL", "VEN", "PER", "CHL", "BOL", "ARG", "BRA"), 
                 start_date = 2010,
                 end_date = 2023, 
                 lang = "es")

# Batería del indicador sintetico
bateria_indicador_sintetico<- D_Economica %>% merge(D_Social, by.x =  c("country","iso3c","iso2c","date"),by.y =c("country","iso3c","iso2c","date"), all.x = T ) 

Normalización de los datos

# funciones de normalizacion de Carlos Ademir Perez Alas.
norm_directa<-function(x){(x-min(x,na.rm = TRUE))/(max(x,na.rm = TRUE)-min(x, na.rm = TRUE))} #positiva
norm_inversa<-function(x){(max(x, na.rm = TRUE)-x)/(max(x, na.rm = TRUE)-min(x, na.rm = TRUE))} #negativa

# Seleccionando las variables con correlación positiva 
bateria_indicador_sintetico %>% 
  select(FS.AST.PRVT.GD.ZS, #
         NY.GDP.PCAP.PP.KD, #
         SI.DST.FRST.20, #
         NY.GDP.PCAP.KD.ZG,# crec del pib pc
         NY.GNS.ICTR.ZS, #
         NY.ADJ.AEDU.GN.ZS, #
         SL.TLF.ADVN.ZS, #
         HD.HCI.OVRL, #
         EG.ELC.ACCS.ZS) %>% #
  apply(MARGIN = 2,FUN = norm_directa) %>% 
  as.data.frame() -> variables_corr_positiva_h

# Seleccionando las variables con correlación negativa 
bateria_indicador_sintetico %>% 
  select(SI.POV.GINI, #
         SI.DST.05TH.20, #
         SL.UEM.TOTL.ZS) %>% #
  apply(MARGIN = 2,FUN = norm_inversa) %>% 
  as.data.frame() -> variables_corr_negativa_h

# Union de datos normalizados
bateria_normalizada<-bind_cols(variables_corr_positiva_h,variables_corr_negativa_h)

Imputación de datos

# Imputación de datos por la media
bateria_normalizada <-bateria_normalizada%>%
  mutate(across(everything(), ~ ifelse(is.na(.), round(mean(., na.rm = TRUE), 2), .)))

Calculo de las ponderaciones

Función

### Método CRITIC Funcion creada por Carlos Ademir Perez Alas, obtenida de https://rpubs.com/ca_ademir/critic_entropia
# Método CRITIC 
ponderadores_critic <- function(matriz_datos) {
  # Desviaciones de las variables
  sigma <- apply(X = matriz_datos, MARGIN = 2, sd)
  # Correlaciones entre las variables
  rho <- cor(matriz_datos)
  # Suma de las correlaciones excedentes
  cj <- apply(X = 1 - rho, MARGIN = 2, sum)
  # Cálculos de ponderadores
  pesos_brutos <- sigma * cj
  pesos_normalizados <- prop.table(pesos_brutos)
  # Salida de resultados
  resultados <- list(pesos_brutos = pesos_brutos,
                     pesos_normalizados = pesos_normalizados)
  return(resultados) 
}

Ponderaciones Variables

#Dimensión Económica
w_D_economica <- bateria_normalizada %>%
  select("SI.POV.GINI",
         "SI.DST.FRST.20",
         "SI.DST.05TH.20",
         "NY.GDP.PCAP.PP.KD",
         "NY.GDP.PCAP.KD.ZG",
         "NY.GNS.ICTR.ZS",
         "FS.AST.PRVT.GD.ZS")

Pesos_economicos <- ponderadores_critic(matriz_datos = w_D_economica)
Pesos_economicos$pesos_normalizados
##       SI.POV.GINI    SI.DST.FRST.20    SI.DST.05TH.20 NY.GDP.PCAP.PP.KD 
##         0.1335769         0.1139057         0.1438004         0.1879559 
## NY.GDP.PCAP.KD.ZG    NY.GNS.ICTR.ZS FS.AST.PRVT.GD.ZS 
##         0.1202925         0.1144728         0.1859957
#Dimensión Social
w_D_social <- bateria_normalizada %>%
  select("SL.TLF.ADVN.ZS",
         "EG.ELC.ACCS.ZS",
         "NY.ADJ.AEDU.GN.ZS",
         "SL.UEM.TOTL.ZS")

Pesos_sociales <- ponderadores_critic(matriz_datos = w_D_social)
Pesos_sociales$pesos_normalizados
##    SL.TLF.ADVN.ZS    EG.ELC.ACCS.ZS NY.ADJ.AEDU.GN.ZS    SL.UEM.TOTL.ZS 
##         0.2125059         0.3236604         0.2357883         0.2280454

Multiplicación de Ponderaciones por datos normalizados para obtener Dimensión

# Matriz pesos económicos
Pesos_E <- Pesos_economicos$pesos_normalizados %>% as.vector.data.frame()
n <- 14
W_E <- map2(Pesos_E,n,.f = rep) %>% as.data.frame()

### Repetimos cada fila de W_E para que coincida con w_D_economica
veces <- nrow(w_D_economica) / nrow(W_E)  # cuántas veces repetir (debería ser entero)
if (veces %% 1 != 0) {
  stop("No es posible repetir filas: el número de filas no es múltiplo exacto.")
}
W_E_expandido <- W_E[rep(1:nrow(W_E), each = veces), ]

## Multiplicación y obtención de la dimensión
Multi_E <- w_D_economica * W_E_expandido 
Multi_E <- Multi_E %>% 
  mutate(Dimension_Economica = round(rowSums(across(everything())), 2))
Multi_E <- Multi_E %>% select(Dimension_Economica)


# Matriz pesos sociales
Pesos_S <- Pesos_sociales$pesos_normalizados %>% as.vector.data.frame()
n <- 14
W_S <- map2(Pesos_S,n,.f = rep) %>% as.data.frame()

### Repetimos cada fila de W_S para que coincida con w_D_social
veces_s <- nrow(w_D_social) / nrow(W_S)
if (veces_s %% 1 != 0) {
  stop("No es posible repetir filas: el número de filas no es múltiplo exacto.")
}
W_S_expandido <- W_S[rep(1:nrow(W_S), each = veces_s), ]

## Multiplicación y obtención de la dimensión
Multi_S <- w_D_social * W_S_expandido 
Multi_S <- Multi_S %>% 
  mutate(Dimension_Social= round(rowSums (Multi_S[ , 1:4]),2))
Multi_S <- Multi_S %>% select(Dimension_Social)


#Union de dimensiones
Bateria_dimensiones <- cbind(Multi_E,Multi_S)

Ponderaciones de dimensiones

Pesos_dimensiones <- ponderadores_critic(matriz_datos = Bateria_dimensiones)
Pesos_dimensiones$pesos_normalizados
## Dimension_Economica    Dimension_Social 
##           0.5759569           0.4240431
# Matriz pesos sociales
Pesos_D <- Pesos_dimensiones$pesos_normalizados %>% as.vector.data.frame()
n <- 14
W_D <- map2(Pesos_D,n,.f = rep) %>% as.data.frame()

### Expandir pesos para que coincidan con las 42 filas
W_D_expandido <- W_D[rep(1:nrow(W_D), each = nrow(Bateria_dimensiones)/nrow(W_D)), ]

## Multiplicación y obtención de la dimensión
Indicador_Sintetico <- Bateria_dimensiones * W_D_expandido
Indicador_Sintetico <- Indicador_Sintetico %>% 
  mutate(Indicador_Sintetico_Calculado= round(rowSums (Indicador_Sintetico[ , 1:2]),2))
Indicador_Sintetico <-Indicador_Sintetico %>% select(Indicador_Sintetico_Calculado)


Tabla_completa <- D_Economica %>% select(date,country)
Tabla_completa<-bind_cols(Tabla_completa,Bateria_dimensiones,Indicador_Sintetico)