Introducción al análisis factorial común

El análisis factorial es un nombre genérico que se asigna a una clase de métodos estadísticos MVA cuyo propósito principal es definir la estructura subyacente en una matriz de datos. Generalmente hablando, aborda el problema de cómo analizar la estructura de las interrelaciones (correlaciones) entre un gran número de variables (por ejemplo, las puntuaciones de pruebas de cuestionarios) con la definición de una serie de dimensiones subyacentes comunes, conocidas como factores. Mediante el análisis factorial, es posible identificar primero las dimensiones separadas de la estructura y entonces determinar el grado en que se justifica cada variable por cada dimensión. Una vez que se determinan estas dimensiones y la explicación de cada variable, se pueden lograr los dos objetivos principales para el análisis factorial: el resumen y la reducción de la dimensionalidad de los datos. A la bora de resumir los datos, con el análisis factorial se obtienen unas dimensiones subyacentes que, cuando son interpretadas y comprendidas, describen los datos con un número de conceptos mucho más reducido que las variables individuales originales. Se puede obtener la reducción de datos con el cálculo de la puntuación para cada dimension subyacente y sustituirlos por las variables originales.

Problema de investigación

En el siguiente ejemplo, emplearemos la base de datos autocuidado.csv’` que contiene una muestra de respuestas a un cuestionario psicométrico sobre el autocuidado recogidas durante la primera ola de la pandemia por COVID-19 (Abril de 2020) en población general colombiana. Estos resultados pertenecen a la validación de la SASS-14 (Martínez et al., 2021, https://doi.org/10.1186/s12955-020-01607-6).

Se aplicará un análisis factorial común a los datos procedentes de un cuestionario de autocuidado percibido compuesto por 11 elementos -medidos en escala Likert de 1 (absolutamente en desacuerdo) a 6 (absolutamente de acuerdo)- detallados a continuación:

  • AC_1. Estoy alerta de los cambios en mi salud
  • AC_2. Por lo general, soy consciente de mi salud
  • AC_3. Reflexiono mucho sobre mi salud
  • AC_4. Generalmente, estoy atenta/o a mis sentimientos con respecto a mi salud
  • AC_5. Estoy constantemente examinando mi salud
  • AC_6. Realizo actividad física (algún deporte, yoga o baile) durante al menos 30 minutos diarios
  • AC_7. Como tres porciones de fruta y dos de verdura diariamente
  • AC_8. Considero que estoy comiendo mejor que antes (menos azúcar, sal, aperitivos fritos o comida precocinada)
  • AC_9. Estoy bebiendo una media de 8 vasos de agua diarios
  • AC_10. Duermo entre 7-8 horas diarias
  • AC_11. Considero que mi descanso es de calidad

Además, tres variables numéricas adicionales recogen la edad, sexo (1=Femenino, 2=Masculino) y un identificador de los participantes. Los datos recogidos pertenecen a una n = 226 individuos con edades comprendidas entre los 19 y los 80 años (edad media = 38.3, 124 mujeres).

El objetivo de la investigación es descubrir la estructura subyacente en la matriz de datos compuesta por estos 11 ítems. Es decir, tratamos de averiguar si los elementos que contiene el cuestionario sobre autocuidado se agrupan en factores específicos con un peso o carga suficiente, para lo cual pensamos aplicar la técnica MVA del análisis factorial. Como hipótesis previa, sabemos que estos elementos deben representar el concepto de autocuidado (dado que han sido validados previamente) y que a groso modo, se pueden esperar al menos 3 componentes del autocuidado, como son (1) la conciencia sobre la salud, (2) la alimentación y la actividad física, y (3) el descanso. El código con comandos R de este ejemplo está disponible en el archivo AF_autocuidado.R.

Diseño de la investigación mediante el análisis factorial común

El diseño de un análisis factorial implica tres decisiones básicas: (1) el cálculo de los datos de entrada (una matriz de correlación) para alcanzar los objetivos específicos de la agrupación de variables; (2) el diseño del estudio en términos de número de variables, las propiedades de medición de las variables y los tipos de las variables permisibles; y (3) el tamaño de muestra necesario, tanto en términos absolutos como para la función del número de variables en el análisis.

El procedimiento general del análisis factorial es el siguiente: (1) preparar los datos y comprobar la adecuación de la matriz de datos para un análisis factorial; (2) decidir el número de factores a extraer y el método de extracción; (3) extraer y rotar los factores, (4) re-evaluar pasos 2 y 3, y (5) interpretar y escribir los resultados. Dado que la base de datos csv está delimitada por “;” en vez de “,” y los decimales por “,” en vez de “.”, se emplea la función read_csv2() para importar los datos.

autocuidado <- read.csv2("autocuidado.csv", header = TRUE)

Comprobemos, a través del comando summary() que disponemos de 14 variables, que no existen datos ausentes, y que las respuestas de los elementos (AC_1 a AC_11) están codificadas de 1 a 6. También podemos comprobar los estadísticos descriptivos de cada variable.

summary(autocuidado)
##        id              edad            sexo            AC_1     
##  Min.   :  1.00   Min.   :19.00   Min.   :1.000   Min.   :2.00  
##  1st Qu.: 57.25   1st Qu.:27.00   1st Qu.:1.000   1st Qu.:5.00  
##  Median :113.50   Median :37.00   Median :1.000   Median :6.00  
##  Mean   :113.50   Mean   :38.31   Mean   :1.451   Mean   :5.46  
##  3rd Qu.:169.75   3rd Qu.:48.00   3rd Qu.:2.000   3rd Qu.:6.00  
##  Max.   :226.00   Max.   :80.00   Max.   :2.000   Max.   :6.00  
##       AC_2            AC_3            AC_4        AC_5            AC_6      
##  Min.   :3.000   Min.   :1.000   Min.   :1   Min.   :1.000   Min.   :1.000  
##  1st Qu.:5.000   1st Qu.:4.000   1st Qu.:4   1st Qu.:3.000   1st Qu.:2.000  
##  Median :6.000   Median :5.000   Median :5   Median :5.000   Median :3.500  
##  Mean   :5.345   Mean   :4.934   Mean   :5   Mean   :4.407   Mean   :3.473  
##  3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6   3rd Qu.:6.000   3rd Qu.:5.000  
##  Max.   :6.000   Max.   :6.000   Max.   :6   Max.   :6.000   Max.   :6.000  
##       AC_7            AC_8            AC_9           AC_10           AC_11     
##  Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.00  
##  1st Qu.:2.000   1st Qu.:3.000   1st Qu.:2.000   1st Qu.:4.000   1st Qu.:4.00  
##  Median :3.000   Median :4.000   Median :3.000   Median :5.000   Median :5.00  
##  Mean   :3.341   Mean   :3.876   Mean   :3.527   Mean   :4.783   Mean   :4.58  
##  3rd Qu.:4.000   3rd Qu.:5.000   3rd Qu.:5.000   3rd Qu.:6.000   3rd Qu.:6.00  
##  Max.   :6.000   Max.   :6.000   Max.   :6.000   Max.   :6.000   Max.   :6.00

Codificamos la variable sexo como factor y comprobamos su frecuencia. Esto nos permitiría realizar un diagrama de cajas para diferenciar las respuestas a alguno de los elementos por sexo.

library(psych)
## Warning: package 'psych' was built under R version 4.0.3
autocuidado$sexo <- factor(autocuidado$sexo, levels=c(1:2), labels = c("Femenino" , "Masculino"))
table(autocuidado$sexo)
## 
##  Femenino Masculino 
##       124       102
describe(autocuidado)
##       vars   n   mean    sd median trimmed   mad min max range  skew kurtosis
## id       1 226 113.50 65.38  113.5  113.50 83.77   1 226   225  0.00    -1.22
## edad     2 226  38.31 12.40   37.0   37.65 14.83  19  80    61  0.46    -0.50
## sexo*    3 226   1.45  0.50    1.0    1.44  0.00   1   2     1  0.19    -1.97
## AC_1     4 226   5.46  0.88    6.0    5.64  0.00   2   6     4 -1.58     1.65
## AC_2     5 226   5.35  0.87    6.0    5.49  0.00   3   6     3 -1.20     0.56
## AC_3     6 226   4.93  1.15    5.0    5.09  1.48   1   6     5 -0.95     0.36
## AC_4     7 226   5.00  1.12    5.0    5.17  1.48   1   6     5 -1.05     0.65
## AC_5     8 226   4.41  1.35    5.0    4.52  1.48   1   6     5 -0.43    -0.78
## AC_6     9 226   3.47  1.75    3.5    3.47  2.22   1   6     5 -0.04    -1.36
## AC_7    10 226   3.34  1.44    3.0    3.31  1.48   1   6     5  0.15    -0.82
## AC_8    11 226   3.88  1.57    4.0    3.97  1.48   1   6     5 -0.33    -0.97
## AC_9    12 226   3.53  1.61    3.0    3.53  1.48   1   6     5  0.03    -1.12
## AC_10   13 226   4.78  1.19    5.0    4.91  1.48   1   6     5 -0.77    -0.31
## AC_11   14 226   4.58  1.29    5.0    4.71  1.48   1   6     5 -0.64    -0.54
##         se
## id    4.35
## edad  0.82
## sexo* 0.03
## AC_1  0.06
## AC_2  0.06
## AC_3  0.08
## AC_4  0.07
## AC_5  0.09
## AC_6  0.12
## AC_7  0.10
## AC_8  0.10
## AC_9  0.11
## AC_10 0.08
## AC_11 0.09

Preparamos un dataframe con la matriz de datos de entrada del análisis factorial, que contiene las 226 observaciones de los 11 ítems.

datos <- autocuidado[1:226, c("AC_1","AC_2","AC_3","AC_4","AC_5","AC_6",
                              "AC_7","AC_8","AC_9","AC_10","AC_11")]

La función scatterplotMatrix() de la librería car permite la realización de diagramas de dispresión de todas las variables junto con el histograma de las distribuciones de los datos que contienen.

library("car")
## Warning: package 'car' was built under R version 4.0.5
## Loading required package: carData
## Warning: package 'carData' was built under R version 4.0.3
## 
## Attaching package: 'car'
## The following object is masked from 'package:psych':
## 
##     logit
scatterplotMatrix(datos)

La función rcorr.adjust() de la librería RcmdrMisc permite determinar la matriz de correlaciones de las variables:

library(RcmdrMisc)
## Warning: package 'RcmdrMisc' was built under R version 4.0.5
## Loading required package: sandwich
## Warning: package 'sandwich' was built under R version 4.0.3
rcorr.adjust(datos)
## 
##  Pearson correlations:
##         AC_1   AC_2   AC_3   AC_4   AC_5   AC_6   AC_7   AC_8   AC_9  AC_10
## AC_1  1.0000 0.6553 0.5658 0.4991 0.4800 0.1664 0.2445 0.2341 0.1549 0.1505
## AC_2  0.6553 1.0000 0.5057 0.4900 0.4338 0.1251 0.1859 0.1610 0.0918 0.2474
## AC_3  0.5658 0.5057 1.0000 0.7150 0.6392 0.1301 0.2099 0.1231 0.1128 0.0704
## AC_4  0.4991 0.4900 0.7150 1.0000 0.6281 0.1037 0.1927 0.1484 0.1552 0.1790
## AC_5  0.4800 0.4338 0.6392 0.6281 1.0000 0.1711 0.2618 0.2805 0.2525 0.1209
## AC_6  0.1664 0.1251 0.1301 0.1037 0.1711 1.0000 0.3200 0.3548 0.4869 0.2212
## AC_7  0.2445 0.1859 0.2099 0.1927 0.2618 0.3200 1.0000 0.5162 0.3860 0.3335
## AC_8  0.2341 0.1610 0.1231 0.1484 0.2805 0.3548 0.5162 1.0000 0.3726 0.2911
## AC_9  0.1549 0.0918 0.1128 0.1552 0.2525 0.4869 0.3860 0.3726 1.0000 0.1874
## AC_10 0.1505 0.2474 0.0704 0.1790 0.1209 0.2212 0.3335 0.2911 0.1874 1.0000
## AC_11 0.1789 0.2084 0.0529 0.1164 0.0856 0.2884 0.4152 0.2478 0.2080 0.6647
##        AC_11
## AC_1  0.1789
## AC_2  0.2084
## AC_3  0.0529
## AC_4  0.1164
## AC_5  0.0856
## AC_6  0.2884
## AC_7  0.4152
## AC_8  0.2478
## AC_9  0.2080
## AC_10 0.6647
## AC_11 1.0000
## 
##  Number of observations: 226 
## 
##  Pairwise two-sided p-values:
##       AC_1   AC_2   AC_3   AC_4   AC_5   AC_6   AC_7   AC_8   AC_9   AC_10 
## AC_1         <.0001 <.0001 <.0001 <.0001 0.0123 0.0002 0.0004 0.0198 0.0236
## AC_2  <.0001        <.0001 <.0001 <.0001 0.0603 0.0050 0.0154 0.1690 0.0002
## AC_3  <.0001 <.0001        <.0001 <.0001 0.0508 0.0015 0.0646 0.0908 0.2921
## AC_4  <.0001 <.0001 <.0001        <.0001 0.1199 0.0036 0.0257 0.0196 0.0070
## AC_5  <.0001 <.0001 <.0001 <.0001        0.0100 <.0001 <.0001 0.0001 0.0697
## AC_6  0.0123 0.0603 0.0508 0.1199 0.0100        <.0001 <.0001 <.0001 0.0008
## AC_7  0.0002 0.0050 0.0015 0.0036 <.0001 <.0001        <.0001 <.0001 <.0001
## AC_8  0.0004 0.0154 0.0646 0.0257 <.0001 <.0001 <.0001        <.0001 <.0001
## AC_9  0.0198 0.1690 0.0908 0.0196 0.0001 <.0001 <.0001 <.0001        0.0047
## AC_10 0.0236 0.0002 0.2921 0.0070 0.0697 0.0008 <.0001 <.0001 0.0047       
## AC_11 0.0070 0.0016 0.4285 0.0807 0.1998 <.0001 <.0001 0.0002 0.0017 <.0001
##       AC_11 
## AC_1  0.0070
## AC_2  0.0016
## AC_3  0.4285
## AC_4  0.0807
## AC_5  0.1998
## AC_6  <.0001
## AC_7  <.0001
## AC_8  0.0002
## AC_9  0.0017
## AC_10 <.0001
## AC_11       
## 
##  Adjusted p-values (Holm's method)
##       AC_1   AC_2   AC_3   AC_4   AC_5   AC_6   AC_7   AC_8   AC_9   AC_10 
## AC_1         <.0001 <.0001 <.0001 <.0001 0.2085 0.0060 0.0108 0.2938 0.3073
## AC_2  <.0001        <.0001 <.0001 <.0001 0.6033 0.1060 0.2469 0.6759 0.0052
## AC_3  <.0001 <.0001        <.0001 <.0001 0.5583 0.0392 0.6033 0.6033 0.6759
## AC_4  <.0001 <.0001 <.0001        <.0001 0.6033 0.0837 0.3082 0.2938 0.1394
## AC_5  <.0001 <.0001 <.0001 <.0001        0.1794 0.0022 0.0006 0.0040 0.6033
## AC_6  0.2085 0.6033 0.5583 0.6033 0.1794        <.0001 <.0001 <.0001 0.0219
## AC_7  0.0060 0.1060 0.0392 0.0837 0.0022 <.0001        <.0001 <.0001 <.0001
## AC_8  0.0108 0.2469 0.6033 0.3082 0.0006 <.0001 <.0001        <.0001 0.0003
## AC_9  0.2938 0.6759 0.6033 0.2938 0.0040 <.0001 <.0001 <.0001        0.1035
## AC_10 0.3073 0.0052 0.6759 0.1394 0.6033 0.0219 <.0001 0.0003 0.1035       
## AC_11 0.1394 0.0408 0.6759 0.6033 0.6759 0.0004 <.0001 0.0052 0.0408 <.0001
##       AC_11 
## AC_1  0.1394
## AC_2  0.0408
## AC_3  0.6759
## AC_4  0.6033
## AC_5  0.6759
## AC_6  0.0004
## AC_7  <.0001
## AC_8  0.0052
## AC_9  0.0408
## AC_10 <.0001
## AC_11

El comando KMO() ejecuta la prueba de Kaiser-Meyer Olkin para comprobar la adecuación de los datos de cara a realizar un análisis factorial. Kaiser proporcionó los siguientes valores para interpretar estos resultados del valor de KMO:

  • 0.00 a 0.49 inaceptable
  • 0.50 a 0.59 miserable
  • 0.60 a 0.69 mediocre
  • 0.70 a 0.79 regular
  • 0.80 a 0.89 meritorio
  • 0.90 a 1.00 maravilloso
library(RcmdrMisc)
KMO(datos)
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = datos)
## Overall MSA =  0.79
## MSA for each item = 
##  AC_1  AC_2  AC_3  AC_4  AC_5  AC_6  AC_7  AC_8  AC_9 AC_10 AC_11 
##  0.82  0.82  0.80  0.83  0.87  0.77  0.81  0.78  0.77  0.67  0.66

Los resultados de la prueba KMO indican una medida general de 0.79, que está entre el límite de un resultado regular y meritorio. De forma individual, se observa un valor mediocre de estos valores en las variables AC_10 y AC_11. Vistos estos resultados, podríamos tomar la alternativa de descartar estos ítems (o mejorar su redacción, dado que están en el límite aceptable; aunque también deberían considerarse el impacto de otros factores como el tamaño de la muestra). No obstante, continuaremos el procedimiento considerando que la matriz de datos es adecuada para realizar el análisis.

La prueba de Bartlett compara la matriz de correlación con una matriz de identidad (una matriz llena de ceros). Es decir, la prueba de Bartlett le permite descartar que las variables en el conjunto de datos no estén esencialmente correlacionadas. Si no puede rechazar la hipótesis nula para esta prueba, entonces también puede detenerse. Todas las variables son esencialmente diferentes entre sí.

cortest.bartlett(datos)
## R was not square, finding R from data
## $chisq
## [1] 964.1582
## 
## $p.value
## [1] 2.776857e-166
## 
## $df
## [1] 55

Estimación del número de factores a extraer

En teoría, podríamos obtener tantos factores como variables. Pero eso, por supuesto, anula el propósito de realizar un análisis factorial. Más bien, buscamos una estructura latente dentro de un conjunto de datos. Por lo tanto, sólo nos interesarán los factores que expliquen una proporción sustancial de la variación dentro de los datos. Veamos alguna forma de cómo estimar el número de factores a retener. En primer lugar, se puede realizar un scree plot para comprobar los valores propios de los factores estimados. A continuación, podríamos aplicar la Regla de Kaiser y retener aquellos factores con un valor propio mayor que uno.

ev <- eigen(cor(datos)) 
ev$values
##  [1] 3.9457693 2.1026775 1.2197267 0.7650510 0.7076494 0.5159242 0.5025966
##  [8] 0.3621204 0.3423111 0.2827539 0.2534200

A partir del criterio de Kaiser, retendríamos los tres primeros factores, puesto que tienen un valor propio mayor que uno (3.94, 2.10, y 1.22).

El análisis paralelo es una técnica alternativa que compara la matriz de datos observados con la de una matriz de datos aleatoria del mismo tamaño que la original. Esto se puede hacer para datos continuos, dicotómicos o politómicos utilizando correlaciones de Pearson, tetracóricas o policóricas.

fa.parallel(datos, fa="fa")
## Warning in fa.stats(r = r, f = f, phi = phi, n.obs = n.obs, np.obs = np.obs, :
## The estimated weights for the factor scores are probably incorrect. Try a
## different factor score estimation method.

## Warning in fa.stats(r = r, f = f, phi = phi, n.obs = n.obs, np.obs = np.obs, :
## The estimated weights for the factor scores are probably incorrect. Try a
## different factor score estimation method.

## Parallel analysis suggests that the number of factors =  3  and the number of components =  NA

Del mismo modo que ocurría con el criterio de Kaiser, el análisis paralelo sugiere que se retengan 3 factores de la matriz de datos observados.

Extracción y rotación de los factores

Ahora que tenemos una idea de cuántos factores extraer, podemos comenzar el análisis factorial ayudados por la función factanal(). Pero, todavía necesitamos tomar otra decisión importante: cómo planeamos rotar los factores. Podemos pensar en la rotación de factores como si fuera similar a enfocar un telescopio. Básicamente, estamos buscando una asociación más clara entre los factores individuales y las diversas variables. La forma en que haga esto dependerá de su suposición acerca de si los factores deben estar correlacionados entre sí. En este caso, apoyado por las rotaciones aplicadas en herramientas psicométricas anteriores del mismo constructo (autocuidado) y los supuestos de la teoría subyacente, se decide aplicar una rotación ortogonal varimax a los 3 factores que se extraerán.

Nfacs <- 3  
fit <- factanal(datos, Nfacs, rotation="varimax")
print(fit, digits=2, cutoff=0.3, sort=TRUE)
## 
## Call:
## factanal(x = datos, factors = Nfacs, rotation = "varimax")
## 
## Uniquenesses:
##  AC_1  AC_2  AC_3  AC_4  AC_5  AC_6  AC_7  AC_8  AC_9 AC_10 AC_11 
##  0.52  0.55  0.26  0.34  0.41  0.64  0.55  0.58  0.55  0.40  0.26 
## 
## Loadings:
##       Factor1 Factor2 Factor3
## AC_1   0.66                  
## AC_2   0.63                  
## AC_3   0.86                  
## AC_4   0.81                  
## AC_5   0.72                  
## AC_6           0.57          
## AC_7           0.58          
## AC_8           0.62          
## AC_9           0.67          
## AC_10                  0.73  
## AC_11                  0.82  
## 
##                Factor1 Factor2 Factor3
## SS loadings       2.82    1.70    1.42
## Proportion Var    0.26    0.15    0.13
## Cumulative Var    0.26    0.41    0.54
## 
## Test of the hypothesis that 3 factors are sufficient.
## The chi square statistic is 79.45 on 25 degrees of freedom.
## The p-value is 1.39e-07

Antes de interpretar los resultados del análisis factorial, recuerde la idea básica detrás de él. El análisis factorial crea combinaciones lineales de factores para abstraer la comunalidad subyacente de la variable. En la medida en que las variables tengan una comunalidad subyacente, menos factores capturarán la mayor parte de la varianza en el conjunto de datos. Esto nos permite agregar una gran cantidad de variables observables en un modelo para representar un concepto subyacente, lo que facilita la comprensión de los datos. La variabilidad en nuestros datos, X, está dada por Σ, y su estimación Σ está compuesta por la variabilidad explicada por los factores explicados por una combinación lineal de los factores (comunalidad) y de la variabilidad, que no puede ser explicada por un combinación lineal de los factores (unicidad).

El primer fragmento proporciona las unicidades (uniqueness), que van de 0 a 1. La unicidad, a veces denominada ruido, corresponde a la proporción de variabilidad, que no se puede explicar mediante una combinación lineal de los factores. Este es el en la ecuación anterior. Una unicidad alta para una variable indica que los factores no explican bien su varianza.

La siguiente sección son las cargas (loadings), que van de −1 a 1. Este es el Λ en la ecuación anterior. Las cargas son la contribución de cada variable original al factor. Las variables con una carga alta están bien explicadas por el factor. Observe que no hay entrada para ciertas variables. Esto se debe a que R no imprime cargas inferiores a 0.1. Esto está destinado a ayudarnos a detectar grupos de variables. Elevando al cuadrado la carga calculamos la fracción de la varianza total de la variable explicada por el factor . Esta proporción de la variabilidad se denota como comunalidad. Otra forma de calcular la comunalidad es restar las unicidades de 1. Un modelo factorial apropiado da como resultado valores bajos para la unicidad y valores altos para la comunalidad.

La tabla situada debajo de las cargas muestra la proporción de varianza explicada por cada factor. La fila Var acumulada da la proporción acumulada de la varianza explicada. Estos números van de 0 a 1. La fila Proporción Var da la proporción de la varianza explicada por cada factor, y la fila SS cargas da la suma de las cargas al cuadrado. Esto se usa a veces para determinar el valor de un factor en particular. Vale la pena mantener un factor si la carga SS es mayor que 1 (regla de Kaiser).

La última sección de la salida de la función muestra los resultados de una prueba de hipótesis. La hipótesis nula, H0, es que la cantidad de factores en el modelo, en nuestro ejemplo 3 factores, es suficiente para capturar la dimensionalidad completa del conjunto de datos. Convencionalmente, rechazamos H0 si el valor p es menor que 0.05. Tal resultado indica que el número de factores es demasiado pequeño. Por el contrario, no rechazamos H0 si el valor p excede 0.05. Tal resultado indica que es probable que haya suficientes (o más que suficientes) factores que capturen la dimensionalidad completa del conjunto de datos. A pesar de la consistente clasificación conseguida en el análisis factorial, el bajo valor de p (p<0.05) nos lleva a rechazar la H0 e indica que no ajustamos un modelo del todo apropiado. Esto abriría la puerta la búsqueda de posibles ajustes sobre la escala de cara a tratar mejorar el modelo.

Interpretación de los resultados

El propósito de una rotación es producir factores con una combinación de cargas altas y bajas y pocas cargas de tamaño moderado. La idea es dar significado a los factores, lo que ayuda a interpretarlos. Desde un punto de vista matemático, no hay diferencia entre una matriz rotada y no rotada. El modelo ajustado es el mismo, las unicidades son las mismas y la proporción de varianza explicada es la misma.

Hagamos un diagrama de dispersión de las cargas de los elementos en los 3 factores para comprobar las cargas de las variables en cada factor.

load.1 <- fit$loadings[,c(1,2)]
load.2 <- fit$loadings[,c(2,3)]
load.3 <- fit$loadings[,c(1,3)]

plot(load.1,type="n")
text(load.1,labels=names(datos),cex=.7)

plot(load.2,type="n")
text(load.2,labels=names(datos),cex=.7)

plot(load.3,type="n")
text(load.3,labels=names(datos),cex=.7)

Ahora viene el aspecto complicado del análisis factorial: la interpretación de los factores. Si dos variables tienen grandes cargas para el mismo factor, entonces sabemos que tienen algo en común. Como investigadores tenemos que entender los datos y su significado para poder dar un nombre a ese terreno común. Echando un vistazo a las cifras anteriores, parece que el factor 1 tiene en cuenta los cinco primeros ítems (AC_1 a AC_5) que, según su formulación, corresponden a la dimensión “conciencia de salud”. Mientras que el factor 2 contiene 4 ítems (AC_6 a AC_9) que se pueden incluir en la dimensión “actividad física y alimentación”, mientras que el factor 3 contiene 2 ítems (AC_10 y AC_11) que se pueden incluir en la dimensión “descanso y sueño”. En el caso de que nuestro objetivo sea construir una herramienta de escalamiento psicométrico, podríamos construir una puntuación de cada una de las dimensiones o factores obtenidos en este análisis.

Finalmente, podríamos visualizar el modelo factorial con la estructura y carga ítem/factor, lo cual ayuda a facilitar la interpretación del análisis factorial.

loads <- fit$loadings
fa.diagram(loads)

Consistencia interna de los factores

Podemos calcular la consistencia interna de los factores propuestos por el modelo factorial mediante el cálculo del coeficiente alpha de Cronbach.

f1 <- datos[ , c("AC_1", "AC_2", "AC_3", "AC_4", "AC_5")]
f2 <- datos[ , c("AC_6", "AC_7", "AC_8", "AC_9")]
f3 <- datos[ , c("AC_10", "AC_11")]

alpha(f1)
## 
## Reliability analysis   
## Call: alpha(x = f1)
## 
##   raw_alpha std.alpha G6(smc) average_r S/N   ase mean   sd median_r
##       0.86      0.86    0.85      0.56 6.4 0.014    5 0.87     0.54
## 
##  lower alpha upper     95% confidence boundaries
## 0.83 0.86 0.89 
## 
##  Reliability if an item is dropped:
##      raw_alpha std.alpha G6(smc) average_r S/N alpha se  var.r med.r
## AC_1      0.84      0.84    0.81      0.57 5.3    0.017 0.0117  0.57
## AC_2      0.85      0.85    0.82      0.59 5.7    0.016 0.0081  0.60
## AC_3      0.80      0.82    0.79      0.53 4.5    0.021 0.0079  0.49
## AC_4      0.81      0.83    0.80      0.55 4.8    0.020 0.0079  0.54
## AC_5      0.84      0.84    0.82      0.57 5.3    0.017 0.0088  0.54
## 
##  Item statistics 
##        n raw.r std.r r.cor r.drop mean   sd
## AC_1 226  0.76  0.79  0.73   0.65  5.5 0.88
## AC_2 226  0.73  0.77  0.69   0.61  5.3 0.87
## AC_3 226  0.86  0.85  0.81   0.76  4.9 1.15
## AC_4 226  0.84  0.83  0.78   0.73  5.0 1.12
## AC_5 226  0.83  0.79  0.71   0.67  4.4 1.35
## 
## Non missing response frequency for each item
##         1    2    3    4    5    6 miss
## AC_1 0.00 0.00 0.04 0.10 0.19 0.66    0
## AC_2 0.00 0.00 0.05 0.11 0.28 0.56    0
## AC_3 0.01 0.03 0.08 0.21 0.26 0.42    0
## AC_4 0.01 0.02 0.07 0.19 0.27 0.44    0
## AC_5 0.02 0.08 0.18 0.23 0.22 0.28    0
alpha(f2)
## 
## Reliability analysis   
## Call: alpha(x = f2)
## 
##   raw_alpha std.alpha G6(smc) average_r S/N   ase mean  sd median_r
##       0.73      0.73    0.69      0.41 2.7 0.029  3.6 1.2     0.38
## 
##  lower alpha upper     95% confidence boundaries
## 0.67 0.73 0.79 
## 
##  Reliability if an item is dropped:
##      raw_alpha std.alpha G6(smc) average_r S/N alpha se  var.r med.r
## AC_6      0.69      0.69    0.60      0.42 2.2    0.036 0.0063  0.39
## AC_7      0.67      0.67    0.58      0.40 2.0    0.038 0.0051  0.37
## AC_8      0.66      0.66    0.58      0.40 2.0    0.038 0.0071  0.39
## AC_9      0.66      0.66    0.58      0.40 2.0    0.040 0.0110  0.35
## 
##  Item statistics 
##        n raw.r std.r r.cor r.drop mean  sd
## AC_6 226  0.75  0.73  0.58   0.50  3.5 1.8
## AC_7 226  0.72  0.75  0.62   0.52  3.3 1.4
## AC_8 226  0.75  0.75  0.63   0.53  3.9 1.6
## AC_9 226  0.76  0.75  0.63   0.54  3.5 1.6
## 
## Non missing response frequency for each item
##         1    2    3    4    5    6 miss
## AC_6 0.20 0.14 0.16 0.14 0.20 0.15    0
## AC_7 0.11 0.20 0.24 0.23 0.13 0.09    0
## AC_8 0.10 0.12 0.17 0.21 0.23 0.18    0
## AC_9 0.13 0.16 0.22 0.18 0.16 0.15    0
alpha(f3)
## 
## Reliability analysis   
## Call: alpha(x = f3)
## 
##   raw_alpha std.alpha G6(smc) average_r S/N   ase mean  sd median_r
##        0.8       0.8    0.66      0.66   4 0.027  4.7 1.1     0.66
## 
##  lower alpha upper     95% confidence boundaries
## 0.74 0.8 0.85 
## 
##  Reliability if an item is dropped:
##       raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
## AC_10      0.61      0.66    0.44      0.66   2       NA     0  0.66
## AC_11      0.72      0.66    0.44      0.66   2       NA     0  0.66
## 
##  Item statistics 
##         n raw.r std.r r.cor r.drop mean  sd
## AC_10 226  0.90  0.91  0.74   0.66  4.8 1.2
## AC_11 226  0.92  0.91  0.74   0.66  4.6 1.3
## 
## Non missing response frequency for each item
##          1    2    3    4    5    6 miss
## AC_10 0.00 0.04 0.13 0.16 0.32 0.35    0
## AC_11 0.01 0.08 0.13 0.19 0.30 0.30    0
alpha(f1, check.keys=TRUE)$total[1] # fiabilidad factor 1 (5 items)
##  raw_alpha
##  0.8579947
alpha(f2, check.keys=TRUE)$total[1] # fiabilidad factor 2 (4 items)
##  raw_alpha
##  0.7293819
alpha(f3, check.keys=TRUE)$total[1] # fiabilidad factor 3 (2 items)
##  raw_alpha
##  0.7970702
alpha(datos, check.keys=TRUE)$total[1] # fiabilidad escala (11 items)
##  raw_alpha
##   0.801416

Finalmente, para validar el modelo estructural propuesto en el análisis factorial común o exploratorio, sería interesante realizar un análisis factorial confirmatorio sobre una muestra de sujetos independiente, con la hipótesis nula de que la estructura factorial será la misma que se ha encontrado en esta muestra. Es importante destacar que este análisis permitiría la construcción de escalas psicométricas, como es este caso del autocuidado.