Análisis Factorial e Indicadores Sintéticos

Planteamiento del ejercicio

Se pretende construir un indicador multivariado sintético sobre el Desarrollo en las Economías. Los indicadores a considerar son*: el índice de alfabetización (alfabet)[+], el incremento de la población (inc_pob)[+], la esperanza de vida femenina (espvidaf)[+], la mortalidad infantil (mortinf)[-], el número promedio de hijos por mujer (fertilid)[+], la tasa de natalidad (tasa_nat)[+], el logaritmo del PIB (log_pib)[+], la población urbana (urbana)[+] y la tasa de mortalidad (tasa_mor)[-].

load("C:/Users/crist/Downloads/data_desarrollo.Rdata") 
head(data_desarrollo)
## # A tibble: 6 × 26
##   PAÍS    POBLAC DENSIDAD URBANA RELIG ESPVIDAF ESPVIDAM ALFABET INC_POB MORTINF
##   <chr>    <dbl>    <dbl>  <dbl> <chr>    <dbl>    <dbl>   <dbl>   <dbl>   <dbl>
## 1 Acerba…   7400     86       54 Musu…       75       67      98    1.4     35  
## 2 Afgani…  20500     25       18 Musu…       44       45      29    2.8    168  
## 3 Aleman…  81200    227       85 Prot…       79       73      99    0.36     6.5
## 4 Arabia…  18000      7.7     77 Musu…       70       66      62    3.2     52  
## 5 Argent…  33900     12       86 Cató…       75       68      95    1.3     25.6
## 6 Armenia   3700    126       68 Orto…       75       68      98    1.4     27  
## # ℹ 16 more variables: PIB_CAP <dbl>, REGIÓN <hvn_lbll>, CALORÍAS <dbl>,
## #   SIDA <dbl>, TASA_NAT <dbl>, TASA_MOR <dbl>, TASASIDA <dbl>, LOG_PIB <dbl>,
## #   LOGTSIDA <dbl>, NAC_DEF <dbl>, FERTILID <dbl>, LOG_POB <dbl>,
## #   CREGRANO <dbl>, ALFABMAS <dbl>, ALFABFEM <dbl>, CLIMA <hvn_lbll>

Normalización de datos

library(dplyr)
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))}
# Variables con correlación positiva 
data_desarrollo %>% 
  select(ALFABET,INC_POB, ESPVIDAF, FERTILID, TASA_NAT, LOG_PIB, URBANA) %>% 
  apply(MARGIN = 2,FUN = norm_directa) %>% as.data.frame()->variables_corr_positiva
# Variables con correlación negativa
data_desarrollo %>% 
  select(MORTINF,TASA_MOR) %>% 
  apply(MARGIN = 2,FUN = norm_inversa) %>% as.data.frame()->variables_corr_negativa
#Juntando y reordenando las variables
variables_corr_positiva %>% 
  bind_cols(variables_corr_negativa) %>% 
  select(ALFABET,INC_POB, ESPVIDAF, MORTINF, FERTILID, TASA_NAT, LOG_PIB, URBANA, TASA_MOR  )->datos_desarollo_normalizados
head(datos_desarollo_normalizados)
##    ALFABET   INC_POB ESPVIDAF   MORTINF FERTILID TASA_NAT  LOG_PIB   URBANA
## 1 97.78049 1.4541516 73.89744 0.8109756 2.611321 22.76744 2.563745 53.94737
## 2 28.78049 2.8541516 42.89744 0.0000000 6.711321 52.76744 1.398377 17.94737
## 3 98.78049 0.4141516 77.89744 0.9847561 1.281321 10.76744 3.330628 84.94737
## 4 61.78049 3.2541516 68.89744 0.7073171 6.481321 37.76744 2.909510 76.94737
## 5 94.78049 1.3541516 73.89744 0.8682927 2.611321 19.76744 2.619123 85.94737
## 6 97.78049 1.4541516 73.89744 0.8597561 3.001321 22.76744 2.785593 67.94737
##     TASA_MOR
## 1 0.77272727
## 2 0.09090909
## 3 0.59090909
## 4 0.81818182
## 5 0.68181818
## 6 0.81818182

Matriz de Correlación & Pruebas de Barlett y KMO

#Matriz de correlación
library(PerformanceAnalytics)
chart.Correlation(as.matrix(datos_desarollo_normalizados),histogram = TRUE,pch=12)

# El gráfico nos muestra que existe una fuerte correlación entre cada una de las variables en estudio.
#KMO
library(rela)
KMO<-paf(as.matrix(datos_desarollo_normalizados))$KMO
print(KMO)
## [1] 0.86467
# KMO es cercano a 1, por lo tanto podemos tener confianza en que los datos son adecuados para el análisis factorial.
#Prueba de Barlett
library(psych)
options(scipen = 99999)
Barlett<-cortest.bartlett(datos_desarollo_normalizados)
print(Barlett)
## $chisq
## [1] 1596.2
## 
## $p.value
## [1] 0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014916
## 
## $df
## [1] 36
# Se rechaza la H0, es decir, los datos no son independientes entre sí y por tanto es necesario el análisis factorial.

Análisis Factorial

1.1) Usando Análisis Factorial determine cuantos factores deberían retenerse.

library(FactoMineR)
library(factoextra)
library(kableExtra)

datos_desarollo_sin_na <- datos_desarollo_normalizados[complete.cases(datos_desarollo_normalizados), ]

Rx<-cor(datos_desarollo_sin_na)
PC<-princomp(x = datos_desarollo_sin_na,cor = TRUE,fix_sign = FALSE)
variables_pca<-get_pca_var(PC)
factoextra::get_eig(PC) %>% kable(caption="Resumen de PCA",
        align = "c",
        digits = 2) %>% 
  kable_material(html_font = "sans-serif") %>% 
  kable_styling(bootstrap_options = c("hover"))
Resumen de PCA
eigenvalue variance.percent cumulative.variance.percent
Dim.1 6.69 74.34 74.34
Dim.2 1.24 13.83 88.18
Dim.3 0.53 5.91 94.08
Dim.4 0.20 2.20 96.28
Dim.5 0.17 1.93 98.21
Dim.6 0.07 0.73 98.94
Dim.7 0.06 0.62 99.56
Dim.8 0.03 0.28 99.84
Dim.9 0.01 0.16 100.00
# El Porcentaje de Varianza Explicada. Depende del interés, retiene componentes que expliquen al menos tres cuartas partes (75%) de la varianza total, En este caso, al considerar las dos primeras dimensiones, logramos explicar un 88.18% de la varianza, cumpliendo así con este criterio.
fviz_eig(PC,
         choice = "eigenvalue",
         barcolor = "blue",
         barfill = "blue",
         addlabels = TRUE, 
       )+labs(title = "Grafico de Sedimentacion",subtitle = "Usando princomp, con Autovalores")+
  xlab(label = "Componentes")+
  ylab(label = "Autovalores")+geom_hline(yintercept = 1)

# El método del "codo" en el gráfico indica que deberíamos conservar la cantidad de componentes que se encuentran antes o en el punto de inflexión en la curva. En este caso este criterio nos sugiere retener las 2 primeras dimensiones, ya qie representan el punto de quiebre en el grafico.

1.2 ¿Qué variables quedan representadas en cada factor?

library(corrplot)
#Modelo de 2 Factores (Rotada)
numero_de_factores<-2
modelo_factores<-principal(r = Rx,
                             nfactors = numero_de_factores,
                             covar = FALSE,
                             rotate = "varimax")
modelo_factores
## Principal Components Analysis
## Call: principal(r = Rx, nfactors = numero_de_factores, rotate = "varimax", 
##     covar = FALSE)
## Standardized loadings (pattern matrix) based upon correlation matrix
##            RC1   RC2   h2    u2 com
## ALFABET   0.76  0.53 0.86 0.141 1.8
## INC_POB  -0.98  0.05 0.96 0.042 1.0
## ESPVIDAF  0.62  0.76 0.96 0.036 1.9
## MORTINF   0.66  0.71 0.94 0.059 2.0
## FERTILID -0.87 -0.40 0.92 0.079 1.4
## TASA_NAT -0.90 -0.40 0.97 0.034 1.4
## LOG_PIB   0.65  0.58 0.75 0.246 2.0
## URBANA    0.42  0.73 0.71 0.294 1.6
## TASA_MOR -0.02  0.93 0.87 0.135 1.0
## 
##                        RC1  RC2
## SS loadings           4.52 3.41
## Proportion Var        0.50 0.38
## Cumulative Var        0.50 0.88
## Proportion Explained  0.57 0.43
## Cumulative Proportion 0.57 1.00
## 
## Mean item complexity =  1.6
## Test of the hypothesis that 2 components are sufficient.
## 
## The root mean square of the residuals (RMSR) is  0.05 
## 
## Fit based upon off diagonal values = 1
# Existe una solución bastante representativa de la bateria de datos originales, lo que nos indica que se pierde muy poca información en el proceso.
correlaciones_modelo<-variables_pca$coord
rotacion<-varimax(correlaciones_modelo[,1:numero_de_factores])
correlaciones_modelo_rotada<-rotacion$loadings

corrplot(correlaciones_modelo_rotada[,1:numero_de_factores],
         is.corr = FALSE,
         method = "square",
         addCoef.col="yellow",
         number.cex = 0.75)

# Se extraen dos variables latentes en el análisis factorial. En la dimensión 1, se retienen las variables: alfabetismo, incidencia de pobreza, fertilidad, tasa de natalidad, y el logaritmo del PIB. En la dimensión 2, se retienen las variables: esperanza de vida, tasa de mortalidad infantil, población urbana y tasa de mortalidad general.
library(kableExtra)
cargas<-rotacion$loadings[1:9,1:numero_de_factores]
ponderadores<-prop.table(apply(cargas^2,MARGIN = 2,sum))
t(ponderadores) %>% kable(caption="Ponderadores de los Factores Extraídos",
        align = "c",
        digits = 2) %>% 
  kable_material(html_font = "sans-serif") %>% 
  kable_styling(bootstrap_options = c("striped", "hover"))
Ponderadores de los Factores Extraídos
Dim.1 Dim.2
0.57 0.43
# La Dimensión 1 explica aproximadamente el 57% de la varianza total de los datos. La Dimensión 2 explica aproximadamente el 43% de la varianza total de los datos.

1.3)Determine qué pesos deben asignarse a cada factor y a las variables dentro de cada uno de ellos.

contribuciones<-apply(cargas^2,MARGIN = 2,prop.table)
contribuciones %>% kable(caption="Contribución de las variables en los Factores",
        align = "c",
        digits = 2) %>% 
  kable_material(html_font = "sans-serif") %>% 
  kable_styling(bootstrap_options = c("striped", "hover"))
Contribución de las variables en los Factores
Dim.1 Dim.2
ALFABET 0.13 0.08
INC_POB 0.21 0.00
ESPVIDAF 0.09 0.17
MORTINF 0.10 0.15
FERTILID 0.17 0.05
TASA_NAT 0.18 0.05
LOG_PIB 0.09 0.10
URBANA 0.04 0.16
TASA_MOR 0.00 0.25