Análisis Factorial Confirmatorio con Indicadores Categóricos

En esta ocasión, realizaremos un análisis factorial confirmatorio con indicadores categóricos.

Iniciamos cargando los paquetes necesarios para el análisis. Los paquetes son: haven para importar datos, lavaan para estimar el Modelo de Ecuaciones Estructurales (SEM), semPlot para crear gráficos de SEM y semTable para producir tablas de SEM.

# Carga paquetes
library(haven) # importar SPSS, Stata, etc.
library(lavaan) # estimar SEM
## This is lavaan 0.6-15
## lavaan is FREE software! Please report any bugs.
library(semPlot) # graficar SEM
library(semTable) # tablas SEM

A continuación, importamos los datos que vamos a analizar. Los datos están almacenados en un archivo .sav de SPSS llamado “ISLCHLC3.sav”. Lo importamos utilizando la función read_spss() del paquete haven.

# Importar datos
#datos <- read_spss("ISLCHLC3.sav")
datos <- read_sav(url("https://github.com/Clases-GabrielSotomayor/pruebapagina/raw/master/content/example/input/data/ISLCHLC3.sav"))

Definimos el modelo de medición para nuestro Análisis Factorial Confirmatorio (AFC). Estamos definiendo un factor latente (“autoritarismo”) y nueve ítems observables. El operador =~ se utiliza para indicar las relaciones entre el factor y los ítems

# Definir modelo de medicion
mod_conf <- 'autoritarismo =~ LS3G01A + LS3G01B + LS3G01C + LS3G01D + 
LS3G01E + LS3G01F + LS3G02A + LS3G02B + LS3G02C'

Para ajustar el modelo utilizamos la función cfa() del paquete lavaan. Sin embargo, a diferencia de un análisis factorial confirmatorio con indicadores continuos, debemos especificar que los ítems son categóricos mediante el argumento ordered = T y el estimador utilizado es “DWLS” (Diagonally Weighted Least Squares), que es adecuado para variables categóricas.

# Ajustar modelo CFA
mod_conf_afc <- cfa(mod_conf, data = datos, estimator="DWLS", ordered = T)

Luego, visualizamos un resumen de los resultados del modelo con la función summary(). Activamos las opciones para mostrar las cargas factoriales estandarizadas (standardized = TRUE) e índices de ajuste extendidos (fit.measures = TRUE).

# Resultados
## Salida general
summary(mod_conf_afc,
        standardized = TRUE, # mostrar cargas estandarizadas
        fit.measures = TRUE) # mostrar índices de ajuste extendidos
## lavaan 0.6.15 ended normally after 19 iterations
## 
##   Estimator                                       DWLS
##   Optimization method                           NLMINB
##   Number of model parameters                        36
## 
##                                                   Used       Total
##   Number of observations                          4864        5081
## 
## Model Test User Model:
##                                                       
##   Test statistic                               803.725
##   Degrees of freedom                                27
##   P-value (Chi-square)                           0.000
## 
## Model Test Baseline Model:
## 
##   Test statistic                             95756.207
##   Degrees of freedom                                36
##   P-value                                        0.000
## 
## User Model versus Baseline Model:
## 
##   Comparative Fit Index (CFI)                    0.992
##   Tucker-Lewis Index (TLI)                       0.989
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.077
##   90 Percent confidence interval - lower         0.072
##   90 Percent confidence interval - upper         0.082
##   P-value H_0: RMSEA <= 0.050                    0.000
##   P-value H_0: RMSEA >= 0.080                    0.137
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.046
## 
## Parameter Estimates:
## 
##   Standard errors                             Standard
##   Information                                 Expected
##   Information saturated (h1) model        Unstructured
## 
## Latent Variables:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   autoritarismo =~                                                      
##     LS3G01A           1.000                               0.792    0.792
##     LS3G01B           1.006    0.010   98.323    0.000    0.797    0.797
##     LS3G01C           0.789    0.009   87.222    0.000    0.624    0.624
##     LS3G01D           1.018    0.010  100.839    0.000    0.806    0.806
##     LS3G01E           0.900    0.009   95.097    0.000    0.713    0.713
##     LS3G01F           0.963    0.010   98.674    0.000    0.763    0.763
##     LS3G02A           0.877    0.009   93.743    0.000    0.694    0.694
##     LS3G02B           1.008    0.010  102.905    0.000    0.798    0.798
##     LS3G02C           0.882    0.009   95.410    0.000    0.698    0.698
## 
## Intercepts:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .LS3G01A           0.000                               0.000    0.000
##    .LS3G01B           0.000                               0.000    0.000
##    .LS3G01C           0.000                               0.000    0.000
##    .LS3G01D           0.000                               0.000    0.000
##    .LS3G01E           0.000                               0.000    0.000
##    .LS3G01F           0.000                               0.000    0.000
##    .LS3G02A           0.000                               0.000    0.000
##    .LS3G02B           0.000                               0.000    0.000
##    .LS3G02C           0.000                               0.000    0.000
##     autoritarismo     0.000                               0.000    0.000
## 
## Thresholds:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##     LS3G01A|t1       -1.684    0.031  -54.116    0.000   -1.684   -1.684
##     LS3G01A|t2       -1.140    0.023  -49.719    0.000   -1.140   -1.140
##     LS3G01A|t3       -0.203    0.018  -11.233    0.000   -0.203   -0.203
##     LS3G01B|t1       -1.608    0.030  -54.368    0.000   -1.608   -1.608
##     LS3G01B|t2       -0.783    0.020  -38.922    0.000   -0.783   -0.783
##     LS3G01B|t3        0.043    0.018    2.409    0.016    0.043    0.043
##     LS3G01C|t1       -1.386    0.026  -53.527    0.000   -1.386   -1.386
##     LS3G01C|t2       -0.422    0.019  -22.752    0.000   -0.422   -0.422
##     LS3G01C|t3        0.586    0.019   30.609    0.000    0.586    0.586
##     LS3G01D|t1       -1.702    0.031  -54.023    0.000   -1.702   -1.702
##     LS3G01D|t2       -1.076    0.022  -48.210    0.000   -1.076   -1.076
##     LS3G01D|t3       -0.072    0.018   -3.985    0.000   -0.072   -0.072
##     LS3G01E|t1       -1.125    0.023  -49.373    0.000   -1.125   -1.125
##     LS3G01E|t2       -0.346    0.018  -18.829    0.000   -0.346   -0.346
##     LS3G01E|t3        0.421    0.019   22.695    0.000    0.421    0.421
##     LS3G01F|t1       -1.524    0.028  -54.332    0.000   -1.524   -1.524
##     LS3G01F|t2       -0.838    0.020  -40.941    0.000   -0.838   -0.838
##     LS3G01F|t3       -0.013    0.018   -0.717    0.473   -0.013   -0.013
##     LS3G02A|t1       -1.253    0.024  -51.848    0.000   -1.253   -1.253
##     LS3G02A|t2       -0.223    0.018  -12.320    0.000   -0.223   -0.223
##     LS3G02A|t3        0.724    0.020   36.571    0.000    0.724    0.724
##     LS3G02B|t1       -1.624    0.030  -54.339    0.000   -1.624   -1.624
##     LS3G02B|t2       -0.829    0.020  -40.625    0.000   -0.829   -0.829
##     LS3G02B|t3        0.175    0.018    9.687    0.000    0.175    0.175
##     LS3G02C|t1       -1.357    0.025  -53.236    0.000   -1.357   -1.357
##     LS3G02C|t2       -0.435    0.019  -23.376    0.000   -0.435   -0.435
##     LS3G02C|t3        0.563    0.019   29.547    0.000    0.563    0.563
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .LS3G01A           0.373                               0.373    0.373
##    .LS3G01B           0.365                               0.365    0.365
##    .LS3G01C           0.610                               0.610    0.610
##    .LS3G01D           0.351                               0.351    0.351
##    .LS3G01E           0.492                               0.492    0.492
##    .LS3G01F           0.418                               0.418    0.418
##    .LS3G02A           0.518                               0.518    0.518
##    .LS3G02B           0.364                               0.364    0.364
##    .LS3G02C           0.512                               0.512    0.512
##     autoritarismo     0.627    0.009   73.038    0.000    1.000    1.000
## 
## Scales y*:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##     LS3G01A           1.000                               1.000    1.000
##     LS3G01B           1.000                               1.000    1.000
##     LS3G01C           1.000                               1.000    1.000
##     LS3G01D           1.000                               1.000    1.000
##     LS3G01E           1.000                               1.000    1.000
##     LS3G01F           1.000                               1.000    1.000
##     LS3G02A           1.000                               1.000    1.000
##     LS3G02B           1.000                               1.000    1.000
##     LS3G02C           1.000                               1.000    1.000

Además, podemos ver solo los índices de ajuste específicos que nos interesan utilizando la función fitmeasures().

# Ver solo indices de ajuste
fitmeasures(mod_conf_afc,
            fit.measures = c("chisq", "df", "pvalue",
                             "cfi", "rmsea"))
##   chisq      df  pvalue     cfi   rmsea 
## 803.725  27.000   0.000   0.992   0.077

Los índices de ajuste incluyen la chi-cuadrada (chisq), los grados de libertad (df), el p-valor (pvalue), el índice de ajuste comparativo (cfi), y el error cuadrático medio de aproximación (rmsea). Estos índices nos ayudan a evaluar qué tan bien se ajusta el modelo a nuestros datos.

A continuación, creamos un gráfico del modelo usando la función semPaths(). La opción what = “std” se utiliza para mostrar las cargas factoriales estandarizadas en el gráfico.

# Diagrama modelo
semPaths(mod_conf_afc, # modelo ajustado
         what = "std",  # mostrar cargas estandarizadas
         label.cex = 1, edge.label.cex = 1, # tamaño flechas y caracteres
         residuals = FALSE, # no mostrar residuos
         edge.color = "black") # color flechas

Para interpretar el gráfico, las flechas representan las relaciones entre el factor latente y los ítems. Los números en las flechas son las cargas factoriales estandarizadas, que indican la fuerza de la relación entre cada ítem y el factor.

A continuación, calculamos las comunalidades, que son las proporciones de varianza de cada ítem que se explican por el factor. Usamos la función inspect() con what = “rsquare” para hacer esto.

# Comunalidades
inspect(mod_conf_afc, what = "rsquare")
## LS3G01A LS3G01B LS3G01C LS3G01D LS3G01E LS3G01F LS3G02A LS3G02B LS3G02C 
##   0.627   0.635   0.390   0.649   0.508   0.582   0.482   0.636   0.488

Por último, revisamos los índices de modificación, que sugieren cambios potenciales al modelo que podrían mejorar el ajuste. Mostramos los índices en orden decreciente para identificar los cambios más impactantes primero.

# Indices de modificacion
## Mostrar 'mi' en orden decreciente
modificationindices(mod_conf_afc, sort. = T)
##         lhs op     rhs      mi    epc sepc.lv sepc.all sepc.nox
## 101 LS3G02B ~~ LS3G02C 184.051  0.148   0.148    0.343    0.343
## 100 LS3G02A ~~ LS3G02C 120.146  0.125   0.125    0.243    0.243
## 66  LS3G01A ~~ LS3G01B 112.821  0.119   0.119    0.321    0.321
## 99  LS3G02A ~~ LS3G02B 104.847  0.118   0.118    0.272    0.272
## 89  LS3G01D ~~ LS3G02A  61.539 -0.112  -0.112   -0.263   -0.263
## 73  LS3G01A ~~ LS3G02C  58.349 -0.112  -0.112   -0.257   -0.257
## 80  LS3G01B ~~ LS3G02C  56.790 -0.103  -0.103   -0.239   -0.239
## 79  LS3G01B ~~ LS3G02B  46.309 -0.085  -0.085   -0.234   -0.234
## 84  LS3G01C ~~ LS3G02A  37.485 -0.082  -0.082   -0.147   -0.147
## 98  LS3G01F ~~ LS3G02C  34.085 -0.080  -0.080   -0.173   -0.173
## 91  LS3G01D ~~ LS3G02C  32.975 -0.078  -0.078   -0.184   -0.184
## 88  LS3G01D ~~ LS3G01F  31.579  0.065   0.065    0.170    0.170
## 85  LS3G01C ~~ LS3G02B  24.764 -0.067  -0.067   -0.142   -0.142
## 71  LS3G01A ~~ LS3G02A  24.697 -0.073  -0.073   -0.165   -0.165
## 96  LS3G01F ~~ LS3G02A  24.319 -0.069  -0.069   -0.148   -0.148
## 72  LS3G01A ~~ LS3G02B  21.959 -0.060  -0.060   -0.162   -0.162
## 78  LS3G01B ~~ LS3G02A  19.403 -0.059  -0.059   -0.136   -0.136
## 82  LS3G01C ~~ LS3G01E  16.903  0.052   0.052    0.094    0.094
## 81  LS3G01C ~~ LS3G01D  16.692  0.052   0.052    0.113    0.113
## 94  LS3G01E ~~ LS3G02B  11.794 -0.044  -0.044   -0.103   -0.103
## 86  LS3G01C ~~ LS3G02C  11.782 -0.045  -0.045   -0.081   -0.081
## 68  LS3G01A ~~ LS3G01D  10.762  0.039   0.039    0.108    0.108
## 83  LS3G01C ~~ LS3G01F   8.812  0.039   0.039    0.078    0.078
## 97  LS3G01F ~~ LS3G02B   7.148 -0.033  -0.033   -0.085   -0.085
## 74  LS3G01B ~~ LS3G01C   6.864  0.034   0.034    0.071    0.071
## 93  LS3G01E ~~ LS3G02A   6.805  0.033   0.033    0.065    0.065
## 90  LS3G01D ~~ LS3G02B   6.575 -0.030  -0.030   -0.085   -0.085
## 69  LS3G01A ~~ LS3G01E   5.668 -0.033  -0.033   -0.077   -0.077
## 75  LS3G01B ~~ LS3G01D   2.363  0.018   0.018    0.050    0.050
## 77  LS3G01B ~~ LS3G01F   1.290  0.014   0.014    0.035    0.035
## 70  LS3G01A ~~ LS3G01F   0.972  0.012   0.012    0.031    0.031
## 92  LS3G01E ~~ LS3G01F   0.734  0.011   0.011    0.024    0.024
## 87  LS3G01D ~~ LS3G01E   0.597 -0.010  -0.010   -0.024   -0.024
## 67  LS3G01A ~~ LS3G01C   0.349 -0.008  -0.008   -0.018   -0.018
## 95  LS3G01E ~~ LS3G02C   0.092  0.004   0.004    0.008    0.008
## 76  LS3G01B ~~ LS3G01E   0.070 -0.003  -0.003   -0.008   -0.008

Estos índices pueden ayudarte a mejorar tu modelo. Sin embargo, cualquier cambio que hagas en el modelo basándote en estos índices debe tener sentido teórico. No es recomendable hacer cambios al modelo solo porque los índices de modificación sugieran que mejorarán el ajuste.

Previous
Next