En el archivo datos_prob_7_3.txt, se puede ver una lista de variables que caracterizan el grado de desarrollo de algunos países del mundo. Las variables son:
X1 = Tasa de mortalidad infantil por cada 1000 nacidos vivos, X2 = Porcentaje de mujeres en la población activa, X3 = Producto Nacional Bruto (PNB) per capita en 1995 (en $), X4 = Producción de electricidad (en millones de kw/h), X5 = Promedio de líneas telefónicas por cada 1000 habitantes, X6 = Consumo de agua per capita en m3 (de 1980 a 1995), X7 = Consumo de energía per capita en 1994, X8 = Emisión de CO2 per capita en 1992 (en Tm).
*Nota por el momento no se normalizarán las variables en el esquema 0-1, que se vio en el apartado introductorio.
## MATRIZ DE INFORMACIÓN: X
library(readr)
library(kableExtra)
#Importacion de la informacion
url_link<-"http://halweb.uc3m.es/esp/Personal/personas/agrane/libro/ficheros_datos/capitulo_7/datos_prob_7_3.txt" #web donde estan alojados los datos
mat_X<-read_table2(url_link,col_names = FALSE) #Read_table2 permite hacer la lectura desde el internet. #"col_names=FALSE" para que asigne los nombres de las columnas desde X1 hasta X8
##Para ver una muestra de la informacion
mat_X %>% head() %>%
kable(caption ="Matriz de información:" ,align = "c",digits = 6) %>%
kable_material(html_font = "sans-serif")
| X1 | X2 | X3 | X4 | X5 | X6 | X7 | X8 |
|---|---|---|---|---|---|---|---|
| 30 | 41 | 670 | 3903 | 12 | 94 | 341 | 1.2 |
| 124 | 46 | 410 | 955 | 6 | 57 | 89 | 0.5 |
| 95 | 48 | 370 | 6 | 5 | 26 | 20 | 0.1 |
| 90 | 43 | 680 | 435 | 8 | 20 | 331 | 1.6 |
| 112 | 41 | 100 | 1293 | 2 | 51 | 22 | 0.1 |
| 73 | 51 | 390 | 6115 | 4 | 35 | 93 | 0.2 |
## CÁLCULO DE V(X):
library(dplyr)
library(kableExtra)
#Crear la funcion "centrado o matriz de excesos". dirá si esta arriba o por debajo de la media. (restarle a cada variable su media)
centrado<-function(x){
x-mean(x)
}
Xcentrada<-apply(X = mat_X,MARGIN = 2,centrado) ##"margin 2" para que lo aplique a las columnas. "margin 1" para filas
## Apply le va a pasar la funcion "centrado" a cada columna
#Darle Formato
Xcentrada %>% head() %>%
kable(caption ="Matriz de Variables centradas:",
align = "c",
digits = 2) %>%
kable_material(html_font = "sans-serif")
| X1 | X2 | X3 | X4 | X5 | X6 | X7 | X8 |
|---|---|---|---|---|---|---|---|
| -49.67 | -0.67 | 303.89 | 1463.5 | 2.94 | -60.17 | 196.72 | 0.71 |
| 44.33 | 4.33 | 43.89 | -1484.5 | -3.06 | -97.17 | -55.28 | 0.01 |
| 15.33 | 6.33 | 3.89 | -2433.5 | -4.06 | -128.17 | -124.28 | -0.39 |
| 10.33 | 1.33 | 313.89 | -2004.5 | -1.06 | -134.17 | 186.72 | 1.11 |
| 32.33 | -0.67 | -266.11 | -1146.5 | -7.06 | -103.17 | -122.28 | -0.39 |
| -6.67 | 9.33 | 23.89 | 3675.5 | -5.06 | -119.17 | -51.28 | -0.29 |
#Todo lo anterior mostrará la misma matriz de informacion pero que se le ha aplicado el centrado (se le ha restado su media a c/u)
###
#CALCULO DE LA MATRIZ VARIANZA-COVARIANZA (Es simetrica)
n_obs<-nrow(mat_X) #para obtener la cantidad de observaciones
mat_V<-t(Xcentrada)%*%Xcentrada/(n_obs-1) #"t" transpuesta
mat_V %>% kable(caption ="Cálculo de V(X) forma manual:" ,
align = "c",
digits = 2) %>%
kable_material(html_font = "sans-serif") %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| X1 | X2 | X3 | X4 | X5 | X6 | X7 | X8 | |
|---|---|---|---|---|---|---|---|---|
| X1 | 716.12 | 45.06 | -2689.61 | -16082.06 | -121.63 | -1019.06 | -1844.37 | -5.15 |
| X2 | 45.06 | 46.94 | -144.31 | 2756.71 | -24.63 | -938.41 | -205.25 | -0.42 |
| X3 | -2689.61 | -144.31 | 36389.87 | 123889.71 | 740.82 | 838.33 | 17499.38 | 73.48 |
| X4 | -16082.06 | 2756.71 | 123889.71 | 5736372.38 | 3078.97 | 6672.44 | 140343.50 | 412.79 |
| X5 | -121.63 | -24.63 | 740.82 | 3078.97 | 51.47 | 405.58 | 565.22 | 1.59 |
| X6 | -1019.06 | -938.41 | 838.33 | 6672.44 | 405.58 | 26579.56 | 3149.77 | -2.96 |
| X7 | -1844.37 | -205.25 | 17499.38 | 140343.50 | 565.22 | 3149.77 | 16879.39 | 64.51 |
| X8 | -5.15 | -0.42 | 73.48 | 412.79 | 1.59 | -2.96 | 64.51 | 0.28 |
#en la diagonal principal aparecen las varianzas de cada una de los indicadores(variables originales) y los elementos que se encuentran por arriba y por debajo de la diagonal principal se encuentran las covarianzas.
library(dplyr)
library(kableExtra)
cov(mat_X) %>%
kable(caption="Cálculo de V(X) a través de R base",
align = "c",
digits = 2) %>%
kable_material(html_font = "sans-serif") %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| X1 | X2 | X3 | X4 | X5 | X6 | X7 | X8 | |
|---|---|---|---|---|---|---|---|---|
| X1 | 716.12 | 45.06 | -2689.61 | -16082.06 | -121.63 | -1019.06 | -1844.37 | -5.15 |
| X2 | 45.06 | 46.94 | -144.31 | 2756.71 | -24.63 | -938.41 | -205.25 | -0.42 |
| X3 | -2689.61 | -144.31 | 36389.87 | 123889.71 | 740.82 | 838.33 | 17499.38 | 73.48 |
| X4 | -16082.06 | 2756.71 | 123889.71 | 5736372.38 | 3078.97 | 6672.44 | 140343.50 | 412.79 |
| X5 | -121.63 | -24.63 | 740.82 | 3078.97 | 51.47 | 405.58 | 565.22 | 1.59 |
| X6 | -1019.06 | -938.41 | 838.33 | 6672.44 | 405.58 | 26579.56 | 3149.77 | -2.96 |
| X7 | -1844.37 | -205.25 | 17499.38 | 140343.50 | 565.22 | 3149.77 | 16879.39 | 64.51 |
| X8 | -5.15 | -0.42 | 73.48 | 412.79 | 1.59 | -2.96 | 64.51 | 0.28 |
Es la version estandarizada de la matriz de varianza-covarianza
#Partimos de la matriz de informacion (mat_X)
Zx<-scale(x = mat_X,center =TRUE) #comando "scale" para estandarizar. ese comando aplicará la normalizacion a todas las columnas del dataframe
#A cada dato se le resta su media y se ha dividido por la desviacion estandar (de cada columna)
#Para presentar una seccion de la matriz estandarizacion
Zx %>% head() %>%
kable(caption ="Matriz de Variables Estandarizadas:",
align = "c",
digits = 2) %>%
kable_material(html_font = "sans-serif")
| X1 | X2 | X3 | X4 | X5 | X6 | X7 | X8 |
|---|---|---|---|---|---|---|---|
| -1.86 | -0.10 | 1.59 | 0.61 | 0.41 | -0.37 | 1.51 | 1.34 |
| 1.66 | 0.63 | 0.23 | -0.62 | -0.43 | -0.60 | -0.43 | 0.02 |
| 0.57 | 0.92 | 0.02 | -1.02 | -0.57 | -0.79 | -0.96 | -0.73 |
| 0.39 | 0.19 | 1.65 | -0.84 | -0.15 | -0.82 | 1.44 | 2.09 |
| 1.21 | -0.10 | -1.39 | -0.48 | -0.98 | -0.63 | -0.94 | -0.73 |
| -0.25 | 1.36 | 0.13 | 1.53 | -0.70 | -0.73 | -0.39 | -0.54 |
##
#CALCULO DE LA MATRIZ DE CORRELACION
n_obs<-nrow(mat_X) #calcula el numero de observaciones
#calculo de la matriz de correlacion
mat_R<-t(Zx)%*%Zx/(n_obs-1)
mat_R %>% kable(caption ="Cálculo de R(X) forma manual:" ,
align = "c",
digits = 2) %>%
kable_material(html_font = "sans-serif") %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| X1 | X2 | X3 | X4 | X5 | X6 | X7 | X8 | |
|---|---|---|---|---|---|---|---|---|
| X1 | 1.00 | 0.25 | -0.53 | -0.25 | -0.63 | -0.23 | -0.53 | -0.36 |
| X2 | 0.25 | 1.00 | -0.11 | 0.17 | -0.50 | -0.84 | -0.23 | -0.12 |
| X3 | -0.53 | -0.11 | 1.00 | 0.27 | 0.54 | 0.03 | 0.71 | 0.73 |
| X4 | -0.25 | 0.17 | 0.27 | 1.00 | 0.18 | 0.02 | 0.45 | 0.32 |
| X5 | -0.63 | -0.50 | 0.54 | 0.18 | 1.00 | 0.35 | 0.61 | 0.42 |
| X6 | -0.23 | -0.84 | 0.03 | 0.02 | 0.35 | 1.00 | 0.15 | -0.03 |
| X7 | -0.53 | -0.23 | 0.71 | 0.45 | 0.61 | 0.15 | 1.00 | 0.93 |
| X8 | -0.36 | -0.12 | 0.73 | 0.32 | 0.42 | -0.03 | 0.93 | 1.00 |
#por arriba y por debajo de la diagonal principal tenemos los coeficientes de correlacion entre los distintos pares de variables.
#Es simetrico porque el coeficiente de correlacion de Pearson de X1 con X2 es el mismo que X2 con X1.
library(dplyr)
library(kableExtra)
cor(mat_X) %>%
kable(caption="Cálculo de R(X) a través de R base",
align = "c",
digits = 2) %>%
kable_material(html_font = "sans-serif") %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| X1 | X2 | X3 | X4 | X5 | X6 | X7 | X8 | |
|---|---|---|---|---|---|---|---|---|
| X1 | 1.00 | 0.25 | -0.53 | -0.25 | -0.63 | -0.23 | -0.53 | -0.36 |
| X2 | 0.25 | 1.00 | -0.11 | 0.17 | -0.50 | -0.84 | -0.23 | -0.12 |
| X3 | -0.53 | -0.11 | 1.00 | 0.27 | 0.54 | 0.03 | 0.71 | 0.73 |
| X4 | -0.25 | 0.17 | 0.27 | 1.00 | 0.18 | 0.02 | 0.45 | 0.32 |
| X5 | -0.63 | -0.50 | 0.54 | 0.18 | 1.00 | 0.35 | 0.61 | 0.42 |
| X6 | -0.23 | -0.84 | 0.03 | 0.02 | 0.35 | 1.00 | 0.15 | -0.03 |
| X7 | -0.53 | -0.23 | 0.71 | 0.45 | 0.61 | 0.15 | 1.00 | 0.93 |
| X8 | -0.36 | -0.12 | 0.73 | 0.32 | 0.42 | -0.03 | 0.93 | 1.00 |
Pueden ser especialmente útiles en la presentación de reportes, además de proveer una vista rápida de algunas características propias de la correlación entre las variables.
Podremos obtener algun tipo de informacion adicional que nos puede ser de interes al momento de verificar los supuestos del analisis de componentes principales.
Version grafica de la matriz de correlacion
library(PerformanceAnalytics)
chart.Correlation(as.matrix(mat_X),histogram = TRUE,pch=12) #"as.matrix" porque lo que tenemos es un dataframe entonces lo sometemos a esa transformacion como matriz. "pch=12" hace referencia al tamaño de separacion de los puntos.
# Diferencias respecto a la version -en la diag ppal aparece los
histogramas de c/u de las variables en vez de los 1. Puede darnos la
idea de la distrubucion que tiene c/u de las variables que estamos
utilizando -en la parte triangular superior aparecen las magnitudes de
los coeficientes de correlacion.. Los * indica que se ha realizado un
prueba de hipotesis y se ha verificado el ceofc de correlacion es
significativo al 5,10 o 1%. -si solo tiene un * indica que es
significativo al 10%. se rechaza la Hip Nula que ese coefciente de
correlacion a nivel poblacion sea Cero con un error tipo 2 del 10%,
quiere decir que al 10% podemos asegurarnos que de cada 100 veces que se
haga el experimento no se rechazaria la Hip nula siendo verdadero solo
en el 10% de los casos. -los dos ** indica significancia al 95% -los 3
*** indicaria significaria al mas de 1% -en la triangular inferior
aparece los diagramas de dispersion, da una idea de que tan lineal es la
relacion entre las parejas de variables. EJM: es poco lineal la relacion
que existe entre X1 y X2
library(corrplot)
library(grDevices)
library(Hmisc) #en esta libreria esta rcorr
Mat_R<-rcorr(as.matrix(mat_X)) #La matriz de correlacion al calcularla de esta manera Mat_R no guarda sololamente la matriz de correlacion sino tambien los valores de P Value que son los que generan los asteriscos*
corrplot(Mat_R$r,
p.mat = Mat_R$r,
type="upper",
tl.col="black",
tl.srt = 20,
pch.col = "blue",
insig = "p-value",
sig.level = -1,
col = terrain.colors(100))
CALCULO “MANUAL” DE LOS COMPONENTES calculo “manual” de los autovalores
Planteamos la extraccion manual de los componentes que se reduce a la descomposicion de la matriz de correlacion en autovalores y autovectores
-autovalores =raices caracteristicas = eigen valores= valores propios -autovectores= vectores propios= vectores caracteristicos= autovectores=eigen vectores
Siguiendo el ejemplo de los datos de “Desarrollo”, se encontraran todos los componentes de la batería de indicadores (dataframe):
library(kableExtra)
library(dplyr)
library(Hmisc)
#Calculo de la matriz de correlacion
Rx<-mat_X %>% as.matrix() %>% rcorr()
#Si usamos la libreria "Hmisc" y el comando "rcorr", en la salida se debe invocar o agregargle Rx$r para llamar especificamente la matriz de correlacion. Si se hace de las otras formas, directamente queda guardada solamente el objeto de matriz de correlacion
Rx$r %>% kable(caption="Matriz R(X)- matriz de correlacion",
align = "c",
digits = 2) %>%
kable_material(html_font = "sans-serif") %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| X1 | X2 | X3 | X4 | X5 | X6 | X7 | X8 | |
|---|---|---|---|---|---|---|---|---|
| X1 | 1.00 | 0.25 | -0.53 | -0.25 | -0.63 | -0.23 | -0.53 | -0.36 |
| X2 | 0.25 | 1.00 | -0.11 | 0.17 | -0.50 | -0.84 | -0.23 | -0.12 |
| X3 | -0.53 | -0.11 | 1.00 | 0.27 | 0.54 | 0.03 | 0.71 | 0.73 |
| X4 | -0.25 | 0.17 | 0.27 | 1.00 | 0.18 | 0.02 | 0.45 | 0.32 |
| X5 | -0.63 | -0.50 | 0.54 | 0.18 | 1.00 | 0.35 | 0.61 | 0.42 |
| X6 | -0.23 | -0.84 | 0.03 | 0.02 | 0.35 | 1.00 | 0.15 | -0.03 |
| X7 | -0.53 | -0.23 | 0.71 | 0.45 | 0.61 | 0.15 | 1.00 | 0.93 |
| X8 | -0.36 | -0.12 | 0.73 | 0.32 | 0.42 | -0.03 | 0.93 | 1.00 |
Si se utiliza esta libreria rcorr, dentro del objeto tambien se genera una matriz de los P Value que son los que garantizan verificar la significancia
Rx$P %>% kable(caption="p-values de R(X)",
align = "c",
digits = 2) %>%
kable_classic_2(html_font = "sans-serif") %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| X1 | X2 | X3 | X4 | X5 | X6 | X7 | X8 | |
|---|---|---|---|---|---|---|---|---|
| X1 | NA | 0.33 | 0.02 | 0.32 | 0.00 | 0.35 | 0.02 | 0.14 |
| X2 | 0.33 | NA | 0.66 | 0.51 | 0.03 | 0.00 | 0.36 | 0.65 |
| X3 | 0.02 | 0.66 | NA | 0.28 | 0.02 | 0.92 | 0.00 | 0.00 |
| X4 | 0.32 | 0.51 | 0.28 | NA | 0.48 | 0.95 | 0.06 | 0.19 |
| X5 | 0.00 | 0.03 | 0.02 | 0.48 | NA | 0.16 | 0.01 | 0.08 |
| X6 | 0.35 | 0.00 | 0.92 | 0.95 | 0.16 | NA | 0.56 | 0.89 |
| X7 | 0.02 | 0.36 | 0.00 | 0.06 | 0.01 | 0.56 | NA | 0.00 |
| X8 | 0.14 | 0.65 | 0.00 | 0.19 | 0.08 | 0.89 | 0.00 | NA |
DESCOMPOSION DE AUTOVALORES
library(stargazer)
descomposicion<-eigen(Rx$r)
#se hace una transpuesta porque normalmente lo da como un vector columna
#de la descomposicion se invocan a los Values
t(descomposicion$values) %>% kable(caption="Autovalores de R(X)",
align = "c",
digits = 2) %>%
kable_classic_2(html_font = "sans-serif") %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| 3.75 | 1.93 | 0.84 | 0.72 | 0.34 | 0.31 | 0.1 | 0.01 |
#como es una matriz real simetrica todos sus autovalores son positivos
# siempre habra tantos autovalores como sea la dimension de la matriz.
#Siempre aparecen ordenados desde el mas alto hasta el mas pequeño
#los autovales siempre van a sumer la misma cantidad que la slineacion de la matriz (debe ser 8 en este caso)
DESCOMPOSION DE AUTOVECTORES
# para cada uno de los autovalores pordemos obtener sus autovectores.
#del mismo obejto "descomposion" se invocan los autovectores.
descomposicion$vectors %>% kable(caption="Autovectores de R(X)",
align = "c",
digits = 2) %>%
kable_classic_2(html_font = "sans-serif") %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| -0.37 | -0.05 | -0.03 | 0.71 | -0.42 | 0.41 | 0.12 | 0.06 |
| -0.22 | -0.61 | 0.05 | -0.24 | 0.05 | 0.01 | 0.70 | -0.15 |
| 0.41 | -0.20 | -0.27 | -0.02 | 0.36 | 0.75 | -0.05 | 0.11 |
| 0.22 | -0.29 | 0.88 | 0.04 | -0.08 | 0.16 | -0.23 | -0.06 |
| 0.41 | 0.18 | -0.09 | -0.35 | -0.75 | 0.18 | 0.19 | -0.18 |
| 0.18 | 0.61 | 0.30 | 0.21 | 0.32 | 0.09 | 0.57 | -0.18 |
| 0.47 | -0.17 | -0.01 | 0.28 | -0.09 | -0.34 | 0.26 | 0.69 |
| 0.41 | -0.27 | -0.21 | 0.45 | 0.04 | -0.29 | -0.07 | -0.65 |
#ya teniendo los autovectores de la matriz de correlacion y cada una de las columnas corresponde a la solucion de la 1a componente, 2a componentes... hasta 8a componente.
#Las columnas son los valores de "a" para obtener la combinacion lineal que satisface el problema de maximizacion de la varianza
Usamos de de forma indistinta: Dimension=Variable latente= factor= Componente.
library(dplyr) #para hablitar el pipe
library(factoextra) #usaremos el comando "princomp"
library(kableExtra) #para formato
library(stargazer) #para formato
library(ggplot2) #para los graficos
options(scipen = 99999)
#Crear objeto llamdo "PC" por Pincipal Component
#le paso lo argumntos:la matriz de informacion
#"cor = TRUE" para que calcule la matriz de correlacion
#"fix_sign" para no ajustar el signo. normalmente cuando el primer signo que aparece en la combinacion lineal es negativo se puede multiplicar por (-1) todo el vector para que el primer elemnto no aparezca negativo (solo es por presentacion)
PC<-princomp(x = mat_X,cor = TRUE,fix_sign = FALSE)
#"get_eig(PC)" devuleve una tabla de resumen de los componentes principales
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 | 3.75 | 46.92 | 46.92 |
| Dim.2 | 1.93 | 24.11 | 71.03 |
| Dim.3 | 0.84 | 10.45 | 81.48 |
| Dim.4 | 0.72 | 9.04 | 90.52 |
| Dim.5 | 0.34 | 4.26 | 94.77 |
| Dim.6 | 0.31 | 3.81 | 98.59 |
| Dim.7 | 0.10 | 1.24 | 99.83 |
| Dim.8 | 0.01 | 0.17 | 100.00 |
Hemos logrado transformar la bateria original de indicadores en unas variables/componentes/factores que tienen la caracteristicas de que son independientes entre si. Si se calcula la correlacion entre la dimension 1 y la dimension 2 es CERO porque son independientes, son excluyentes entre ellas, es una propiedad importante.
eigenvalue= autovalores la suma de los autovalores es igual a la cantidad de variables (8). al ser utilizada la matriz de correlacion
La columna “Variance.Percent” se obtiene agarrando el autovalor “eigenvalue” (3.75) y se divide entre la suma de la columna de autovalores (8) eso dará 46.92 y asi sucesivamente
Lectura del primer Variance.Percent (46.92) quiere decir que la 1a dimension o 1a componente explica el 46.92% de la varianza total de la bateria de indicadores…
la columna de “cumulative.variance.percent” (representa el porcentaje de varianza acumulado) es el acumulado de la columna anterior. Si solo retenemos la primera componente/variable latente/factor explicamos el 46.92 de la variacion total pero si retenemos la 1a y la 2a ganamos un 71.03% de la varianza total explicada de la bateria de indicadores originales y si retenemos 3 explicamos el 81.48% y asi sucesivamente
Si retenemos las primeras 3 dimensiones/componentes (que se obtienen como una combinacion lineal de toda la bateria de indicadores originales) estariamos replicando el 80% de la varianza original del set de datos que teniamos.
El grafico de sedimentacion consiste en la representacion grafica de los autovalores en funcion de la cantidad de componentes.
library(factoextra)
#"PC" objeto de componentes principales que ya se habia calculado
#"choice="eigenvalue"" para que grafique los autovalores
fviz_eig(PC,
choice = "eigenvalue",
barcolor = "red",
barfill = "red",
addlabels = TRUE,
)+labs(title = "Gráfico de Sedimentación- autovalores",subtitle = "Usando princomp, con Autovalores")+
xlab(label = "Componentes")+
ylab(label = "Autovalores")+geom_hline(yintercept = 1) #agregar linea del 1 de la raiz latente.
Tambien se puede graficar la varianza “Variance.percent” en el grafico
de sedimentacion y es lo mismo que graficar los autovalores (grafico
anterior) porque es una transformacion lineal.
Se pueden obtener los autovalores originales partiendo de este gráfico recordando: varianza= el autovalor partido entre la suma de los autovalores Entonces: autovalor= varianza multiplicado por la suma del numero de variables (8 en este caso) y esto dividirlo entre 100
library(factoextra)
fviz_eig(PC,
choice = "variance",
barcolor = "green",
barfill = "green",
addlabels = TRUE,
)+labs(title = "Gráfico de Sedimentación - varianza",
subtitle = "Usando princomp, con %Varianza Explicada")+
xlab(label = "Componentes")+
ylab(label = "%Varianza")
Hasta aqui solo hemos planteado la cantidad de factores que se van a
retener. las que van a sustituir a la bateria de indicadores originales.
Pero aun no sabemos que variables estan representadas en cada dimension
para eso SE ACUDE AL CALCULO DE LAS CORRELACIONES de cada variables
original con el componente.
La autocorrelacion es igual a el correspondiente autovector multiplicado por la raiz cuadrada del autovalor correspondiente.
library(dplyr)
library(kableExtra)
#calculo de raiz cuadrada de los autovalores
raiz_lambda<-as.matrix(sqrt(descomposicion$values))
#guardar los autovectores
autovectores<-descomposicion$vectors
#crear una lista vacia.
#"raiz_lambda[j]*autovectores[,j]" es para calcular la correlacion y guardarlo en la lista
#luego pegar otra vez las columnas y eso lo muestro como un dateframe
corr_componentes_coordenadas<-vector(mode = "list")
for(j in 1:8){raiz_lambda[j]*autovectores[,j]->corr_componentes_coordenadas[[j]]}
corr_componentes_coordenadas %>% bind_cols()->corr_componentes_coordenadas
names(corr_componentes_coordenadas)<-paste0("Comp",1:8)
corr_componentes_coordenadas %>% as.data.frame() %>%
kable(caption="Correlación de X con las componentes",
align = "c",
digits = 2) %>%
kable_material(html_font = "sans-serif") %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| Comp1 | Comp2 | Comp3 | Comp4 | Comp5 | Comp6 | Comp7 | Comp8 |
|---|---|---|---|---|---|---|---|
| -0.72 | -0.06 | -0.03 | 0.60 | -0.25 | 0.22 | 0.04 | 0.01 |
| -0.43 | -0.85 | 0.04 | -0.20 | 0.03 | 0.01 | 0.22 | -0.02 |
| 0.80 | -0.28 | -0.25 | -0.02 | 0.21 | 0.42 | -0.02 | 0.01 |
| 0.42 | -0.40 | 0.81 | 0.03 | -0.05 | 0.09 | -0.07 | -0.01 |
| 0.80 | 0.25 | -0.08 | -0.29 | -0.44 | 0.10 | 0.06 | -0.02 |
| 0.34 | 0.84 | 0.27 | 0.18 | 0.19 | 0.05 | 0.18 | -0.02 |
| 0.91 | -0.23 | -0.01 | 0.24 | -0.05 | -0.19 | 0.08 | 0.08 |
| 0.80 | -0.38 | -0.20 | 0.38 | 0.02 | -0.16 | -0.02 | -0.08 |
Cada uno de los coeficientes establace la correlacion lineal que existe entre la variable y la componente.
library(dplyr)
library(factoextra)
library(kableExtra)
#al comando "get_pca_var" le pasamos los componenetes principales que obtuvimos antes y creamos un objeto
variables_pca<-get_pca_var(PC)
#del objeto "variables_pca" le pedimos las coordenadas. (Dentro de las coordenadas se encuentan las correlaciones)
variables_pca$coord%>%
kable(caption="Correlación de X con las componentes, usando factoextra",
align = "c",
digits = 2) %>%
kable_material(html_font = "sans-serif") %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| Dim.1 | Dim.2 | Dim.3 | Dim.4 | Dim.5 | Dim.6 | Dim.7 | Dim.8 | |
|---|---|---|---|---|---|---|---|---|
| X1 | -0.72 | -0.06 | -0.03 | 0.60 | 0.25 | 0.22 | 0.04 | 0.01 |
| X2 | -0.43 | -0.85 | 0.04 | -0.20 | -0.03 | 0.01 | 0.22 | -0.02 |
| X3 | 0.80 | -0.28 | -0.25 | -0.02 | -0.21 | 0.42 | -0.02 | 0.01 |
| X4 | 0.42 | -0.40 | 0.81 | 0.03 | 0.05 | 0.09 | -0.07 | -0.01 |
| X5 | 0.80 | 0.25 | -0.08 | -0.29 | 0.44 | 0.10 | 0.06 | -0.02 |
| X6 | 0.34 | 0.84 | 0.27 | 0.18 | -0.19 | 0.05 | 0.18 | -0.02 |
| X7 | 0.91 | -0.23 | -0.01 | 0.24 | 0.05 | -0.19 | 0.08 | 0.08 |
| X8 | 0.80 | -0.38 | -0.20 | 0.38 | -0.02 | -0.16 | -0.02 | -0.08 |
La lectura debe hacerse desde la perspectiva de valor absoluto -X1 “-0.72” la mayor correlacion en valor absoluto es en la dimension 1 (X1 queda muy bien representada en la primera dimension) -X2 “0.85” tiene mas correlacion en la segunda dimension… - X3 “0.80” queda mejor representada en la primera dimension - la primera dimension esta formada por X1 y X3
El radio del circulo es 1 porque la correlacion maxima existente es de 1. X1 esta mas cerca del eje horizontal (dimension 1), quiere decir que X1 esta mas asociada a la dimension 1. X1 esta bien representada en la dim 1 X2 esta mas cerca del eje vertical, esta mas asociada a la dimension 2.
Esta solucion es bastante representativa porque las puntas estan cerca del circulo.
El radio del circulo es de 1 porque la correlación máxima existente es de 1.
X1 esta más cerca del eje horizontal (de dimension 1) quiere decir que X1 esta mas asociada a la dimension 1.
La magnitud (el modulo) de la flecha estaria determinada por la suma de los cuadrados de los componentes
Esta solucion versus las de abajo es bastante representativa porque las puntas estan cerca del circulo.
library(factoextra)
#"PC" es el objeto de componentes principales
#"repel=TRUE" para que los nombres de las etiquetas no queden encima
#"axes=c(1,2) para que grafique la dimension 1 y 2
fviz_pca_var(PC,repel = TRUE,axes = c(1,2))
Estas correlaciones son mas debiles vrs las de la arriba. a medida se va avanzando, las correlaciones se van volviendo mas pequeñas.
fviz_pca_var(PC,repel = TRUE,axes = c(3,4))
fviz_pca_var(PC,repel = TRUE,axes = c(5,6))
fviz_pca_var(PC,repel = TRUE,axes = c(7,8))
Representacion mas completa de la matriz de correlaciones o cargas factoriales
Normalmente, cuando se utiliza Componentes principales tienden a saturarse la mayoria de variables en las primeras componentes (Dim 1 y 2).
Esta solucion es no rotada. La rotacion puede repartir de mejor manera las variables dentro de los componentes.
library(corrplot)
#"is.corr=FALSE" para indicarle que no se trata de una matriz de correlacion
#"method=square" para indicarle que el metodo sea cuadrado
corrplot(variables_pca$coord,is.corr = FALSE,method = "square",addCoef.col="black",number.cex = 0.75)
En el caso anterior se encontraron unas variables “sintéticas” que pueden sustituir a las variables originales, pero aún no se ha reducido la dimensión de la información. en este apartado se explicarán las características de la técnica de Componentes Principales, en cuanto a su uso dentro del Análisis Factorial.
Modelo Factorial. El modelo factorial permite realizar la agrupación de las variables, garantizando la reducción de la dimensión del dataframe a nivel de variables. Hay “p” variables y “n” casos (la matriz X es de dimensión nxk: Xn×p) Hay “k” Factores comunes, en menor cantidad que las variables originales: (k<p) los Fj se denominan factores comunes al conjunto de variables del modelo y los ϵj representan los factores específicos de cada variable. los lij se denominan cargas factoriales
library(psych) #para usar el comando "principal"
library(corrplot) #Para poder hacer la segregacion
library(dplyr)
#Modelo de 2 Factores (sin rotar)
numero_de_factores<-2
#1er agrumento la matriz de correlacion, "covar=FALSE" porque se trabajara con una matriz de correlacion y no de covarianza, el ultimo argumentp es para indicar que no queremos ninguna rotacion
modelo_2_factores<-principal(r = Rx$r,
nfactors = numero_de_factores,
covar = FALSE,
rotate = "none")
modelo_2_factores
## Principal Components Analysis
## Call: principal(r = Rx$r, nfactors = numero_de_factores, rotate = "none",
## covar = FALSE)
## Standardized loadings (pattern matrix) based upon correlation matrix
## PC1 PC2 h2 u2 com
## X1 -0.72 0.06 0.53 0.472 1.0
## X2 -0.43 0.85 0.91 0.093 1.5
## X3 0.80 0.28 0.72 0.280 1.2
## X4 0.42 0.40 0.33 0.668 2.0
## X5 0.80 -0.25 0.70 0.302 1.2
## X6 0.34 -0.84 0.82 0.176 1.3
## X7 0.91 0.23 0.89 0.108 1.1
## X8 0.80 0.38 0.78 0.217 1.4
##
## PC1 PC2
## SS loadings 3.75 1.93
## Proportion Var 0.47 0.24
## Cumulative Var 0.47 0.71
## Proportion Explained 0.66 0.34
## Cumulative Proportion 0.66 1.00
##
## Mean item complexity = 1.4
## Test of the hypothesis that 2 components are sufficient.
##
## The root mean square of the residuals (RMSR) is 0.09
##
## Fit based upon off diagonal values = 0.96
correlaciones_modelo<-variables_pca$coord
corrplot(correlaciones_modelo[,1:numero_de_factores],
is.corr = FALSE,
method = "square",addCoef.col="black",number.cex = 0.75)
Si respetamos el criterio de porcentaje acumulado de la varianza: (retener 3 factores/componentes)
library(psych)
library(corrplot)
library(dplyr)
#Modelo de 3 Factores (sin rotar)
numero_de_factores<-3
modelo_3_factores<-principal(r = Rx$r,
nfactors = numero_de_factores,
covar = FALSE,
rotate = "none")
modelo_3_factores
## Principal Components Analysis
## Call: principal(r = Rx$r, nfactors = numero_de_factores, rotate = "none",
## covar = FALSE)
## Standardized loadings (pattern matrix) based upon correlation matrix
## PC1 PC2 PC3 h2 u2 com
## X1 -0.72 0.06 -0.03 0.53 0.472 1.0
## X2 -0.43 0.85 0.04 0.91 0.092 1.5
## X3 0.80 0.28 -0.25 0.78 0.219 1.4
## X4 0.42 0.40 0.81 0.98 0.017 2.0
## X5 0.80 -0.25 -0.08 0.71 0.295 1.2
## X6 0.34 -0.84 0.27 0.90 0.101 1.6
## X7 0.91 0.23 -0.01 0.89 0.108 1.1
## X8 0.80 0.38 -0.20 0.82 0.179 1.6
##
## PC1 PC2 PC3
## SS loadings 3.75 1.93 0.84
## Proportion Var 0.47 0.24 0.10
## Cumulative Var 0.47 0.71 0.81
## Proportion Explained 0.58 0.30 0.13
## Cumulative Proportion 0.58 0.87 1.00
##
## Mean item complexity = 1.4
## Test of the hypothesis that 3 components are sufficient.
##
## The root mean square of the residuals (RMSR) is 0.08
##
## Fit based upon off diagonal values = 0.97
correlaciones_modelo<-variables_pca$coord
corrplot(correlaciones_modelo[,1:numero_de_factores],
is.corr = FALSE,
method = "square",addCoef.col="black",number.cex = 0.75)
SI SE TOMAN 4 FACTORES Nos damos cuentas que ya con 4 factores ya todas quedan adecuadamente representadas (ver valores de h2). Todas tienen una varianza comun superior a las 3/4 partes que es lo que se esperaria.
En esta caso tendriamos un cambio en la distribucion de la ponderacion para esta solucion porque si vamos a utilizar esta para la construccion del indicasoe tendriamos que los pesos o poderadores (proportion explained) serian 0.52 a la 1a componente, 0.27 a la 2da, 0.12 a la 3ra y 0.10 a la ultima Que era el problema que nos habiamos planteado al inicio, el hecho de que nos interesa garantizar como se deberian obtener estos ponderadores, ya tendemos por un lado resuelto el tema de las variables latentes.
library(psych)
library(corrplot)
library(dplyr)
#Modelo de 4 Factores (sin rotar)
numero_de_factores<-4
modelo_4_factores<-principal(r = Rx$r,
nfactors = numero_de_factores,
covar = FALSE,
rotate = "none")
modelo_4_factores
## Principal Components Analysis
## Call: principal(r = Rx$r, nfactors = numero_de_factores, rotate = "none",
## covar = FALSE)
## Standardized loadings (pattern matrix) based upon correlation matrix
## PC1 PC2 PC3 PC4 h2 u2 com
## X1 -0.72 0.06 -0.03 0.60 0.89 0.112 2.0
## X2 -0.43 0.85 0.04 -0.20 0.95 0.050 1.6
## X3 0.80 0.28 -0.25 -0.02 0.78 0.219 1.4
## X4 0.42 0.40 0.81 0.03 0.98 0.016 2.0
## X5 0.80 -0.25 -0.08 -0.29 0.79 0.208 1.5
## X6 0.34 -0.84 0.27 0.18 0.93 0.070 1.7
## X7 0.91 0.23 -0.01 0.24 0.95 0.052 1.3
## X8 0.80 0.38 -0.20 0.38 0.97 0.032 2.1
##
## PC1 PC2 PC3 PC4
## SS loadings 3.75 1.93 0.84 0.72
## Proportion Var 0.47 0.24 0.10 0.09
## Cumulative Var 0.47 0.71 0.81 0.91
## Proportion Explained 0.52 0.27 0.12 0.10
## Cumulative Proportion 0.52 0.78 0.90 1.00
##
## Mean item complexity = 1.7
## Test of the hypothesis that 4 components are sufficient.
##
## The root mean square of the residuals (RMSR) is 0.04
##
## Fit based upon off diagonal values = 0.99
correlaciones_modelo<-variables_pca$coord
corrplot(correlaciones_modelo[,1:numero_de_factores],
is.corr = FALSE,
method = "square",addCoef.col="black",number.cex = 0.75)
Esta operación se implementa para mejorar la interpretación de la extracción (solución) propuesta. Hay dos tipos de rotación: Ortogonal y Oblicua, la primera mantiene la independencia entre los factores, en cambio la segunda no.
Para efectos de la agrupación de variables, se implementará la rotación ortogonal VARIMAX, propuesta por Kaiser, ya que permite obtener factores independientes y mantener la estructura de varianza de la solución original.
library(psych)
library(corrplot)
library(dplyr)
#Modelo de 2 Factores (Rotado)
numero_de_factores<-2
modelo_2_factores<-principal(r = Rx$r,
nfactors = numero_de_factores,
covar = FALSE,
rotate = "varimax")
modelo_2_factores
## Principal Components Analysis
## Call: principal(r = Rx$r, nfactors = numero_de_factores, rotate = "varimax",
## covar = FALSE)
## Standardized loadings (pattern matrix) based upon correlation matrix
## RC1 RC2 h2 u2 com
## X1 -0.63 -0.36 0.53 0.472 1.6
## X2 -0.04 -0.95 0.91 0.093 1.0
## X3 0.84 0.08 0.72 0.280 1.0
## X4 0.54 -0.19 0.33 0.668 1.2
## X5 0.62 0.56 0.70 0.302 2.0
## X6 -0.03 0.91 0.82 0.176 1.0
## X7 0.93 0.16 0.89 0.108 1.1
## X8 0.88 -0.01 0.78 0.217 1.0
##
## RC1 RC2
## SS loadings 3.45 2.24
## Proportion Var 0.43 0.28
## Cumulative Var 0.43 0.71
## Proportion Explained 0.61 0.39
## Cumulative Proportion 0.61 1.00
##
## Mean item complexity = 1.2
## Test of the hypothesis that 2 components are sufficient.
##
## The root mean square of the residuals (RMSR) is 0.09
##
## Fit based upon off diagonal values = 0.96
correlaciones_modelo<-variables_pca$coord
correlaciones_modelo_rotada<-varimax(correlaciones_modelo[,1:numero_de_factores])$loadings
corrplot(correlaciones_modelo_rotada[,1:numero_de_factores],
is.corr = FALSE,
method = "square",
addCoef.col="black",
number.cex = 0.75)
###############################
#Modelo de 3 Factores (Rotado)
numero_de_factores<-3
modelo_3_factores<-principal(r = Rx$r,
nfactors = numero_de_factores,
covar = FALSE,
rotate = "varimax")
modelo_3_factores
## Principal Components Analysis
## Call: principal(r = Rx$r, nfactors = numero_de_factores, rotate = "varimax",
## covar = FALSE)
## Standardized loadings (pattern matrix) based upon correlation matrix
## RC1 RC2 RC3 h2 u2 com
## X1 -0.62 -0.33 -0.18 0.53 0.472 1.7
## X2 -0.15 -0.92 0.18 0.91 0.092 1.1
## X3 0.88 -0.01 0.04 0.78 0.219 1.0
## X4 0.23 -0.06 0.96 0.98 0.017 1.1
## X5 0.67 0.51 0.04 0.71 0.295 1.9
## X6 -0.03 0.94 0.09 0.90 0.101 1.0
## X7 0.90 0.12 0.27 0.89 0.108 1.2
## X8 0.89 -0.09 0.12 0.82 0.179 1.1
##
## RC1 RC2 RC3
## SS loadings 3.30 2.13 1.09
## Proportion Var 0.41 0.27 0.14
## Cumulative Var 0.41 0.68 0.81
## Proportion Explained 0.51 0.33 0.17
## Cumulative Proportion 0.51 0.83 1.00
##
## Mean item complexity = 1.3
## Test of the hypothesis that 3 components are sufficient.
##
## The root mean square of the residuals (RMSR) is 0.08
##
## Fit based upon off diagonal values = 0.97
correlaciones_modelo<-variables_pca$coord
correlaciones_modelo_rotada<-varimax(correlaciones_modelo[,1:numero_de_factores],
normalize = TRUE)$loadings
corrplot(correlaciones_modelo_rotada[,1:numero_de_factores],
is.corr = FALSE,
method = "square",
addCoef.col="black",
number.cex = 0.75)
###############################
#Modelo de 4 Factores (Rotado)
numero_de_factores<-4
modelo_4_factores<-principal(r = Rx$r,
nfactors = numero_de_factores,
covar = FALSE,
rotate = "varimax")
modelo_4_factores
## Principal Components Analysis
## Call: principal(r = Rx$r, nfactors = numero_de_factores, rotate = "varimax",
## covar = FALSE)
## Standardized loadings (pattern matrix) based upon correlation matrix
## RC1 RC2 RC4 RC3 h2 u2 com
## X1 -0.22 -0.10 -0.90 -0.14 0.89 0.112 1.2
## X2 -0.12 -0.94 -0.16 0.18 0.95 0.050 1.2
## X3 0.76 -0.04 0.45 0.03 0.78 0.219 1.6
## X4 0.22 -0.06 0.11 0.96 0.98 0.016 1.1
## X5 0.38 0.37 0.72 0.01 0.79 0.208 2.1
## X6 -0.06 0.95 0.12 0.10 0.93 0.070 1.1
## X7 0.88 0.15 0.29 0.27 0.95 0.052 1.5
## X8 0.97 0.00 0.10 0.12 0.97 0.032 1.1
##
## RC1 RC2 RC4 RC3
## SS loadings 2.55 1.95 1.67 1.07
## Proportion Var 0.32 0.24 0.21 0.13
## Cumulative Var 0.32 0.56 0.77 0.91
## Proportion Explained 0.35 0.27 0.23 0.15
## Cumulative Proportion 0.35 0.62 0.85 1.00
##
## Mean item complexity = 1.4
## Test of the hypothesis that 4 components are sufficient.
##
## The root mean square of the residuals (RMSR) is 0.04
##
## Fit based upon off diagonal values = 0.99
correlaciones_modelo<-variables_pca$coord
correlaciones_modelo_rotada<-varimax(correlaciones_modelo[,1:numero_de_factores],
normalize = TRUE)$loadings
corrplot(correlaciones_modelo_rotada[,1:numero_de_factores],
is.corr = FALSE,
method = "square",
addCoef.col="black",
number.cex = 0.75)
En esta solucion con 4 factores y con la rotacion nos damos cuenta que
el primer factor ya solo tiene 3 variables, ya se han repartido. la
primera componente ya no esta tan saturada sino que ya solo esta
compuesta por 3 - EL factor 1 ya solo tiene la agrupacion de x3, x7 y x8
- la segunda dimension esta compuesta por x2 y x6 - la tercera dimension
esta compuesta por x4-> habria que revisar esta variable ya que su
varianza no logra ser explicada por los otros componentes. - La cuarta
componente esta compuesta por x1 y x5
Esta prueba identifica si a nivel poblacional, las variables presentan independencia estadistica (son ortogonales), a través de la matriz de correlación muestral R, y se verifica si a nivel poblacional dicha matriz de correlación corresponde a una matriz identidad, las hipótesis de la prueba son las siguientes:
H0:R∼I H1: R≁I
Si no se rechaza H0, no hay evidencia de multicolinealidad, caso contrario Si se rechaza H0 hay evidencia de multicolinealidad El contraste se realiza a través de:
χ2B=−(n−1−2⋅p+56)ln(|R|)
con gl=p(p−1)/2
Rechazar H0 si χ2B≥V.C., o si p≤α
library(psych)
options(scipen = 99999) #para que muestre todos los decimales
Barlett<-cortest.bartlett(mat_X) #se le puede pasar la matriz de correlacion o la matriz de informacion. el detecta si la matriz que le pasamos es cuadrada o no
print(Barlett)
## $chisq
## [1] 99.52973
##
## $p.value
## [1] 0.0000000006035519
##
## $df
## [1] 28
Como el nivel de significancia (5%) es mayor al p-value (0.00000000035519) entonces SE RECHAZA la Ho. Por lo tanto, estamos ante la presencia de una matriz de correlacion que no representa variables independientes.
Si la bateria de indicadores no pasa este filtro entonces se debera usar otra tecnica o revisar el marco teorico de la eleccion de los indicadores.
Prueba de adecuación muestral de Kaiser Meyer Olkin (KMO) Se considerará adecuado el uso del Análisis Factorial si KMO>0.5, de lo contrario no.
USANDO LA LIBRERIA “PSYCH”
library(psych)
KMO<-KMO(mat_X) #Le pasamos la matriz de informacion
print(KMO)
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = mat_X)
## Overall MSA = 0.5
## MSA for each item =
## X1 X2 X3 X4 X5 X6 X7 X8
## 0.75 0.42 0.62 0.53 0.50 0.35 0.51 0.43
USANDO LA LIBRERIA “RELA”
library(rela)
KMO<-paf(as.matrix(mat_X))$KMO
print(KMO)
## [1] 0.49718