Apunte 15 — Análisis factorial exploratorio con psych::fa()

Analítica de Personas · Semestre otoño 2026 · Semana 6 · Prof. René Gempp

1. La intuición del factor latente

Cuando aplicamos una encuesta de 25 ítems Likert sobre experiencia del empleado, los ítems no son independientes entre sí: las personas que responden alto a "Mi jefatura me da retroalimentación útil" tienden a responder alto también a "Mi jefatura me apoya cuando lo necesito". Esa covariación sistemática entre los ítems sugiere que detrás de ellos hay algo común —una dimensión latente, no medida directamente, pero que explica por qué los ítems se mueven juntos.

El análisis factorial exploratorio (EFA) es la herramienta estadística que estima estos factores latentes a partir de la matriz de correlaciones de los ítems. Responde a la pregunta:

¿Cuántas dimensiones latentes subyacen a este conjunto de ítems, y qué ítems "cargan" en cada dimensión?

Un buen EFA produce una matriz de cargas factoriales donde cada ítem tiene una carga grande en uno (y solo uno) de los factores, y cargas pequeñas en los demás. Cuando eso ocurre, podemos nombrar cada factor en lenguaje sustantivo (liderazgo, desarrollo, etc.) y construir puntajes promedio para usarlos en análisis posteriores —por ejemplo, como predictores en una regresión.

2. EFA vs. PCA: una distinción que importa

Es muy común confundir el análisis factorial exploratorio (EFA) con el análisis de componentes principales (PCA). Comparten matemáticas similares y a primera vista producen outputs parecidos, pero son conceptualmente distintos:

PCA (Principal Components Analysis)EFA (Exploratory Factor Analysis)
Pregunta¿Cómo reduzco dimensionalidad sin perder varianza?¿Qué constructos latentes generan estos ítems?
ModeloComponentes = combinaciones lineales de ítemsÍtems = combinaciones lineales de factores latentes + error
Varianza modeladaToda (común + única + error)Solo la varianza compartida entre ítems
En Rpsych::principal() o prcomp()psych::fa()
Cuándo usarReducir dimensiones para visualización o MLIdentificar dimensiones psicológicas detrás de una encuesta
Para encuestas organizacionales: usa EFA, no PCA La razón conceptual es que PCA modela toda la varianza —incluyendo la varianza específica de cada ítem y el error de medición—, mientras que EFA modela solo la varianza compartida entre ítems. Como las encuestas Likert tienen mucho error de medición ítem por ítem, atribuirlo todo a "componentes" infla artificialmente las cargas. EFA es la elección teóricamente correcta.

3. Las cuatro decisiones del EFA

Hacer un EFA en psych::fa() requiere tomar cuatro decisiones. Las tres primeras son los argumentos del comando; la cuarta es interpretativa.

DecisiónArgumento en fa()Lo que enseñamos
Cuántos factores extraernfactorsAnálisis paralelo de Horn con fa.parallel()
Método de extracciónfm"minres" (default; mínimos residuos)
Tipo de rotaciónrotate"oblimin" (oblicua)
Umbral de cargas para "saturar"(decisión interpretativa)0,40

4. Decisión 1: ¿cuántos factores extraer?

Esta es la pregunta más debatida del EFA. Históricamente se han propuesto varios criterios:

  1. Kaiser (eigenvalues > 1): el más antiguo y el más usado en cursos introductorios. Cuenta cuántos factores tienen un eigenvalue mayor a 1. Problema: tiende a sobreestimar el número de factores, especialmente con muchos ítems.
  2. Scree plot visual: graficar los eigenvalues ordenados y "ver" el codo. Subjetivo y reproducible solo a medias.
  3. Análisis paralelo de Horn (Horn, 1965): compara los eigenvalues observados con los eigenvalues que se obtendrían si los datos fueran completamente aleatorios. Se retienen tantos factores como eigenvalues observados excedan los simulados.
  4. MAP de Velicer (1976): minimum average partial. Otro criterio cuantitativo, también recomendado.

El consenso de la literatura psicométrica moderna (Zwick & Velicer, 1986; Fabrigar et al., 1999) es que el análisis paralelo es el método más preciso. En psych está disponible como fa.parallel().

# Análisis paralelo: ¿cuántos factores retener?
items_todos <- datos |> select(starts_with("item_"))

psych::fa.parallel(items_todos,
                   fa     = "fa",    # para EFA (alternativa: "pc" o "both")
                   n.iter = 50,       # número de simulaciones aleatorias
                   main   = "Análisis paralelo: encuesta engagement")

El output es un gráfico con dos curvas: la línea azul son los eigenvalues observados, y la línea roja son los eigenvalues promedio bajo datos aleatorios. La función imprime también en consola un mensaje del tipo:

Parallel analysis suggests that the number of factors =  5  and the number of components =  5

Ese 5 es la respuesta. La regla operativa: retén tantos factores como eigenvalues observados estén por encima de los simulados.

5. Decisión 2: el método de extracción

El argumento fm de fa() controla cómo se estiman las cargas. Las opciones más comunes:

OpciónNombre completoCuándo usar
"minres"Mínimos residuos (default)Robusto, no requiere normalidad multivariada. Es el default y la elección segura.
"ml"Máxima verosimilitudRequiere normalidad multivariada. Permite calcular índices de ajuste tipo SEM (RMSEA, CFI). Útil si vas a hacer comparación de modelos.
"pa"Factores principalesMétodo clásico de la psicometría tradicional. Hoy menos recomendado.

Para esta clase usamos fm = "minres". Si en una tesis necesitas índices de ajuste, migra a fm = "ml" y reporta CFI > 0,95, RMSEA < 0,06, SRMR < 0,08 como criterios estándar (Hu & Bentler, 1999).

6. Decisión 3: la rotación

La rotación es un paso de post-procesamiento que reordena los factores para hacerlos más interpretables. Un EFA sin rotar produce típicamente cargas dispersas y difíciles de leer; con rotación, los ítems "se asientan" en sus factores de manera más limpia.

Hay dos grandes familias:

TipoEjemplosSupuesto sobre los factores
Ortogonalvarimax, quartimaxLos factores son independientes (correlación = 0)
Oblicuaoblimin, promaxLos factores están correlacionados
En psicología organizacional, casi siempre usa rotación oblicua Las dimensiones de la experiencia laboral —liderazgo, desarrollo, reconocimiento, propósito— están casi siempre correlacionadas en datos reales: las áreas con buen liderazgo también tienden a ofrecer mejor desarrollo. Suponer ortogonalidad es teóricamente injustificado y produce cargas menos interpretables. Fabrigar et al. (1999) son enfáticos en este punto: el default de la psicometría organizacional moderna es oblimin.
fa_res <- psych::fa(items_todos,
                    nfactors = 5,
                    rotate   = "oblimin",
                    fm       = "minres")

Cuando usas rotación oblicua, fa() te entrega tres matrices distintas, no una:

Reportar $Phi en el informe es un signo de rigor: muestra cuán correlacionadas están las dimensiones extraídas y justifica la elección de rotación oblicua.

7. Lectura de la matriz de cargas

Después de ajustar el modelo, la matriz de cargas es lo central. Para mostrarla limpia, usa el método print() con un cutoff:

# Mostrar solo cargas |x| >= 0.40, ordenadas por factor
print(fa_res$loadings, cutoff = 0.40, sort = TRUE)
Loadings:
            MR1    MR2    MR3    MR4    MR5
item_lid_01  0.78
item_lid_03  0.76
item_lid_02  0.74
item_lid_05  0.72
item_lid_04  0.69
item_des_01         0.75
item_des_03         0.73
item_des_05         0.71
item_des_02         0.69
item_des_04         0.66
item_rec_05                0.74
item_rec_01                0.71
item_rec_03                0.68
item_rec_02                0.67
item_rec_04                0.64
item_car_04                       0.74
item_car_02                       0.72
item_car_05                       0.70
item_car_01                       0.69
item_car_03                       0.67
item_pro_01                              0.76
item_pro_04                              0.73
item_pro_02                              0.71
item_pro_03                              0.69
item_pro_05                              0.68

                 MR1   MR2   MR3   MR4   MR5
SS loadings    2.87  2.65  2.43  2.55  2.52
Proportion Var 0.11  0.11  0.10  0.10  0.10
Cumulative Var 0.11  0.22  0.32  0.42  0.52

Lectura paso a paso:

  1. Cada columna es un factor (MR1, MR2, ... MR5; las siglas vienen de minimum residuals).
  2. Cada fila es un ítem. Si el ítem cargó "limpio", verás un solo número en su fila (los demás están en blanco porque están bajo el cutoff de 0,40).
  3. Identifica el factor de cada ítem. Aquí los ítems item_lid_* cargan en MR1, los item_des_* en MR2, etc.
  4. Nombra cada factor en lenguaje sustantivo. No reportes "MR1" en tu informe al VP. Reporta "Liderazgo".
  5. Mira la fila SS loadings: es la suma de cuadrados de las cargas de ese factor. Refleja qué tanto del fenómeno "explica" cada factor.
  6. Mira Cumulative Var: el porcentaje acumulado de varianza explicada por todos los factores juntos. En encuestas Likert es habitual quedarse entre 40 y 60 %.

8. Cargas cruzadas e ítems "huérfanos"

El mundo real no siempre produce matrices tan limpias como la del ejemplo. Pueden aparecer dos patrones problemáticos:

8.1 Cargas cruzadas

Un ítem que carga > 0,40 en dos o más factores. Esto significa que el ítem está midiendo dos cosas a la vez, o que los dos factores no están bien diferenciados.

item_amb_07  0.45    0.51                 (carga en MR1 y MR2)

Qué hacer:

8.2 Ítems huérfanos

Un ítem cuya carga máxima en cualquier factor es < 0,40. Está "suelto" — no pertenece claramente a ningún constructo.

Qué hacer: revisa la redacción del ítem. ¿Es ambiguo? ¿Mide algo distinto al resto de la encuesta? Lo más probable es que tengas que eliminarlo antes de construir puntajes de sub-escala.

9. Lo que queda fuera de este apunte (y dónde profundizar)

EFA es la puerta de entrada al modelado de factores latentes, pero hay un universo mucho más amplio que conviene conocer si harás una tesis empírica:

Para profundizar El manual de referencia del paquete psych de William Revelle (disponible gratuitamente en https://personality-project.org/r/psych) es la mejor introducción técnica a EFA en R. Para el marco conceptual completo: Fabrigar, L. R., Wegener, D. T., MacCallum, R. C., & Strahan, E. J. (1999). Evaluating the use of exploratory factor analysis in psychological research. Psychological Methods, 4(3), 272–299.

10. Resumen: el flujo del EFA

  1. Selecciona los ítems que quieres factorizar. Asegúrate de que están en escala numérica y los reversos están recodificados.
  2. Corre fa.parallel() para decidir cuántos factores extraer.
  3. Ajusta el modelo con fa(items, nfactors = k, rotate = "oblimin", fm = "minres").
  4. Examina la matriz de cargas con print(..., cutoff = 0.40, sort = TRUE).
  5. Identifica el factor de cada ítem y nombra cada factor en lenguaje de negocio.
  6. Examina $Phi: las correlaciones entre factores justifican (o no) la rotación oblicua.
  7. Detecta cargas cruzadas e ítems huérfanos. Decide qué hacer con ellos y documenta tu decisión.
  8. Construye los puntajes promedio de cada sub-escala con rowMeans() para análisis posteriores (regresión, etc.).