MAE118 | Ejercicio sobre 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:

  • X1 = Índice de alfabetización (alfabet)[+]
  • X2 = Incremento de la población (inc_pob)[+]
  • X3 = Esperanza de vida femenina (espvidaf)[+]
  • X4 = Mortalidad infantil (mortinf)[-]
  • X5 = Número promedio de hijos por mujer (fertilid)[+]
  • X6 = Tasa de natalidad (tasa_nat)[+]
  • X7 = Logaritmo del PIB (log_pib)[+]
  • X8 = Población urbana (urbana)[+]
  • X9 = Tasa de mortalidad (tasa_mor)[-]

Entre corchetes aparece la correlación teórica esperada entre la variable compleja y el indicador. Todas las variables se encuentran el archivo data_desarrollo.Rdata

Desarrollar:

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

  • ¿Qué variables quedan representadas en cada factor?

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

Importación de datos

load("C:/Users/johan/OneDrive/Documentos/A/MAE118/data_desarrollo.Rdata")

library(dplyr)
library(kableExtra)

# Extracción de los indicadores considerados

variables <- data_desarrollo %>% 
  mutate( pais = PAÍS,
          X1 = ALFABET,
          X2 = INC_POB,
          X3 = ESPVIDAF,
          X4 = MORTINF,
          X5 = FERTILID,
          X6 = TASA_NAT,
          X7 = LOG_PIB,
          X8 = URBANA,
          X9 = TASA_MOR) %>% 
  select(pais, X1, X2, X3, X4, X5, X6, X7, X8, X9)

# Remover valores NA

variables <- variables[complete.cases(variables),]

variables %>% head(10) %>% 
  kable(caption = "Variables consideradas para el indicador multivariado sintético sobre el desarrollo en las economías.",
        align = "c",
        digits = 2) %>%  
  kable_styling()
Variables consideradas para el indicador multivariado sintético sobre el desarrollo en las economías.
pais X1 X2 X3 X4 X5 X6 X7 X8 X9
Acerbaján 98 1.40 75 35.0 2.80 23 3.48 54 7
Afganistán 29 2.80 44 168.0 6.90 53 2.31 18 22
Alemania 99 0.36 79 6.5 1.47 11 4.24 85 11
Arabia Saudí 62 3.20 70 52.0 6.67 38 3.82 77 6
Argentina 95 1.30 75 25.6 2.80 20 3.53 86 9
Armenia 98 1.40 75 27.0 3.19 23 3.70 68 6
Australia 100 1.38 80 7.3 1.90 15 4.23 85 8
Austria 99 0.20 79 6.7 1.50 12 4.26 58 11
Bahrein 77 2.40 74 25.0 3.96 29 3.90 83 4
Bangladesh 35 2.40 53 106.0 4.70 35 2.31 16 11

Normalización de datos

Relación directa

A cada dato se le resta el minímo, permitiendo que se obtenga valores en la escala entre cero y uno.

norm_directa<-function(x){(x-min(x))/(max(x)-min(x))}

# Selección de variables con correlación positiva 

variables %>% select(X1, X2, X3, X5, X6, X7, X8) %>%
  apply(MARGIN = 2,FUN = norm_directa) %>% 
  as.data.frame() -> variables_corr_positiva

Relación directa

Al máximo se le resta cada dato para obtener valores en escala entre cero y uno.

norm_inversa<-function(x){(max(x)-x)/(max(x)-min(x))}

# Selección de variables con correlación negativa

variables %>% select(X4,X9) %>%
  apply(MARGIN = 2,FUN = norm_inversa) %>% 
  as.data.frame() -> variables_corr_negativa

Unión de las variables

variables_corr_positiva %>% 
  bind_cols(variables_corr_negativa) %>% 
  select(X1,X2,X3,X4,X5,X6,X7,X8,X9)->datos_desarrollo_normalizados

datos_desarrollo_normalizados %>% head(10) %>% 
  kable(caption = "Datos normalizados sobre el desarrollo",
        align = "c",
        digits = 4) %>%  
  kable_styling()
Datos normalizados sobre el desarrollo
X1 X2 X3 X4 X5 X6 X7 X8 X9
0.9756 0.3069 0.8205 0.8110 0.2177 0.3023 0.6089 0.5158 0.7727
0.1341 0.5596 0.0256 0.0000 0.8128 1.0000 0.0987 0.1368 0.0909
0.9878 0.1191 0.9231 0.9848 0.0247 0.0233 0.9446 0.8421 0.5909
0.5366 0.6318 0.6923 0.7073 0.7794 0.6512 0.7602 0.7579 0.8182
0.9390 0.2888 0.8205 0.8683 0.2177 0.2326 0.6331 0.8526 0.6818
0.9756 0.3069 0.8205 0.8598 0.2743 0.3023 0.7060 0.6632 0.8182
1.0000 0.3032 0.9487 0.9799 0.0871 0.1163 0.9369 0.8421 0.7273
0.9878 0.0903 0.9231 0.9835 0.0290 0.0465 0.9537 0.5579 0.5909
0.7195 0.4874 0.7949 0.8720 0.3861 0.4419 0.7923 0.8211 0.9091
0.2073 0.4874 0.2564 0.3780 0.4935 0.5814 0.0959 0.1158 0.5909

Matriz de correlación

library(PerformanceAnalytics)
chart.Correlation(as.matrix(datos_desarrollo_normalizados),histogram = TRUE,pch=12)

Se presenta la matriz de correlación mostrando en la diagonal principal un histograma con los kernels de densidad de probabilidad para cada una de las variables y por debajo se presenta un diagrama de dispersión donde se muestra una aproximación de la relación no lineal que pueda aparecer entre cada una de las variables.

Si no hay asteriscos , la variable no es estadísticamente significativa, mientras que una, dos y tres estrellas significan que la correspondiente variable es estadísticamente significativa para los niveles 10%, 5% y 1%, respectivamente. Para este ejercicio, las correlacciones son mayormente significativas al 1% por lo que existe una evidente correlación entre las variables propuestas en la batería de indicadores

Prueba de Kaiser–Meyer–Olkin (KMO)

library(rela)
KMO<-paf(as.matrix(datos_desarrollo_normalizados))$KMO
print(KMO)
## [1] 0.86467

KMO > 0.5 por lo que se puede considerar que el muestreo es adecuado para aplicar el análisis factorial

Prueba de Barlett

library(psych)
options(scipen = 99999)
Barlett<-cortest.bartlett(datos_desarrollo_normalizados)
print(Barlett)
## $chisq
## [1] 1544.4
## 
## $p.value
## [1] 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015692
## 
## $df
## [1] 36

H0: En Matriz de correlación muestral las variables son independientes entre ellas

H1: En Matriz de correlación muestral las variables no son independientes entre ellas

Rechazar H0 si:

\(\chi_{B}^2 \geq V.C.\)

Se rechaza H0 por lo que hay evidencia de correlación entre los indicadores propuestos

Análisis factorial

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

Rx<-cor(datos_desarrollo_normalizados)
PC<-princomp(x = datos_desarrollo_normalizados,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

Factores retenidos

¿Cuántos Componentes habría que retener?

  • Según el criterio de porcentaje acumulado de la varianza o de los 3/4 (Criterio del 75%): Implica retener las dimensiones que explican al menos el 75% de la varianza total en los datos originales. En este caso, las dos primeras dimensiones explican el 84.70% de la varianza.

  • Según el criterio de la raíz latente: Implica retener las dimensiones con eigenvalues (autovalores) iguales o mayores que uno. En este caso, las Dimensiones 1 y 2 tienen eigenvalues superiores a uno, por lo tanto, según este criterio, se deben de retener esas dos dimensiones.

fviz_eig(PC,
         choice = "eigenvalue",
         barcolor = "red",
         barfill = "red",
         addlabels = TRUE,
         )+labs(title = "Grafico de Sedimentacion (Grafico 1)",
                subtitle = "Usando princomp, con Autovalores")+
  xlab(label = "Componentes")+
  ylab(label = "Autovalores")+
  geom_hline(yintercept = 1)

  • Según el criterio de Elbow: Se ha identificado un punto de codo en el gráfico de sedimentación y este ocurre en la Dimensión 2, entonces según el criterio de Elbow, se debe de retener las dos primeras dimensiones. Esto significa que estas dos dimensiones capturan una cantidad significativa de la varianza en los datos

Variables 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
## X1  0.76  0.53 0.86 0.141 1.8
## X2 -0.98  0.05 0.96 0.042 1.0
## X3  0.62  0.76 0.96 0.036 1.9
## X4  0.66  0.71 0.94 0.059 2.0
## X5 -0.87 -0.40 0.92 0.079 1.4
## X6 -0.90 -0.40 0.97 0.034 1.4
## X7  0.65  0.58 0.75 0.246 2.0
## X8  0.42  0.73 0.71 0.294 1.6
## X9 -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

Se presenta una solución bastante representativa ya que se pierde muy poca información al sustituir la batería original de indicadores por los componentes estimados.

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="grey",
         number.cex = 0.75)

La variable latente 1 representa X1, X2, X5, X6, X7 mientras que la variable latente 2 representa X3, X4, X8, X9

Ponderadores de los factores extraídos

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

Peso de cada factor

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
X1 0.13 0.08
X2 0.21 0.00
X3 0.09 0.17
X4 0.10 0.15
X5 0.17 0.05
X6 0.18 0.05
X7 0.09 0.10
X8 0.04 0.16
X9 0.00 0.25