class: center, middle, inverse, title-slide # Análisis Factorial Confirmatorio y Confiabilidad en
R
## 3er CIEP - Usil ### Brian N. Peña-Calero y Arnold Tafur-Mendoza ### Avances en Medición Psicológica (AMP) - UNMSM ### 12/10/2019 --- class: inverse, center, middle # .font150[**Temario**] --- # Temario 1. Modelos Factoriales * Definición y utilidad * Conceptos: cargas factoriales, errores, variables observables, variables latentes. 1. Análisis Factorial Confirmatorio * Diferencias y usos entre el análisis factorial exploratorio y confirmatorio * Concepto y utilidad * Términos básicos: Estimación restringidas (correlación de errores), liberadas, fijas * Modelos AFC conocidos: Primer orden (ortogonales y oblicuos), segundo orden, bifactor * Procedimientos de análisis: Especificación, Identificación, Estimación, evaluación y re-especificación * Ejemplificación con caso 1. Fiabilidad por consistencia interna * Problemática de Alfa y la tau-equivalencia * Ventajas de la fiabilidad basado en modelos factoriales * Procedimiento en software --- class: inverse, center, middle # .font120[**Modelos Factoriales**] --- # Modelos Factoriales ## Definición y Utilidad ## Conceptos * ### Cargas Factoriales * ### Errrores * ### Variables Observables * ### Variables Latentes --- class: inverse, center, middle # .font120[**Análisis Factorial Confirmatorio**] --- # Análisis Factorial Confirmatorio * ### Diferencias y usos entre el análisis factorial exploratorio y confirmatorio * ### Concepto y utilidad * ### Términos básicos: Estimación restringidas (correlación de errores), liberadas, fijas * ### Modelos AFC conocidos: Primer orden (ortogonales y oblicuos), segundo orden, bifactor --- # Procedimientos de análisis <br> ## 1. Especificación ## 2. Identificación ## 3. Estimación ## 4. Evaluación ## 5. Re-especificación --- # Procedimientos de análisis ## 1. Especificación .left-plot[
] .right-code[<br> `lavaan` automatiza la asignación de los errores pertenecientes a cada variable observada (ítem). <br> ```r model <- " # Modelo de Medición `Variable Latente` =~ Item01 + Item02 + Item03 " ``` Se crea (`<-`) el objeto `model` donde se **especifica**: * Cuántas y como se llaman las variables latentes * Cuántos ítems y a donde pertenecen .center[.font100[*¡Veamos como sería en un modelo más complejo!*]] ] --- # Procedimientos de análisis ## 1. Especificación .left-plot[
] .right-code[El símbolo .font150[`↔`] hace referencia a la ***covarianza*** entre los factores. ```r model <- " # Modelo de Medición VL1 =~ Item01 + Item02 + Item03 VL2 =~ Item04 + Item05 + Item06 # VL1 ~~ VL2 " ``` No es necesario especificar `VL1 ~~ VL2`. `lavaan` supone que siempre trabajamos con modelos oblicuos. **Nota:** *Más adelante veremos modelos ortogonales.* ] --- # Procedimientos de análisis ## 1. Especificación Hay más cosas que podemos especificar en nuestros modelos de medición: -- * Igualar las cargas factoriales de alguno o varios ítems -- ```r VL1 =~ a*Item01 + a*Item02 + a*Item03 ``` -- * Especificar modelos ortogonales -- ```r VL1 ~~ 0*VL2 ``` -- * Realizar correlación entre errores (covarianza de varianza específica de los ítems) -- ```r # Correlación de errores Item01 ~~ Item02 ``` --- # Procedimientos de análisis ## 1. Especificación .left-plot[
] .right-code[¡ A resolverlo!] -- .right-code[ ```r model <- " # Modelo de Medición VL1 =~ Item01 + Item02 + Item03 VL2 =~ Item04 + Item05 + Item06 # Correlación de errores Item04 ~~ Item05 " ``` La varianza específica del `Item04` y del `Item05` son los que se relacionan de alguna manera. Existe algo que distinto a `VL2` que está explicando el comportamiento de las puntuaciones de esos ítems. ] --- # Procedimientos de análisis ## 2. Identificación Este procedimiento hace referencia a la suficiencia de información para el análisis. Dependiendo de la cantidad de información que tengamos y que solicitemos, podremos encontrar una solución satisfactoria. Por ejemplo: <box-block> X + Y = 20 <br> 2X + Y = 28 </box-block> ¿Cuánto vale `X` y cuánto vale `Y`? -- <br> `X = 8` <br> `Y = 12` .center[.font120[*¿Había suficiente información?*]] --- # Procedimientos de análisis ## 2. Identificación Imaginemos ahora la siguiente situación: <box-block> X + Y = 25 <br> 2X + 2Y = 50 </box-block> ¿Cuánto vale `X` y cuánto vale `Y`? -- Las soluciones pueden ser infinitas <br> `X = 10; Y = 15` <br> `X = 8; Y = 17` <br> `X = 15; Y = 10` .center[.font120[*¡No tenemos suficiente información!*]] --- # Procedimientos de análisis ## 2. Identificación En el caso de un `AFC` la suficiencia de información hace referencia a la cantidad de correlaciones que existe en una matriz de las variables a analizar (en nuestros casos, los ítems). Esto se contrasta con la información solicitada (`Especificaciòn`). ``` ## ## Correlation method: 'pearson' ## Missing treated using: 'pairwise.complete.obs' ``` ``` ## rowname x1 x2 x3 ## 1 x1 1.00 ## 2 x2 .30 1.00 ## 3 x3 .44 .34 1.00 ``` .center[.font110[¿Cuántas correlaciones tenemos?]] -- .center[`6`] --- # Procedimientos de análisis ## 2. Identificación Veamos otro ejemplo con una cantidad de ítems mayor ``` ## ## Correlation method: 'pearson' ## Missing treated using: 'pairwise.complete.obs' ``` ``` ## rowname x1 x2 x3 x4 x5 ## 1 x1 1.00 ## 2 x2 .30 1.00 ## 3 x3 .44 .34 1.00 ## 4 x4 .37 .15 .16 1.00 ## 5 x5 .29 .14 .08 .73 1.00 ``` .center[.font110[¿Cuántas correlaciones tenemos?]] -- .center[`15`] --- # Procedimientos de análisis ## 2. Identificación ¡Último ejemplo! *Nota: Encuentren la regla* .left-code[ ``` ## ## Correlation method: 'pearson' ## Missing treated using: 'pairwise.complete.obs' ``` ``` ## rowname x1 x2 x3 x4 x5 x6 x7 x8 ## 1 x1 1.00 ## 2 x2 .30 1.00 ## 3 x3 .44 .34 1.00 ## 4 x4 .37 .15 .16 1.00 ## 5 x5 .29 .14 .08 .73 1.00 ## 6 x6 .36 .19 .20 .70 .72 1.00 ## 7 x7 .07 -.08 .07 .17 .10 .12 1.00 ## 8 x8 .22 .09 .19 .11 .14 .15 .49 1.00 ``` ] .right-code[ .center[.font110[¿Cuántas correlaciones tenemos?]] <br> .center[`36`] <br> .center[$$Información= \frac{n(n+1)}{2}$$] ] --- # Procedimientos de análisis ## 2. Identificación .left-plot[
] .right-code[¿Cuánta información estamos solicitando aquí? En total, solicitamos calcular las `cargas factoriales` (*varianza común*) y el `error de medición` (*varianza específica*): <br> Cargas factoriales: `λ1, λ2, λ3` <br> Error de medición: `a, b, c` .center[*Entonces estamos solicitando 6 informaciones*] Siendo 3 ítems que ingresan al modelo. <br> <br> .center[**¿De cuánta información disponemos?**] ] --- # Procedimientos de análisis ## 2. Identificación ### Notas importantes * Mientras tengamos más de 3 ítems en nuestro modelo, no tendremos problemas de identificación (*sub-identificación* o *no identificado*). * En los casos que tenemos modelos con solo 3 ítems, se puede calcular siempre y cuando no se soliciten mayor información (*apenas identificado*) como por ejemplo, `correlación de errores entre ítems`. Debido a que con 3 ítems tenemos 6 cantidad de informaciones y estaríamos solicitando un total de 7 informaciones. * No es imposible trabajar con modelos de 2 o 1 ítem (*ítems únicos*), siempre y cuando se empleen algunos artificios. Por ejemplo, igualar cargas factoriales o ingresar información previa sobre algún parámetro (de esta manera no se volverá a calcular). --- # Procedimientos de análisis ## 3. Estimación .center[<b>Tabla Resumen de Estimadores</b>] <table> <thead> <tr> <th style="text-align:center;"> Estimadores </th> <th style="text-align:center;"> Estimadores Robustos </th> <th style="text-align:center;"> Descripciones </th> </tr> </thead> <tbody> <tr> <td style="text-align:center;"> ML (Máxima Verosimilitud) </td> <td style="text-align:center;"> MLM, MLR, MLMVS, MLMV </td> <td style="text-align:center;"> Datos continuos </td> </tr> <tr> <td style="text-align:center;"> ULS (Mínimos cuadrados no ponderados) </td> <td style="text-align:center;"> ULSM, ULSMVS, ULSMV </td> <td style="text-align:center;"> Variables Categóricas </td> </tr> <tr> <td style="text-align:center;"> WLS (Mínimos cuadrados ponderados) </td> <td style="text-align:center;"> - </td> <td style="text-align:center;"> Variables Categóricas </td> </tr> <tr> <td style="text-align:center;"> DWLS (Mínimos cuadrados con diagonal ponderada </td> <td style="text-align:center;"> WLSM, WLSMVS, WLSMV </td> <td style="text-align:center;"> Variables Categóricas. Es el más recomendado en la actualidad </td> </tr> </tbody> </table> --- # Procedimientos de análisis ## 3. Estimación Aclaración sobre los sufijos de las nomenclaturas para los **estimadores robustos**: * ABC`M`: Trabaja con errores robustos y corrección para chi-cuadrado *Satorra-Bentler* * ABC`MVS`: Trabaja con errores robustos y corrección para media-varianza y chi-cuadrado *Satterthwaite* * ABC`MV`: Trabaja con errores robustos y corrección para media-varianza y chi-cuadrado *scale-shifted* Los estudios de simulación coinciden en que la corrección **scale-shifted** es quien brinda mejores resultados siempre y cuando se tenga una cantidad de datos *suficiente* (n > 250, dependiendo de la cantidad de ítems). <br> Para nuestros casos: Los mejores estimadores a utilizar cuando trabajemos con datos contínuos será `MLR` (en caso de no-normalidad) y `WLSMV` (en caso de datos categóricos). --- # Procedimientos de análisis ## 4. Evaluación Este procedimiento hace referencia al cálculo y valoración de los ***índices de ajuste*** de los modelos estimados, así como a las cargas factoriales calculadas. * Estos índices son derivados del test *chi-cuadrado* por lo que a medida que cambie este, el resto de los índices cambiará. * A medida que se emplee un estimador diferente (*recordar que hace correcciones a esta prueba*) y/o aumenten o desciendan el número de ítems/factores, los índices de ajuste cambiarán. * Por último a medida que se ingresen o resten especificaciones al modelo, los **índices de ajuste** cambiarán. Este procedimiento nos permitirá tomar la decisión de finalizar el análisis en este punto o ir al siguiente paso ***Re-Especificación***. --- # Procedimientos de análisis ## 4. Evaluación <table> <thead> <tr> <th style="text-align:center;"> Índices de ajuste </th> <th style="text-align:center;"> Descriptivos </th> <th style="text-align:center;"> Puntos de Corte </th> </tr> </thead> <tbody> <tr> <td style="text-align:center;"> χ² </td> <td style="text-align:center;"> Test Chi-Cuadrado (bondad de ajuste) </td> <td style="text-align:center;"> No estadísticamente significativo </td> </tr> <tr> <td style="text-align:center;"> χ²/gl </td> <td style="text-align:center;"> Medida de parsimonia </td> <td style="text-align:center;"> Menor a 3 o 2 </td> </tr> <tr> <td style="text-align:center;"> CFI (Comparative Fit Index) </td> <td style="text-align:center;vertical-align: middle !important;" rowspan="2"> Medida de ajuste independiente o incremental </td> <td style="text-align:center;vertical-align: middle !important;" rowspan="2"> ≥ .90 = ajuste adecuado; ≥ .95 = buen ajuste </td> </tr> <tr> <td style="text-align:center;"> TLI (Tucker Lewis Index) o NNFI (Non-Normed Fit Index) </td> </tr> <tr> <td style="text-align:center;"> RMSEA (Root Mean Square Error of Approximation) </td> <td style="text-align:center;"> Evalúa que tan lejos está de un modelo perfecto </td> <td style="text-align:center;"> ≥ .10 = ajuste pobre; ≤ .08 = adecuado ajuste, ≤ .05 = buen ajuste </td> </tr> <tr> <td style="text-align:center;"> SRMR (Standardized Root Mean Residual) </td> <td style="text-align:center;"> Evalúa que tan grande es el error de reproducir el modelo </td> <td style="text-align:center;"> ≤ .08 = buen ajuste, ≤ .06: ideal </td> </tr> </tbody> </table> --- # Procedimientos de análisis ## 5. Re-Especificación Este procedimiento hace referencia a empezar nuevamente el flujo del análisis, quitar, aumentar algo en el proceso de `Espeficación` que permita tener un modelo factorial idóneo. Una de las cosas que ayudan en esta etapa es el cálculo de los `índices de modificación`. En el paquete `lavaan` podremos realizar rápidamente con la sintaxis: ```r modificationindices() ``` -- <br> .center[.font150[¿Listos para hacer un ejemplo?]] --- # Ejemplificación de caso Para este primer ejemplo usaremos la BD de Holzinger & Swineford (1939). Se tienen 9 pruebas que se estructuran en 3 factores latentes: Visual, Textual y Velocidad. ```r lavaan::HolzingerSwineford1939 ```
--- # Ejemplificación de caso ## 1. Especificación ```r model <- " visual =~ x1 + x2 + x3 textual =~ x4 + x5 + x6 speed =~ x7 + x8 + x9 " ``` ## 2. Identificación y Estimación Almacenamos la estimación en el objeto `fit` sobre el cuál consultaremos para obtener información. *Recordar:* Es importante el almacenar información con `<-` ```r library(lavaan) ``` ``` ## This is lavaan 0.6-6 ``` ``` ## lavaan is BETA software! Please report any bugs. ``` ```r fit <- cfa(model = model, data = HolzingerSwineford1939) ``` --- # Ejemplificación de caso ## 4. Evaluación .scroll-output[ ```r summary(fit) ``` ``` ## lavaan 0.6-6 ended normally after 35 iterations ## ## Estimator ML ## Optimization method NLMINB ## Number of free parameters 21 ## ## Number of observations 301 ## ## Model Test User Model: ## ## Test statistic 85.306 ## Degrees of freedom 24 ## P-value (Chi-square) 0.000 ## ## Parameter Estimates: ## ## Standard errors Standard ## Information Expected ## Information saturated (h1) model Structured ## ## Latent Variables: ## Estimate Std.Err z-value P(>|z|) ## visual =~ ## x1 1.000 ## x2 0.554 0.100 5.554 0.000 ## x3 0.729 0.109 6.685 0.000 ## textual =~ ## x4 1.000 ## x5 1.113 0.065 17.014 0.000 ## x6 0.926 0.055 16.703 0.000 ## speed =~ ## x7 1.000 ## x8 1.180 0.165 7.152 0.000 ## x9 1.082 0.151 7.155 0.000 ## ## Covariances: ## Estimate Std.Err z-value P(>|z|) ## visual ~~ ## textual 0.408 0.074 5.552 0.000 ## speed 0.262 0.056 4.660 0.000 ## textual ~~ ## speed 0.173 0.049 3.518 0.000 ## ## Variances: ## Estimate Std.Err z-value P(>|z|) ## .x1 0.549 0.114 4.833 0.000 ## .x2 1.134 0.102 11.146 0.000 ## .x3 0.844 0.091 9.317 0.000 ## .x4 0.371 0.048 7.779 0.000 ## .x5 0.446 0.058 7.642 0.000 ## .x6 0.356 0.043 8.277 0.000 ## .x7 0.799 0.081 9.823 0.000 ## .x8 0.488 0.074 6.573 0.000 ## .x9 0.566 0.071 8.003 0.000 ## visual 0.809 0.145 5.564 0.000 ## textual 0.979 0.112 8.737 0.000 ## speed 0.384 0.086 4.451 0.000 ``` ] --- # Ejemplificación de caso ## 4. Evaluación .scroll-output[ ```r summary(fit, fit.measures = TRUE, standardized = TRUE) ``` ``` ## lavaan 0.6-6 ended normally after 35 iterations ## ## Estimator ML ## Optimization method NLMINB ## Number of free parameters 21 ## ## Number of observations 301 ## ## Model Test User Model: ## ## Test statistic 85.306 ## Degrees of freedom 24 ## P-value (Chi-square) 0.000 ## ## Model Test Baseline Model: ## ## Test statistic 918.852 ## Degrees of freedom 36 ## P-value 0.000 ## ## User Model versus Baseline Model: ## ## Comparative Fit Index (CFI) 0.931 ## Tucker-Lewis Index (TLI) 0.896 ## ## Loglikelihood and Information Criteria: ## ## Loglikelihood user model (H0) -3737.745 ## Loglikelihood unrestricted model (H1) -3695.092 ## ## Akaike (AIC) 7517.490 ## Bayesian (BIC) 7595.339 ## Sample-size adjusted Bayesian (BIC) 7528.739 ## ## Root Mean Square Error of Approximation: ## ## RMSEA 0.092 ## 90 Percent confidence interval - lower 0.071 ## 90 Percent confidence interval - upper 0.114 ## P-value RMSEA <= 0.05 0.001 ## ## Standardized Root Mean Square Residual: ## ## SRMR 0.065 ## ## Parameter Estimates: ## ## Standard errors Standard ## Information Expected ## Information saturated (h1) model Structured ## ## Latent Variables: ## Estimate Std.Err z-value P(>|z|) Std.lv Std.all ## visual =~ ## x1 1.000 0.900 0.772 ## x2 0.554 0.100 5.554 0.000 0.498 0.424 ## x3 0.729 0.109 6.685 0.000 0.656 0.581 ## textual =~ ## x4 1.000 0.990 0.852 ## x5 1.113 0.065 17.014 0.000 1.102 0.855 ## x6 0.926 0.055 16.703 0.000 0.917 0.838 ## speed =~ ## x7 1.000 0.619 0.570 ## x8 1.180 0.165 7.152 0.000 0.731 0.723 ## x9 1.082 0.151 7.155 0.000 0.670 0.665 ## ## Covariances: ## Estimate Std.Err z-value P(>|z|) Std.lv Std.all ## visual ~~ ## textual 0.408 0.074 5.552 0.000 0.459 0.459 ## speed 0.262 0.056 4.660 0.000 0.471 0.471 ## textual ~~ ## speed 0.173 0.049 3.518 0.000 0.283 0.283 ## ## Variances: ## Estimate Std.Err z-value P(>|z|) Std.lv Std.all ## .x1 0.549 0.114 4.833 0.000 0.549 0.404 ## .x2 1.134 0.102 11.146 0.000 1.134 0.821 ## .x3 0.844 0.091 9.317 0.000 0.844 0.662 ## .x4 0.371 0.048 7.779 0.000 0.371 0.275 ## .x5 0.446 0.058 7.642 0.000 0.446 0.269 ## .x6 0.356 0.043 8.277 0.000 0.356 0.298 ## .x7 0.799 0.081 9.823 0.000 0.799 0.676 ## .x8 0.488 0.074 6.573 0.000 0.488 0.477 ## .x9 0.566 0.071 8.003 0.000 0.566 0.558 ## visual 0.809 0.145 5.564 0.000 1.000 1.000 ## textual 0.979 0.112 8.737 0.000 1.000 1.000 ## speed 0.384 0.086 4.451 0.000 1.000 1.000 ``` ] --- ## 5. Re-Especificación ```r modindices(fit, sort = TRUE, maximum.number = 10) ``` ``` ## lhs op rhs mi epc sepc.lv sepc.all sepc.nox ## 30 visual =~ x9 36.411 0.577 0.519 0.515 0.515 ## 76 x7 ~~ x8 34.145 0.536 0.536 0.859 0.859 ## 28 visual =~ x7 18.631 -0.422 -0.380 -0.349 -0.349 ## 78 x8 ~~ x9 14.946 -0.423 -0.423 -0.805 -0.805 ## 33 textual =~ x3 9.151 -0.272 -0.269 -0.238 -0.238 ## 55 x2 ~~ x7 8.918 -0.183 -0.183 -0.192 -0.192 ## 31 textual =~ x1 8.903 0.350 0.347 0.297 0.297 ## 51 x2 ~~ x3 8.532 0.218 0.218 0.223 0.223 ## 59 x3 ~~ x5 7.858 -0.130 -0.130 -0.212 -0.212 ## 26 visual =~ x5 7.441 -0.210 -0.189 -0.147 -0.147 ``` --- class: inverse, center, middle # .font120[**Fiabilidad por consistencia interna**] --- # Fiabilidad por consistencia interna * ### Problemática de Alfa y la tau-equivalencia * ### Procedimiento en software --- class: inverse, center, middle # .font120[**Gracias**]