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.
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 saludAC_2
. Por lo general, soy consciente de mi saludAC_3
. Reflexiono mucho sobre mi saludAC_4
. Generalmente, estoy atenta/o a mis sentimientos
con respecto a mi saludAC_5
. Estoy constantemente examinando mi saludAC_6
. Realizo actividad física (algún deporte, yoga o
baile) durante al menos 30 minutos diariosAC_7
. Como tres porciones de fruta y dos de verdura
diariamenteAC_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
diariosAC_10
. Duermo entre 7-8 horas diariasAC_11
. Considero que mi descanso es de calidadAdemá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.
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:
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
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.
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.
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)
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.