El Análisis Factorial (AF) es un método multivariante que pretende expresar p variables observables como una combinación lineal de m variables hipotéticas o latentes, denominadas factores. Tiene una formulación parecida al Análisis de Componentes Principales, pero el modelo que relaciona variables y factores es diferente en AF. Si la matriz de correlaciones existe, las componentes principales también existen, mientras que el modelo factorial podrá ser aceptado o no mediante un test estadístico. Ejemplos en los que la variabilidad de las variables observables se puede resumir mediante unas variables latentes, que el AF identifica como factores, son:
La teoría clásica de la inteligencia supone que los test de inteligencia estaban relacionados por un factor general, llamado factor “g”de Spearman.
La estructura de la personalidad, también medida a partir de test y escalas, esta dominada por dos dimensiones: el factor neuroticismoestabilidad y el factor introversion-extroversión
Las diferentes características políticas de ciertos pases están influidas por dos dimensiones: izquierda-derecha y centralismo-nacionalismo.
En este documento trabajaremos con el conjunto de datos bfi de la librería psyh. Este conjunto de datos contiene 2800 observaciones con 28 variables, con 25 ítems de una prueba de personalidad.
library(psych)
library(polycor)
library(ggcorrplot)
bfi_s <- bfi[1:200,1:25] # subconjunto de datos
mat_cor <- hetcor(bfi_s)$correlations #matriz de correlación policorica
ggcorrplot(mat_cor,type="lower",hc.order = T)
Después de calcular la matriz de correlación, se puede verificar si la matriz de datos es factorizable por medio de la prueba de esfericidad de Bartlett, y la prueba de Kaiser-Meyer-Olkin.
En este paso nos tenemos que preguntar si existe la suficiente correlación entre las variable para efectuar el análisis factorial.
cortest.bartlett(mat_cor)->p_esf
p_esf$p
## [1] 5.931663e-60
El resultado del p valor nos permite rechazar la hipótesis nula.
Como referencia, Kaiser puso los siguientes valores en los resultados:
KMO(mat_cor)
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = mat_cor)
## Overall MSA = 0.76
## MSA for each item =
## A1 A2 A3 A4 A5 C1 C2 C3 C4 C5 E1 E2 E3 E4 E5
## 0.66 0.77 0.69 0.73 0.75 0.74 0.79 0.76 0.76 0.74 0.80 0.81 0.79 0.81 0.83
## N1 N2 N3 N4 N5 O1 O2 O3 O4 O5
## 0.70 0.67 0.82 0.79 0.82 0.79 0.65 0.81 0.62 0.77
El resultado es 0.76 lo que nos dice que podemos continuar con el análisis Factorial.
Los métodos disponibles son: Componentes principales, Mínimos cuadrados no ponderados, Mínimos cuadrados generalizados, Máxima verosimilitud, factorización de Ejes principales, factorización Alfa y factorización Imagen.
Con la función fa() podemos utilizar los métodos siguientes.
### prueba de dos modelos con tres factores
modelo1<-fa(mat_cor,
nfactors = 3,
rotate = "none",
fm="mle") # modelo máxima verosimilitud
modelo2<-fa(mat_cor,
nfactors = 3,
rotate = "none",
fm="minres") # modelo minimo residuo
######comparando las comunalidades
sort(modelo1$communality,decreasing = T)->c1
sort(modelo2$communality,decreasing = T)->c2
head(cbind(c1,c2))
## c1 c2
## N1 0.7576920 0.6809294
## E2 0.6802809 0.6564523
## N2 0.6797943 0.5866483
## E1 0.5219674 0.5394762
## N3 0.5198285 0.4942059
## N4 0.4839516 0.4744005
####comparacion de las unicidades
sort(modelo1$uniquenesses,decreasing = T)->u1
sort(modelo2$uniquenesses,decreasing = T)->u2
head(cbind(u1,u2))
## u1 u2
## O2 0.9460554 0.9293483
## A4 0.8928892 0.8908844
## A1 0.8607240 0.8822080
## O5 0.8533481 0.8272041
## C5 0.8136600 0.7931685
## O1 0.7986908 0.7904667
Kaiser Criterion (Guttman, 1954): esta regla sugiere que se deben retener todos los factores que tengan un eigenvalue de 1.0 o mayor; con el razonamiento de que un factor no debe explicar menos que la varianza equivalente que hubiera explicado una sola de las variables incluidas en el análisis. La regla sin embargo no es estricta y debe analizarse en conjunto con otros criterios.
Análisis del Scree Plot (Cattell, 1966): este método complementa al anterior y se basa también el análisis de la magnitud de los eigenvalues pero a partir de la tendencia que se observa en el Scree Plot. Se procuran seleccionar un grupo reducido de factores que tengan eigenvalues significativamente superiores a los demás, para lo cual se identifica el punto de inflexión en la curva del scree plot (también referido como el codo por su semejanza con un brazo) a partir del cual la curva se transforma a una línea “plana” o relativamente recta. En el ejemplo que se presenta hay un claro punto de inflexión después de dos factores.
Análisis paralelo (Horn, 1965): Esta regla suele complementar las anteriores cuando el numero de variables iniciales y factores resultantes es elevado. El procedimiento es basado en el principio de que los factores a extraer deben dar cuenta de mas varianza que la que es esperada de manera aleatoria. El procedimiento reordena las observaciones de manera aleatoria entre cada variable y los eigenvalues son recalculados a partir de esta nueva base de datos aleatoriamente ordenada. Los factores con eigenvalues mayores a los valores aleatorios son retenidos para interpretación.
scree(mat_cor)
fa.parallel(mat_cor,n.obs=200,fa="fa",fm="minres")
## Parallel analysis suggests that the number of factors = 5 and the number of components = NA
EL análisis paralelo sugiere utilizar 5 factores.
La obtención de la matriz factorial, no es mas que el primer paso del AF. Normalmente la matriz obtenida no define unos factores interpretables, Se han propuesto diferentes versiones sobre como transformar la matriz factorial a fin de obtener una estructura simple de los factores. Esencialmente se trata de conseguir que unas saturaciones sean altas a costa de otras, que serán bajas, para así destacar la influencia de los factores comunes sobre las variables observables. Existen dos formas básicas de realizar la Rotación de Factores , oblicuas y ortogonales. Se elige uno u otro procedimiento según que los factores rotados sigan siendo ortogonales o no. Señalar que en ambas rotaciones la comunalidad de cada variable no se modifica, esto es, la rotación no afecta a la bondad del ajuste de la solución factorial: aunque cambie la matriz factorial, las especificidades no cambian y, en consecuencia, las comunidades permanecen invariantes. Sin embargo, cambia la varianza explicada por cada factor, por tanto, los nuevos factores no están ordenados de acuerdo con la información que contienen, cuantificada mediante su varianza.
Varimax:Método de rotación ortogonal que minimiza el número de variables que tienen saturaciones altas en cada factor. Simplifica la interpretación de los factores.
Criterio Oblimin directo:Método para la rotación oblicua (no ortogonal). El método necesita un valor delta que servirá para ajustar los ejes en función de las saturaciones buscan una mejor aproximación, pero considerando que la varianza se distribuirá entre todos los factores.
Método quartimax: Método de rotación que minimiza el número de factores necesarios para explicar cada variable.
Método equamax:Método de rotación que es combinación del método varimax, que simplifica los factores, y el método quartimax, que simplifica las variables. Se minimiza tanto el número de variables que saturan alto en un factor como el número de factores necesarios para explicar una variable.
Rotación Promax: Rotación oblicua que permite que los factores estén correlacionados. Esta rotación se puede calcular más rápidamente que una rotación oblimin directa, por lo que es útil para conjuntos de datos grandes.
library()
#Rotaciones
library(GPArotation)
rot<-c("none", "varimax", "quartimax","Promax")
bi_mod<-function(tipo){
biplot.psych(fa(bfi_s,nfactors = 2,fm="minres",rotate = tipo),main = paste("Biplot con rotación ",tipo),col=c(2,3,4),pch = c(21,18),group = bfi[,"gender"])
}
sapply(rot,bi_mod)
## $none
## NULL
##
## $varimax
## NULL
##
## $quartimax
## NULL
##
## $Promax
## NULL
Esta es la parte mas difícil del análisis factorial para ayudar a la interpretación se puede hacer un gráfico de árbol.
modelo_varimax<-fa(mat_cor,nfactors = 5,rotate = "varimax",
fa="minres")
fa.diagram(modelo_varimax)
Los factores pueden ser interprestados como:
MR4: Agradable (A1, A2, A3, A4, A5) MR3: Conciencia (C1, C2, C3, C4, C5) MR1: Extraversión (E1, E2, E3, E4, E5) MR2: Neuroticismo (N1, N2, N3, N4, N5) MR5: Apertura ( O1, O2, O3, O4, O5)
print(modelo_varimax$loadings,cut=0)
##
## Loadings:
## MR1 MR2 MR4 MR3 MR5
## A1 0.234 0.106 -0.422 -0.072 -0.092
## A2 0.112 -0.032 0.653 0.190 0.113
## A3 0.198 0.066 0.744 0.051 0.169
## A4 0.163 -0.048 0.413 0.137 -0.142
## A5 0.328 -0.154 0.692 -0.009 0.115
## C1 0.054 0.089 0.140 0.634 0.287
## C2 0.052 0.174 0.114 0.690 0.050
## C3 0.032 0.018 0.076 0.642 0.016
## C4 -0.058 0.087 -0.090 -0.559 -0.159
## C5 -0.241 0.228 -0.040 -0.459 0.014
## E1 -0.691 -0.006 -0.066 -0.084 -0.017
## E2 -0.713 0.345 -0.138 -0.133 -0.025
## E3 0.546 0.003 0.157 -0.008 0.221
## E4 0.522 -0.027 0.416 0.167 0.048
## E5 0.588 -0.009 0.148 0.308 0.159
## N1 0.131 0.802 -0.150 -0.074 -0.133
## N2 0.088 0.800 -0.151 -0.038 -0.008
## N3 -0.183 0.701 0.005 0.037 -0.087
## N4 -0.513 0.491 -0.006 0.004 0.034
## N5 -0.274 0.571 0.059 0.096 -0.082
## O1 0.203 -0.107 0.148 0.076 0.535
## O2 -0.099 0.096 0.144 -0.191 -0.330
## O3 0.326 -0.159 0.034 0.062 0.680
## O4 -0.240 0.122 0.169 0.105 0.548
## O5 -0.004 0.061 -0.074 -0.077 -0.636
##
## MR1 MR2 MR4 MR3 MR5
## SS loadings 2.823 2.667 2.223 2.103 1.867
## Proportion Var 0.113 0.107 0.089 0.084 0.075
## Cumulative Var 0.113 0.220 0.309 0.393 0.467
Las asignaturas clásicas de la enseæanza media, se dividen, en lneas generales, en asignaturas de Ciencias y de Letras, las primeras con contenido más racional y emprico, las segundas con contenido más humanstico y artístico. Consideremos las siguientes 5 asignaturas: ciencias naturales,matematicas,latin y frances.
datos<-read.csv("estudiantes.csv")
datos_f<-datos[,-1]
mat_cor<-cor(datos_f)
ggcorrplot(mat_cor,hc.order = T,type="lower")
KMO(mat_cor)
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = mat_cor)
## Overall MSA = 0.67
## MSA for each item =
## ciencias matematicas frances latin literatura
## 0.65 0.42 0.63 0.76 0.81
cortest.bartlett(mat_cor,n = nrow(datos))$p
## [1] 3.164023e-09
scree(mat_cor)
modelo<-fa(datos_f,rotate = "varimax",nfactors = 2,fm="minres")
fa.diagram(modelo)
print(modelo$loadings,cut=0)
##
## Loadings:
## MR1 MR2
## ciencias 0.438 0.640
## matematicas 0.039 0.997
## frances 0.974 0.073
## latin 0.814 0.173
## literatura 0.861 0.297
##
## MR1 MR2
## SS loadings 2.546 1.527
## Proportion Var 0.509 0.305
## Cumulative Var 0.509 0.815
modelo$uniquenesses
## ciencias matematicas frances latin literatura
## 0.398973792 0.004166179 0.046075726 0.307011837 0.171233976
modelo$communalities
## ciencias matematicas frances latin literatura
## 0.6009843 0.9950000 0.9539002 0.6929323 0.8287368
Los factores latentes son ciencias y Letras. de esta forma MR2 es Ciencias MR1 es letras.