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()| 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_positivaRelació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_negativaUnió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()| 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"))| 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"))| 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"))| 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 |