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)[-].
## # 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.## [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
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"))| 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"))| 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"))| 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 |