Análisis de Factores (FA)

Análisis Multivariado

Autor/a
Afiliación
Freddy Hernández-Barajas

Universidad Nacional de Colombia

1 Introducción

  • En numerosas áreas de psicología y de ciencias del Comportamiento no es posible medir directamente las variables que interesan; por ejemplo, los conceptos de inteligencia y de clase social.

  • En estos casos es necesario recoger medidas indirectas que están relacionadas con los conceptos que interesan.

  • El análisis de factores comunes y únicos (analisis factorial) busca describir la relación de covariación entre múltiples variables en términos de pocas variables aleatorias no observables llamadas factores.

  • El análisis de factores es un técnica descriptiva con alguna similitud con componentes principales.

  • En el análisis de componentes principales, en realidad, solo se hacen transformaciones ortogonales de las variables originales, haciendo hincapie en la varianza de las nuevas variables. En el análisis factorial, por el contrario, interesa más explicar la estructura de las covarianzas entre las variables.

2 Idea intuitiva

La idea es encontrar Factores no observables que influyan en las variables observadas.

3 Diferencia y similitud entre FA y PCA

En la siguiente figura se ilustra que FA busca factores que influyan sobre las X’s, mientras que PCA busca la forma en que las X’s influyen sobre las CP.

Otra figura ilustrativa de la diferencia entre FA y PCA.

4 Modelo

El modelo estadístico en FA es el siguiente:

donde \(X_1, X_2, \ldots, X_p\) representan las variables cuantitativas observadas, \(f_1, f_2, \ldots, f_k\) representan los factores no observables, los \(\lambda_{ij}\) son los aportes de los factores a cada una de las variables. Se desea que \(k \leq p\).

Matricialmente el modelo se puede escribir como

El vector \(X\) es de tamaño \(p\times1\) con media \(\boldsymbol{\mu}\) y matriz de covarianzas \(\boldsymbol{\Sigma}\). La matriz \(\boldsymbol{\Lambda}\) se llama matriz de ponderaciones, cargas o pesos.

Las clases de factores son:

  1. Comunes: \(f_1, f_2, \ldots, f_k\).
  2. Únicos: \(u_1, u_2, \ldots, u_p\).

y estos factores se puede ver en el modelo estadístico:

Una ilustración de ambos factores se puede ver en la siguiente figura.

5 Supuestos

Para efectos de estimación se asume que

6 Comunalidad y especificidad

Para la variable \(i\)-ésima variable se tiene que

y asumiendo que los factores son ortogornales, la varianza de ella está dada por

7 Varianza y correlacion

El resultado anterior se puede escribir matricialmente como

Si los factores son ortogonales \(\Phi=I\) entonces

Cuando las variables originales se han estandarizado, el analisis puede desarrollarse a partir de la matriz de correlaciones \(\boldsymbol{R}\)

8 Métodos de estimación

Tres métodos pueden ser usados para estimar las ponderaciones factoriales \(\lambda_{ij}\).

  1. Método de la componente principal

  2. Método del factor principal

  3. Método de máxima verosimilitud

9 Método de la componente principal

Los pasos necesarios para realizar la estimación de la matriz de pesos \(\boldsymbol{\Lambda}\) son:

  1. Calcule la matriz de correlaciones \(\boldsymbol{R}\).
  2. Obtenga los valores y vectores propios de \(\boldsymbol{R}\).
  3. Usando los valores propios calcule la variabilidad acumulada hasta cada uno de los factores.
  4. Elija el número \(k\) de factores a usar, ya sea por un valor preestablecido de \(k\) o para explicar un mínimo de variabilidad.
  5. Estime la matriz de pesos \(\hat{\boldsymbol{\Lambda}}\) usando la expresión \(\hat{\boldsymbol{\Lambda}} = \boldsymbol{P}_1 \boldsymbol{D}_1^{1/2}\) donde \(\boldsymbol{D}_1\) es una matriz diagonal con los \(k\) valores propios más grandes de mayor a menor. \(\boldsymbol{P}_1\) es una matriz con los \(k\) vectores propios asociados a los \(k\) valores propios elegidos.

10 Ejemplo

Para un estudio de aceptación de un nuevo producto se indagó con un grupo de consumidores sobre los siguientes atributos de este nuevo producto: gusto \(X_1\), costo \(X_2\), sabor \(X_3\), tamano por porcion \(X_4\) y calorías suministradas \(X_5\). La matriz de correlación obtenida fue la siguiente:

Obtenga la estimación de la matriz \(\boldsymbol{\Lambda}\) de pesos de tal manera que se explique al menos un 90% de la variabilidad observada. Calcule la comunalidad y la especificidad de cada variable.

Solución

Calculemos los valores y vectores propios de \(\boldsymbol{R}\).

R <- matrix(c(1, 0.02, 0.96, 0.42, 0.01,
              0.02, 1, 0.13, 0.71, 0.85,
              0.96, 0.13, 1, 0.5, 0.11,
              0.42, 0.71, 0.50, 1, 0.79,
              0.01, 0.85, 0.11, 0.79, 1), ncol=5, byrow=T)
eigen(R)
eigen() decomposition
$values
[1] 2.85309042 1.80633245 0.20449022 0.10240947 0.03367744

$vectors
          [,1]        [,2]        [,3]       [,4]         [,5]
[1,] 0.3314539 -0.60721643  0.09848524  0.1386643  0.701783012
[2,] 0.4601593  0.39003172  0.74256408 -0.2821170  0.071674637
[3,] 0.3820572 -0.55650828  0.16840896  0.1170037 -0.708716714
[4,] 0.5559769  0.07806457 -0.60158211 -0.5682357  0.001656352
[5,] 0.4725608  0.40418799 -0.22053713  0.7513990  0.009012569

Calculando la proporcion de variabilidad acumulada.

cumsum(eigen(R)$values / sum(eigen(R)$values))
[1] 0.5706181 0.9318846 0.9727826 0.9932645 1.0000000

Por lo tanto \(k=2\) factores.

La estimación de \(\boldsymbol{\Lambda}\)

D1 <- diag(eigen(R)$values[1:2])
P1 <- eigen(R)$vectors[, 1:2]
Lambda.est <- P1 %*% D1^0.5
Lambda.est
          [,1]       [,2]
[1,] 0.5598618 -0.8160981
[2,] 0.7772594  0.5242021
[3,] 0.6453364 -0.7479464
[4,] 0.9391057  0.1049187
[5,] 0.7982069  0.5432281

Comunalidad y especificidad (varianza especifica) se obtiene así.

11 Método del factor principal

Los pasos necesarios para realizar la estimación de la matriz de pesos \(\boldsymbol{\Lambda}\) y la matriz de unicidades \(\boldsymbol{\Psi}\) a partir de la matriz \(\boldsymbol{R}\) son los siguientes:

  1. Estime comunalidades iniciales \(\hat{h}_i^2=1-\frac{1}{r^{ii}}\) donde \(r^{ii}\) es el \(i\)-esimo elemento en la diagonal de \(\boldsymbol{R}^{-1}\).

  2. Con los valores estimados \(\hat{h}_i^2\) del paso anterior calcule la nueva matriz \(\boldsymbol{R}-\hat{\boldsymbol{\Psi}}\) asi:

  1. Aplique Metodo de la componente principal a \(\boldsymbol{R}-\hat{\boldsymbol{\Psi}}\) para obtener \(\boldsymbol{\Lambda}\).

  2. Con los valores de \(\boldsymbol{\Lambda}\) se calculan las comunalidades \(\hat{h}_i^2\).

  3. Repita los pasos 2 a 4 tantas veces como sea necesario hasta que las comunalidades estimadas se estabilicen o converjan.

Nota: para realizar la estimacion a partir de \(\boldsymbol{\Sigma}\) se siguen pasos similares a los mostrados, consultar Diaz (2007) pagina 255 para detalles.

12 Método de máxima verosimilitud

Para estimar \(\boldsymbol{\Lambda}\) y la matriz de unicidades \(\boldsymbol{\Psi}\) se asume que:

  • Los factores \(f \sim Normal\),
  • Los errores \(U \sim Normal\),
  • y que \(\boldsymbol{\Phi}=\boldsymbol{I}\).

Sea \(X_1, X_2, \ldots, X_n\) una m.a. de una \(N_p(\boldsymbol{\mu},\boldsymbol{\Sigma})\), la funcion de verosimilitud \(L\) para esta muestra es:

Se demuestra que la maximizacion de \(l=\log(L)\) con respecto a \(\boldsymbol{\Lambda}\) y \(\boldsymbol{\Psi}\) conduce a las siguientes ecuaciones:

Estas ecuaciones se pueden resolver de forma iterativa usando por ejemplo el Me-todo Newton-Raphson.

13 Numero de factores a seleccionar

  1. Método 1: elegir \(k\) de tal manera que se explique al menos un porcentaje de varianza total.

  2. Método 2: escoger el valor de \(k\) como el número de valores propios mayores que la media de ellos mismos.

  3. Método 3: probar si \(k\) es un número adecuado de factores para ajustar la estructura de covarianza, es decir, se quiere probar \(H_0: \boldsymbol{\Sigma} = \boldsymbol{\Lambda} \boldsymbol{\Lambda}^T + \boldsymbol{\Psi}\). El estadistico de la prueba razon de verosimilitud para probar esta hipótesis es:

\[ -2 \log(\Lambda) = n \log \left ( \frac{\left | \hat{\boldsymbol{\Sigma}} \right |}{\left |\hat{\boldsymbol{S}} \right |} \right ) \]

la cual se distribuye aproximadamente como una \(\chi^2\) con \(\nu=0.5[(p-k)^2-p-k]\) grados de libertad, \(p\) número de variables y \(\boldsymbol{S}\) es la matriz covarianzas muestral.

14 Rotacion de factores

  • El objetivo de FA es la obtención de una estructura de factores.

  • La interpretación de las ponderaciones o coeficientes factoriales es adecuada si cada variable pondera altamente solo un factor determinado.

¿Que hacer para lograr una interpretación?

Se puede recurrir a una rotación, a continuación los dos tipos de rotaciones.

  1. Rotación ortogonal: varimax, quartimax, bentlerT, equamax, varimin, geominT y bifactor.

  2. Rotación oblicua: Promax, promax, oblimin, simplimax, bentlerQ, geominQ, biquartimin y cluster.

15 Interpretacion de los factores

  1. Identificar las variables cuyas correlaciones con el factor son las más elevadas en valor absoluto.

  2. Intentar dar un nombre a los factores. El nombre se asigna de acuerdo con la estructura de las correlaciones: Cuando es positiva (resp.negativa) la relación entre el factor y dicha variable es directa (resp. inversa).

  3. Una ayuda en la interpretación de los factores puede ser la representación gráfica de los resultados obtenidos. La representación se hace tomando los factores dos a dos. Cada factor representa un eje de coordenadas. A estos ejes se les denomina ejes factoriales.

  4. Eliminar las cargas factoriales bajas y de este modo suprimir información redundante.

  5. Generalmente, se toma como significativas las cargas superiores a 0.5 en valor absoluto.

  6. ¿Cuál es la interpretacion más correcta? Todo depende de la teoría que subyace al problema, esto llevar al analista a hacer más hincapie en una interpretación u otra.

16 Ejemplo

Supongamos que se tiene este resultado de una FA. ¿Cómo se podrían interpretar los factores?

Solución

  • Factor 1: nutricional

  • Factor 2: gustativo

17 Ejemplo de interpretación

A un grupo de estudiantes se les hicieron pruebas de matemáticas, física, química, inglés, historia y dibujo. El modelo ajustado con los pesos de los factores dentro de cada variable se muestra a continuación.

¿Cómo se podrían interpretar los factores?

Solución

  • Factor 1: ciencias

  • Factor 2: humanidad

18 factanal function

factanal(x, factors, data = NULL, covmat = NULL, 
         n.obs = NA, subset, na.action, start = NULL,
         scores = c("none", "regression", "Bartlett"),
         rotation = "varimax", control = NULL, ...)

Esta función está en el paquete base stats. La función factanal realiza un análisis factorial de máxima verosimilitud dada una matriz de covarianza o matriz de datos.

A continuación la explicación de cada argumento de la función.

  • x: A formula or a numeric matrix or an object that can be coerced to a numeric matrix.
  • factors: The number of factors to be fitted.
  • data: An optional data frame (or similar: see model.frame), used only if x is a formula. By default the variables are taken from environment(formula).
  • covmat: A covariance matrix, or a covariance list as returned by cov.wt. Of course, correlation matrices are covariance matrices.
  • n.obs: The number of observations, used if covmat is a covariance matrix.
  • subset: A specification of the cases to be used, if x is used as a matrix or formula.
  • na.action: The na.action to be used if x is used as a formula.
  • start: NULL or a matrix of starting values, each column giving an initial set of uniquenesses.
  • scores: Type of scores to produce, if any. The default is none, “regression” gives Thompson’s scores, “Bartlett” given Bartlett’s weighted least-squares scores. Partial matching allows these names to be abbreviated.
  • rotation: character. “varimax” or “promax” or “none”.

19 Ejemplo expectativa de vida

Los datos de la Tabla 5.1 (en Everitt & Hothorn (2011) página 148) muestran la esperanza de vida en años por país, edad y sexo. Los datos provienen de Keyfitz y Flieger (1971) y se relacionan con las expectativas de vida en la década de 1960.

Aplicar FA a los datos de expectativa de vida.

Solución

Primero vamos a cargar los datos.

url <- 'https://raw.githubusercontent.com/fhernanb/datos/master/life.txt'
life <- read.table(url, header=T)
rownames(life) <- life[, 1]  # Para nombrar las filas
life <- life[, -1]  # Eliminando la variable pais

Exploremos los datos.

life
                   m0 m25 m50 m75 w0 w25 w50 w75
Algeria            63  51  30  13 67  54  34  15
Cameroon           34  29  13   5 38  32  17   6
Madagascar         38  30  17   7 38  34  20   7
Mauritius          59  42  20   6 64  46  25   8
Reunion            56  38  18   7 62  46  25  10
Seychelles         62  44  24   7 69  50  28  14
SouthAfrica(C)     50  39  20   7 55  43  23   8
SouthAfrica(W)     65  44  22   7 72  50  27   9
Tunisia            56  46  24  11 63  54  33  19
Canada             69  47  24   8 75  53  29  10
CostaRica          65  48  26   9 68  50  27  10
DominicanRep       64  50  28  11 66  51  29  11
ElSalvador         56  44  25  10 61  48  27  12
Greenland          60  44  22   6 65  45  25   9
Grenada            61  45  22   8 65  49  27  10
Guatemala          49  40  22   9 51  41  23   8
Honduras           59  42  22   6 61  43  22   7
Jamaica            63  44  23   8 67  48  26   9
Mexico             59  44  24   8 63  46  25   8
Nicaragua          65  48  28  14 68  51  29  13
Panama             65  48  26   9 67  49  27  10
Trinidad(62)       64  63  21   7 68  47  25   9
Trinidad(67)       64  43  21   6 68  47  24   8
UnitedStates(66)   67  45  23   8 74  51  28  10
UnitedStates(NW66) 61  40  21  10 67  46  25  11
UnitedStates(W66)  68  46  23   8 75  52  29  10
UnitedStates(67)   67  45  23   8 74  51  28  10
Argentina          65  46  24   9 71  51  28  10
Chile              59  43  23  10 66  49  27  12
Colombia           58  44  24   9 62  47  25  10
Ecuador            57  46  28   9 60  49  28  11

Las variables anteriores se interpretan así: m0 es la expectativa de vida de los hombres al nacer, m25 es la expectativa de los hombres al cumplir los 25 años, …, w75 es la expectativa de vida de las mujeres de 75 años.

La matriz de correlación es:

R <- cor(life)  # Matriz de correlaciones
round(R, digits=2)
      m0  m25  m50  m75   w0  w25  w50  w75
m0  1.00 0.75 0.64 0.29 0.98 0.87 0.70 0.32
m25 0.75 1.00 0.67 0.39 0.69 0.72 0.65 0.39
m50 0.64 0.67 1.00 0.75 0.56 0.77 0.80 0.59
m75 0.29 0.39 0.75 1.00 0.25 0.55 0.69 0.71
w0  0.98 0.69 0.56 0.25 1.00 0.89 0.71 0.37
w25 0.87 0.72 0.77 0.55 0.89 1.00 0.94 0.68
w50 0.70 0.65 0.80 0.69 0.71 0.94 1.00 0.83
w75 0.32 0.39 0.59 0.71 0.37 0.68 0.83 1.00

La matriz de correlación representada en un gráfico.

corrplot::corrplot(R, method='ellipse')

Ahora el mismo gráfico pero agrupando las variables que más se correlacionan.

corrplot::corrplot(R, order="hclust", method='ellipse', addrect=3)

Aplicando FA usando factors=1

mod1 <- factanal(x=life, factors=1, rotation='none')
mod1

Call:
factanal(x = life, factors = 1, rotation = "none")

Uniquenesses:
   m0   m25   m50   m75    w0   w25   w50   w75 
0.238 0.470 0.399 0.696 0.217 0.005 0.117 0.532 

Loadings:
    Factor1
m0  0.873  
m25 0.728  
m50 0.776  
m75 0.552  
w0  0.885  
w25 0.998  
w50 0.940  
w75 0.684  

               Factor1
SS loadings      5.329
Proportion Var   0.666

Test of the hypothesis that 1 factor is sufficient.
The chi square statistic is 163.11 on 20 degrees of freedom.
The p-value is 1.88e-24 

Aplicando FA usando factors=2

mod2 <- factanal(x=life, factors=2, rotation='none')
mod2

Call:
factanal(x = life, factors = 2, rotation = "none")

Uniquenesses:
   m0   m25   m50   m75    w0   w25   w50   w75 
0.024 0.442 0.346 0.408 0.015 0.011 0.015 0.178 

Loadings:
    Factor1 Factor2
m0   0.917  -0.367 
m25  0.743         
m50  0.753   0.294 
m75  0.509   0.578 
w0   0.927  -0.355 
w25  0.990         
w50  0.914   0.386 
w75  0.630   0.652 

               Factor1 Factor2
SS loadings      5.291   1.270
Proportion Var   0.661   0.159
Cumulative Var   0.661   0.820

Test of the hypothesis that 2 factors are sufficient.
The chi square statistic is 45.24 on 13 degrees of freedom.
The p-value is 1.91e-05 

Aplicando FA usando factors=3

mod3 <- factanal(x=life, factors=3, rotation='none')
mod3

Call:
factanal(x = life, factors = 3, rotation = "none")

Uniquenesses:
   m0   m25   m50   m75    w0   w25   w50   w75 
0.005 0.362 0.066 0.288 0.005 0.011 0.020 0.146 

Loadings:
    Factor1 Factor2 Factor3
m0   0.982  -0.152         
m25  0.748   0.101   0.262 
m50  0.680   0.492   0.479 
m75  0.376   0.697   0.292 
w0   0.984  -0.144         
w25  0.943   0.311         
w50  0.803   0.577         
w75  0.464   0.772  -0.209 

               Factor1 Factor2 Factor3
SS loadings      4.843   1.807   0.447
Proportion Var   0.605   0.226   0.056
Cumulative Var   0.605   0.831   0.887

Test of the hypothesis that 3 factors are sufficient.
The chi square statistic is 6.73 on 7 degrees of freedom.
The p-value is 0.458 
Advertencia

De la anterior salida se puede aceptar \(H_0\) con tres factores es suficiente, ya que el valor-P es mayor que el valor usual de significancia.

Exploremos los elementos dentro del objeto mod3.

class(mod3)
[1] "factanal"
names(mod3)
 [1] "converged"    "loadings"     "uniquenesses" "correlation"  "criteria"    
 [6] "factors"      "dof"          "method"       "STATISTIC"    "PVAL"        
[11] "n.obs"        "call"        

Aplicando la función genérica S3 print al objeto mod3.

print(mod3, digits=2, cutoff=0.5, sort=TRUE)

Call:
factanal(x = life, factors = 3, rotation = "none")

Uniquenesses:
  m0  m25  m50  m75   w0  w25  w50  w75 
0.00 0.36 0.07 0.29 0.00 0.01 0.02 0.15 

Loadings:
    Factor1 Factor2 Factor3
m0   0.98                  
m25  0.75                  
m50  0.68                  
w0   0.98                  
w25  0.94                  
w50  0.80    0.58          
m75          0.70          
w75          0.77          

               Factor1 Factor2 Factor3
SS loadings       4.84    1.81    0.45
Proportion Var    0.61    0.23    0.06
Cumulative Var    0.61    0.83    0.89

Test of the hypothesis that 3 factors are sufficient.
The chi square statistic is 6.73 on 7 degrees of freedom.
The p-value is 0.458 

De la tabla anterior vemos que no es fácil interpretar los factores, exploremos con una rotación.

Usando rotación varimax

mod_varimax <- factanal(x=life, factors=3, rotation='varimax')
print(mod_varimax$loadings, digits=2, cutoff=0.5, sort=TRUE)

Loadings:
    Factor1 Factor2 Factor3
m0  0.96                   
m25 0.65                   
w0  0.97                   
w25 0.76    0.56           
w50 0.54    0.73           
w75         0.87           
m50                 0.79   
m75         0.52    0.66   

               Factor1 Factor2 Factor3
SS loadings       3.37    2.08    1.64
Proportion Var    0.42    0.26    0.21
Cumulative Var    0.42    0.68    0.89

Usando los resultados anteriores podríamos explicar los factores así:

  • Factor 1: está muy relacionado con la esperanza de vida en el nacimiento para mujeres y hombres.
  • Factor 2: refleja la esperanza de vida para las mujeres de edades más avanzadas.
  • Factor 3: refleja la esperanza de vida para los hombres de edades más avanzadas.

Para obtener los scores se debe ajustar nuevamente el modelo y pedirlos explicitamente si no se solicitaron antes.

scores <- factanal(x=life, factors=3, rotation='varimax', 
                   scores="regression")$scores
head(scores)
              Factor1    Factor2     Factor3
Algeria    -0.2580626  1.9009577  1.91581631
Cameroon   -2.7824958 -0.7234001 -1.84772224
Madagascar -2.8064282 -0.8115882 -0.01210318
Mauritius   0.1410049 -0.2902845 -0.85862443
Reunion    -0.1963521  0.4742992 -1.55046466
Seychelles  0.3673713  0.8290238 -0.55214085

La función plot_obsfa se utiliza para dibujar las observaciones en los primeros planos de los factores. A esta función ingresa la matriz de scores y los factores a dibujar en eje X y eje Y.

model::plot_obsfa(scores, fx=1, fy=2, col='blue', pch=20)

model::plot_obsfa(scores, fx=1, fy=3, col='red', pch=20)

model::plot_obsfa(scores, fx=2, fy=3, col='darkgreen', pch=20)

library(psych)
fa.diagram(mod_varimax$loadings)

Usando rotación promax.

mod_promax <- factanal(life, factors=3, rotation='promax')
print(mod_promax, digits=2, cutoff=0.4, sort=TRUE)

Call:
factanal(x = life, factors = 3, rotation = "promax")

Uniquenesses:
  m0  m25  m50  m75   w0  w25  w50  w75 
0.00 0.36 0.07 0.29 0.00 0.01 0.02 0.15 

Loadings:
    Factor1 Factor2 Factor3
m0   1.02                  
m25  0.53            0.44  
w0   1.07                  
w25  0.67    0.44          
w50          0.66          
w75          0.98          
m50                  0.94  
m75                  0.73  

               Factor1 Factor2 Factor3
SS loadings       3.12    1.74    1.67
Proportion Var    0.39    0.22    0.21
Cumulative Var    0.39    0.61    0.82

Factor Correlations:
        Factor1 Factor2 Factor3
Factor1    1.00    0.51    0.62
Factor2    0.51    1.00    0.72
Factor3    0.62    0.72    1.00

Test of the hypothesis that 3 factors are sufficient.
The chi square statistic is 6.73 on 7 degrees of freedom.
The p-value is 0.458