EJEMPLO: CALCULO DE INDICADOR SINTETICO

Jeffry Bonilla

2025-05-24

Instalar API

#install.packages("wbstats")

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)

Ejemplo de calculo de indicador sintetico

Obtención de datos

#Indicadores_disponibles<-wb_indicators(lang = "es")
datos_ejemplo<-wb_data(indicator = "NY.GDP.MKTP.KD.ZG", 
                       country = "SLV",
                       start_date = 2010,
                       end_date = 2024,
                       lang = "es")

# Dimensión Económica
D_Economica <- wb_data(indicator = c("NY.GDP.MKTP.CD",
                                    "SL.UEM.TOTL.FE.ZS",
                                    "NE.IMP.GNFS.KD.ZG",
                                    "NE.EXP.GNFS.KD.ZG",
                                    "SL.TLF.TOTL.IN",
                                    "SL.TLF.ADVN.ZS"),
                      country = "SLV",
                      start_date = 2010,
                      end_date = 2023, 
                      lang = "es")

D_Social <- wb_data(indicator = c("SH.XPD.CHEX.GD.ZS","SE.XPD.TOTL.GD.ZS",
                                  "SE.XPD.TERT.ZS",
                                  "SI.POV.GINI",
                                  "EG.ELC.ACCS.ZS"),
                 country = "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))}
norm_inversa<-function(x){(max(x, na.rm = TRUE)-x)/(max(x, na.rm = TRUE)-min(x, na.rm = TRUE))}

# Seleccionando las variables con correlación positiva 
bateria_indicador_sintetico %>% 
  select(NY.GDP.MKTP.CD,
        NE.EXP.GNFS.KD.ZG,
        SL.TLF.TOTL.IN,
        SL.TLF.ADVN.ZS,
        EG.ELC.ACCS.ZS,
        SE.XPD.TERT.ZS,
        SE.XPD.TOTL.GD.ZS,
        SH.XPD.CHEX.GD.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(SL.UEM.TOTL.FE.ZS,
         NE.IMP.GNFS.KD.ZG,
         SI.POV.GINI) %>% 
  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("NY.GDP.MKTP.CD",
         "SL.UEM.TOTL.FE.ZS",
         "NE.IMP.GNFS.KD.ZG",
         "NE.EXP.GNFS.KD.ZG",
         "SL.TLF.TOTL.IN",
         "SL.TLF.ADVN.ZS")

Pesos_economicos <- ponderadores_critic(matriz_datos = w_D_economica)
Pesos_economicos$pesos_normalizados
##    NY.GDP.MKTP.CD SL.UEM.TOTL.FE.ZS NE.IMP.GNFS.KD.ZG NE.EXP.GNFS.KD.ZG 
##         0.1641692         0.1627351         0.1777019         0.1363492 
##    SL.TLF.TOTL.IN    SL.TLF.ADVN.ZS 
##         0.1651358         0.1939087
#Dimensión Social
w_D_social <- bateria_normalizada %>%
  select("SH.XPD.CHEX.GD.ZS",
         "SE.XPD.TOTL.GD.ZS",
         "SE.XPD.TERT.ZS",
         "SI.POV.GINI",
         "EG.ELC.ACCS.ZS")

Pesos_sociales <- ponderadores_critic(matriz_datos = w_D_social)
Pesos_sociales$pesos_normalizados
## SH.XPD.CHEX.GD.ZS SE.XPD.TOTL.GD.ZS    SE.XPD.TERT.ZS       SI.POV.GINI 
##         0.1721258         0.2614017         0.1678769         0.2081396 
##    EG.ELC.ACCS.ZS 
##         0.1904561

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()

## Multiplicación y obtención de la dimensión
Multi_E <- w_D_economica * W_E 
Multi_E <- Multi_E %>% 
  mutate(Dimension_Economica= round(rowSums (Multi_E[ , 1:6]),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()

## Multiplicación y obtención de la dimensión
Multi_S <- w_D_social * W_S 
Multi_S <- Multi_S %>% 
  mutate(Dimension_Social= round(rowSums (Multi_S[ , 1:5]),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.5411961           0.4588039
# 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()

## Multiplicación y obtención de la dimensión
Indicador_Sintetico <- Bateria_dimensiones * W_D
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.xlsx")