Análisis factorial
2023-11-13
Ejemplo Calificiones recursos Humanos
Leemos el archivo [Link].
library(readxl)
Datos <- read_excel("[Link]")
head(Datos)
## # A tibble: 6 x 12
## `Academic record` Appearance Communication `Company Fit` Experience `Job Fit`
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 6 8 7 5 6 5
## 2 9 8 8 8 10 9
## 3 6 7 7 6 6 7
## 4 7 8 6 5 8 5
## 5 4 7 8 6 6 6
## 6 7 7 7 5 5 6
## # i 6 more variables: Letter <dbl>, Likeability <dbl>, Organization <dbl>,
## # Potential <dbl>, Resume <dbl>, `Self-Confidence` <dbl>
tenemos 12 variables y 50 observaciones. No estamos en condiciones ideales porque deberían ser 120. Aun así,
va a haber mejor ajuste pq es más fácil ajustar pocos valores.
Estadísticos descriptivos
Verificamos las características de los datos.
summary(Datos)
## Academic record Appearance Communication Company Fit
## Min. : 4.00 Min. : 5.00 Min. : 3.00 Min. : 3.00
## 1st Qu.: 6.25 1st Qu.: 7.00 1st Qu.: 6.00 1st Qu.: 6.00
## Median : 7.00 Median : 7.50 Median : 7.00 Median : 7.00
## Mean : 7.40 Mean : 7.44 Mean : 6.86 Mean : 6.88
## 3rd Qu.: 8.00 3rd Qu.: 8.00 3rd Qu.: 8.00 3rd Qu.: 8.00
## Max. :10.00 Max. :10.00 Max. :10.00 Max. :10.00
## Experience Job Fit Letter Likeability Organization
## Min. : 5.00 Min. : 3.00 Min. : 4.00 Min. :4.00 Min. :3.00
## 1st Qu.: 6.00 1st Qu.: 6.00 1st Qu.: 6.00 1st Qu.:7.00 1st Qu.:5.25
## Median : 7.00 Median : 7.00 Median : 7.00 Median :7.50 Median :7.00
## Mean : 7.32 Mean : 7.02 Mean : 7.22 Mean :7.38 Mean :6.86
## 3rd Qu.: 8.00 3rd Qu.: 8.00 3rd Qu.: 8.00 3rd Qu.:8.00 3rd Qu.:8.00
## Max. :10.00 Max. :10.00 Max. :10.00 Max. :9.00 Max. :9.00
## Potential Resume Self-Confidence
## Min. : 4.0 Min. : 4.00 Min. :5.00
## 1st Qu.: 6.0 1st Qu.: 6.00 1st Qu.:7.00
## Median : 7.5 Median : 7.00 Median :7.00
1
## Mean : 7.3 Mean : 7.24 Mean :7.34
## 3rd Qu.: 8.0 3rd Qu.: 9.00 3rd Qu.:8.00
## Max. :10.0 Max. :10.00 Max. :9.00
Queríamos que fueran de tipo cuantitativo. Aquí vemos que si son númericos. La variable es discreta, no
continua. los números si tienen un sentido de orden (ej de temperatura, es como si fueran calificaciones, un
10 es el máximo)
Verificar supuestos
Veremos si es posible aplicar el análisis factorial al conjunto de datos.
Pruebas de correlación
Checamos que existan correlaciones mayores a 0.30. con el comando cor().
[Link] <-cor(Datos)
head([Link])
## Academic record Appearance Communication Company Fit Experience
## Academic record 1.0000000 0.4701427 0.4054067 0.4992183 0.6672390
## Appearance 0.4701427 1.0000000 0.4939720 0.4170806 0.3099465
## Communication 0.4054067 0.4939720 1.0000000 0.5907387 0.1960094
## Company Fit 0.4992183 0.4170806 0.5907387 1.0000000 0.3959678
## Experience 0.6672390 0.3099465 0.1960094 0.3959678 1.0000000
## Job Fit 0.5393435 0.4105762 0.5050808 0.8820580 0.5224501
## Job Fit Letter Likeability Organization Potential
## Academic record 0.5393435 0.3269457 0.3990134 0.3578991 0.7951979
## Appearance 0.4105762 0.3034917 0.6392098 0.5370193 0.5133541
## Communication 0.5050808 0.4033781 0.4900438 0.8617976 0.4206029
## Company Fit 0.8820580 0.4539438 0.4842812 0.6223051 0.6586426
## Experience 0.5224501 0.4800248 0.3058838 0.1732109 0.7035542
## Job Fit 1.0000000 0.4652077 0.5305521 0.5274873 0.7057635
## Resume Self-Confidence
## Academic record 0.4606419 0.4067717
## Appearance 0.4986309 0.6967065
## Communication 0.4255336 0.4309427
## Company Fit 0.4432190 0.4616973
## Experience 0.5172440 0.4037882
## Job Fit 0.4607897 0.4654267
Buscamos cuantas correlaciones cumplen el criterio (mayor a 0.3), para no contarlo a mano hacemos lo
siguiente:
(length([Link][[Link] >0.3])-12)/2
## [1] 62
Le quitamos 12 porque son los que tienen corr de 1 y eso no nos interesa Quitamos la mitad de ellos porque
se repiten dos veces
v1 v2 v3 v1 1 a
v2 a 1
v3 1
a es el mismo en v1 v2 que en v2 v1, por eso se divide entre dos y el 12 es para quitar los 1
Lo podemos mostrar de forma gráfica con la instrucción:
2
corrplot([Link],order = "hclust",[Link] = "black",[Link] = 1)
Academic record
Self−Confidence
Communication
Organization
Company Fit
Appearance
Experience
Likeability
Potential
Resume
Job Fit
Letter
1
Appearance
Likeability 0.8
Self−Confidence 0.6
Company Fit 0.4
Job Fit
0.2
Communication
0
Organization
Letter −0.2
Resume −0.4
Experience −0.6
Academic record
−0.8
Potential
−1 Entre + oscuro + correla-
ciones
Prueba del determinante
Checamos ahora que exista colinealidad entre los datos al calcular el determinante de la matriz de correlaciones
con la función det().
det([Link])
## [1] 2.258001e-05
Determinante de la matriz de correlaciones. Buscamos un valor bajo pero que no sea cero. Si es cero esta
indefinida.
##Métricos exclusivos de Análisis Factorial ### Prueba de Bartlett Ho: No están correlacionadas con
la población Prueba la hipótesis nula de que las variables NO están correlacionadas en la población con la
función [Link](matriz,n=nrow(los datos)) y observamos el valor de p
[Link]([Link],n=nrow(Datos))
## $chisq
## [1] 472.5147
##
## $[Link]
## [1] 9.677847e-63
##
## $df
## [1] 66
3
El p value es menor a 0.05. El p value nos dice la probabilidad de que la matriz sea una matriz identidad
(que es puros ceros alrededor y en la diagonal puros unos. Si es identidad no es útil)
Se RHO, lo cual es lo que [Link] no se rechazara ya no podemos hacer nada
[Link]([Link],n=nrow(Datos))$p<0.05
## [1] TRUE
Forma de hacer lo mismo, para ver si NRHO ### KMO
Aplicamos la prueba KMO() sobre la matriz de correlaciones:
KMO([Link])
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = [Link])
## Overall MSA = 0.8
## MSA for each item =
## Academic record Appearance Communication Company Fit Experience
## 0.85 0.88 0.79 0.81 0.78
## Job Fit Letter Likeability Organization Potential
## 0.83 0.68 0.85 0.74 0.88
## Resume Self-Confidence
## 0.71 0.78
Overall MSA = 0.8. Debe ser mayor a 0.7 I think. Revisar notas.
Esta prueba te dice el valor individual de cada variable. Si vemos una por abajo de 0.6 podemos estar en
posición/ ser un candidato a reespecificar. La reespecificación se hace al final, primero terminas tu análisis
así.
Definimos el número de factores
Ahora buscamos el número de factores con scree() y con [Link]
Con criterio de contraste de caída:
scree([Link])
4
Eigen values of factors and components Scree plot
PC
6
FA
5
4
3
2
1
0
2 4 6 8 10 12
factor or component number El
núm de factores no esta escrito en piedra, solo te sirve para tu análisis inicial. En la segunda vuelta puedes
ver cual ajusta mejor o cual es más intuitivo de explicar (eso se ve al final con una gráfica
El núm máximo de factores que podríamos tener sería 12 (un factor por cada variable), lo que no nos sirviría
de nada porque todas serían independientes. EN la gráfica nos sale que máximo hay 12 factor or component
number. Esta gráfica nos dice que tanto nso explica con un valor adicional. Esta gráfica dice que la mayor
variabildiad común lo tiene el primer factor. Es normal, el primer factor siempre capta la mayor variabilidad
posible. Rotando cambiamos
Eighen value del factor menor a 1 = explica menos de una variable. No nos sirve tanto
Si esta en el 1 explica una variable
Nuestra guía van a ser 4 factores. Podemos subir a 5 o bajar a 3. Otra forma de interpretarla es con base
a la pendiente. Se van acercando a 0 cuando explican menos (el valor eigen).La pendiente que se ve es la
varianza explicada por cada factor.A más variables es menor la varianza explicada (es casi horizontal entre
los últimos puntos)
Con parallel (Horn, 1965) se agrega el número de observaciones, el tipo de análisis fa y el método minres.
[Link]([Link], [Link]=50, fa="fa", fm="minres")
5
Parallel Analysis Scree Plots
FA Actual Data
eigen values of principal factors
FA Simulated Data
5
4
3
2
1
0
2 4 6 8 10 12
Factor Number
## Parallel analysis suggests that the number of factors = 4 and the number of components = NA
En la primera pestaña nos sugiere que el número de factores sea de 4. La linea roja es el ruido, la matriz
generada con variables aleatorias. Mientras el triangulito este por arriba de la línea roja, estamos bien. Si
esta abajo means que esta explicando como si fuese aleatoria.
Si tenemos una matriz de correlaciones adecuada o ideal, los dos análisis van a ser iguales.
ya sabemos que se puede hacer análisis factorial y sabemos el núm de factores, así que ya podemos calcualr la
matriz inicial de factores.
Calculamos la matriz inicial de factores.
Corremos el primer modelo con fa(), especificamos número de factores, la no rotación y el método minres.
[Link] <- fa([Link],nfactors = 4, rotate = "none", fm="minres")
Minres significa minimizar los residuales.
h2 (communality): la proporción explicada por los factores para cada variable.
[Link]$communality
## Academic record Appearance Communication Company Fit Experience
## 0.6361932 0.6523915 0.7303186 0.7542362 0.6772262
## Job Fit Letter Likeability Organization Potential
## 0.7309845 0.9299106 0.6622493 0.8570239 0.8914191
## Resume Self-Confidence
## 0.8520537 0.7911215
Aquí nos dice cuanto explican los factores de la variabilidad de nuestras variables. Hay algunas que son
mucho más explicadas que otras.
Vemos la comunalidad, cuanta variabilidad están explicando de la carga.
6
Matriz de cargas factoriales (loadings):
[Link]$loadings
##
## Loadings:
## MR1 MR2 MR3 MR4
## Academic record 0.698 0.236 -0.304
## Appearance 0.692 -0.222 0.350
## Communication 0.696 -0.393 0.219 -0.211
## Company Fit 0.786 -0.360
## Experience 0.623 0.489 -0.220
## Job Fit 0.794 -0.113 -0.293
## Letter 0.633 0.411 0.599
## Likeability 0.713 -0.240 0.311
## Organization 0.703 -0.534 0.155 -0.231
## Potential 0.814 0.238 -0.400 -0.108
## Resume 0.708 0.353 0.424 0.216
## Self-Confidence 0.707 -0.251 -0.155 0.451
##
## MR1 MR2 MR3 MR4
## SS loadings 6.152 1.262 0.953 0.798
## Proportion Var 0.513 0.105 0.079 0.067
## Cumulative Var 0.513 0.618 0.697 0.764
te salen 4 columnas pq elegiste 4 factores. Aquí nos dice la cargas factoriales. El primer factor explica a
academic record en 0.698. SOn muy altos para el factor 1 porque todavía no rotamos, se está quedando
con la mayor explicación de la variabilidad. (siempre el primero es el que se lo queda más). ¿El factor 1
representaría bien a todas las variables? Si, si el objetivo fuera hacer un índice si es posible. Algo similar a lo
que llegaríamos si eligieramos hacer un análisis de componentes principales.
Aquí aun no decidimos cauntas variables por factor, eso se hace hasta la rotación.
Si metemos más variables más de la variabilidad se va a explicar de la que sobra, tendríamos una sobre ##
Rotamos los factores
Verificamos las comunalidades y las cargas.
Con rotación ortogonal
Esta es para factores independientes.
Utilizamos “varimax”:
[Link] <- fa([Link], nfactors = 4, rotate = "varimax", fm="minres")
Vamos a checar comunalidades y carga factorial:
[Link]$communality
## Academic record Appearance Communication Company Fit Experience
## 0.6361932 0.6523915 0.7303186 0.7542362 0.6772262
## Job Fit Letter Likeability Organization Potential
## 0.7309845 0.9299106 0.6622493 0.8570239 0.8914191
## Resume Self-Confidence
## 0.8520537 0.7911215
Rotando factores revisamos de nuevo la comunalidad. ¿Cuánto se explica de la variabilidad de los factores
por academic record? Nos da igual al rotarlo. La comunalidad no cambia. Cuando rotamos factores va a ser
7
exactamente la misma independientemente de cuanto rotemos los valores, la variabilidad explicada cera la
misma, la correlación es la mimsa tmb pero cambia a quien le otorga esa, cambia la distribución. Esto es una
buena noticia porque nos dice que este proceso mantiene la consistencia.
[Link]$loading
##
## Loadings:
## MR1 MR2 MR4 MR3
## Academic record 0.713 0.178 0.269 0.154
## Appearance 0.230 0.272 0.704 0.171
## Communication 0.117 0.760 0.309 0.208
## Company Fit 0.521 0.652 0.151 0.187
## Experience 0.732 0.180 0.327
## Job Fit 0.614 0.531 0.170 0.206
## Letter 0.223 0.243 0.904
## Likeability 0.226 0.321 0.688 0.185
## Organization 0.843 0.360
## Potential 0.855 0.257 0.285 0.118
## Resume 0.286 0.129 0.331 0.802
## Self-Confidence 0.273 0.210 0.816
##
## MR1 MR2 MR4 MR3
## SS loadings 2.757 2.392 2.211 1.806
## Proportion Var 0.230 0.199 0.184 0.151
## Cumulative Var 0.230 0.429 0.613 0.764
Ya no se queda con todas las variables el fctor 1. Se queda con Potencial, experience y academic record.
Como no tenemos 5 variables por factor, hay que ir con cuidado, ese 0.713 no es tan impresionante. Si una
de las variables aquí no se explican las podríamos quitar.
Con rotación oblicua
Ver cierta correlación los factores
Utilizamos “oblimin”:
[Link] <- fa([Link], nfactors = 4, rotate = "oblimin", fm="minres")
Interpretación
Podemos verlo de forma gráfica con [Link]()
Modelo ortogonal
[Link]([Link])
8
Factor Analysis
Potential
0.9
Experience 0.7
MR1
Academic record 0.7
0.6
Job Fit
Organization 0.8 MR2
Communication 0.8
0.7
Company Fit
Self−Confidence 0.8 MR4
Appearance 0.7
0.7
Likeability
MR3
Letter 0.9
0.8
Resume Hay un factor que esta agrupando el poten-
cial, experiencia, academic record y job fit. En otro la organización, comunicación, etc. y así
Modelo oblicuo
[Link]([Link])
9
Factor Analysis
Potential
0.9
Experience 0.7
MR1
Academic record 0.7
0.6
Job Fit 0.5
Self−Confidence 0.8 MR4 0.3
Appearance 0.7
0.7 0.4 0.5
Likeability
Organization 0.8 MR2 0.4
0.7
Communication
0.6
Company Fit
MR3
Letter 1
0.8
Resume Nos dice que aparte de los fac-
tores que se detectaron, cual es la correlación entre los factores. O sea cuales factores tienen algo que ver
entre si. El 1 tiene que ver un poco con el 4 por ejemplo. Si nos da resultados diferentes que la ortogonal
algo esta mal.0.6 o 0.8 de correlación entre factores nos dice que hay algo mal. No se valdría con la ortogonal.
Si vemos que en la oblicua hay altas correlaciones entre los factores descartamos ortagonal.
Potencial esta explicado por el factor 1 en 0.9 (carga factorial).
De aquí tocaría volver a hacerlo todo moviendo a 3 factores o a 5 y ver como son las cargas factoriales.
10