03/01/26
Abstract
En Rpubs:: toc se pueden ver otros documentos de posible interés.
El software R dispone de varias funciones de diferentes paquetes para calcular EFA:
library(sem)
library(lavaan)
library(blavaan)
library(semPlot)
sem: corresponde a uno de los primeros paquetes desarrollados en R para la especificación y estimación de modelos de ecuaciones estructurales (SEM) mediante máxima verosimilitud. Aunque actualmente su uso es menos extendido que otros paquetes más modernos, resulta útil desde un punto de vista histórico y conceptual, ya que permite comprender la estructura básica de los modelos SEM y su relación directa con la formulación matricial clásica.
lavaan: desarrollado por Rossel (2012). Se utiliza para especificar y estimar modelos factoriales confirmatorios (CFA) y modelos de ecuaciones estructurales (SEM) multigrupo, permitiendo evaluar tanto la invarianza de medida (cargas, interceptos y residuos) como la invarianza estructural (regresiones, varianzas y covarianzas latentes) entre grupos. Para una introducción práctica al paquete, puede consultarse el tutorial oficial disponible en: https://lavaan.ugent.be/tutorial.
blavaan: extiende la sintaxis y funcionalidad de lavaan al marco bayesiano, permitiendo la estimación de modelos SEM mediante métodos MCMC. Este paquete resulta especialmente útil cuando se desean incorporar información previa, trabajar con muestras pequeñas o evaluar la incertidumbre completa de los parámetros a través de distribuciones posteriores. Su uso en el capítulo tiene un carácter introductorio y comparativo frente al enfoque clásico de máxima verosimilitud.
semPlot: se emplea para la representación gráfica de modelos SEM y CFA, facilitando la visualización de factores latentes, variables observadas, cargas factoriales, covarianzas y efectos estructurales. Este paquete permite generar diagramas claros y personalizables, lo cual es fundamental tanto para la interpretación sustantiva de los modelos como para la comunicación de resultados en contextos académicos y aplicados.
library(psych) #Para realizar un EFA
library(tidyverse) #Incluye a dplyr y ggplot2
library(stringr) #Reemplazar caracteres en un data frame
library(outliers) #outliers::grubbs.test
library(EnvStats) #EnvStats::rosnerTest
library(DMwR2) #LOF (Local Outlier Factor)
library(rgl) #rgl::plot3d
library(corrplot) #Matriz de correlaciones
library(textshape) #column_to_rownames
library(openxlsx) #Librería para escribir archivos de Excel
library(knitr) #Crear tablas con estilo
library(kableExtra) #Crear tablas con estilo, pero para html
En particular:
psych: se utiliza para realizar análisis factorial exploratorio (EFA) y obtener diagnósticos psicométricos preliminares.
tidyverse: conjunto de paquetes para manipulación, transformación y visualización de datos; incluye dplyr y ggplot2.
stringr: facilita operaciones de manipulación y reemplazo de cadenas de texto dentro de data frames.
outliers: permite la detección de valores atípicos mediante pruebas estadísticas clásicas, como grubbs.test.
EnvStats: se emplea para la detección de outliers múltiples, especialmente mediante la prueba de Rosner (rosnerTest).
DMwR2: implementa métodos basados en densidad para detección de valores atípicos, como el Local Outlier Factor (LOF).
rgl: se utiliza para visualización gráfica tridimensional de datos, por ejemplo con plot3d.
corrplot: permite la visualización gráfica de matrices de correlación de forma compacta e interpretable.
textshape: se emplea para transformaciones estructurales de data frames, como convertir columnas en nombres de filas (column_to_rownames).
openxlsx: permite leer y escribir archivos de Excel sin depender de software externo.
knitr: se utiliza para la creación y presentación ordenada de tablas y resultados dentro de documentos R Markdown.
kableExtra: extiende las capacidades de knitr para generar tablas con formato avanzado, especialmente en salidas HTML.
A medida que avance el capítulo, se explicará el propósito de cada función utilizada y la interpretación de sus resultados, priorizando siempre el significado estadístico y sustantivo de los modelos sobre el uso meramente técnico del software.
lavaanUtilizando cuatro tipos de fórmulas, se puede describir una gran variedad de modelos de variables latentes. El conjunto actual de tipos de fórmulas se resume en la figura 2.1.
Figure 2.1: Tipos de fórmulas
En lavaan, los modelos SEM pueden especificarse mediante fórmulas de modelo similares a las utilizadas en las funciones lm y glm.
Sin embargo, hay algunos operadores nuevos (símbolos relacionales) que se utilizan para definir covarianzas (residuales) y variables latentes.
La figura 2.2 enumera algunas expresiones comunes en la sintaxis de lavaan.
Figure 2.2: Sintáxis de los modelos
En estudios educativos y psicológicos es frecuente comparar grupos definidos por características institucionales, sociales o demográficas (por ejemplo, tipo de escuela, género o nivel educativo). Sin embargo, dichas comparaciones solo son válidas si se garantiza que los instrumentos utilizados operan de forma equivalente en todos los grupos considerados.
En este ejemplo se evalúa si un conjunto de pruebas cognitivas mide los mismos constructos latentes en dos grupos de estudiantes pertenecientes a diferentes tipos de escuela. El interés central no es únicamente estimar un modelo factorial, sino verificar empíricamente la invarianza de medida, comenzando por la invarianza configural y avanzando hacia niveles más restrictivos, en particular la invarianza métrica.
Se utiliza el conjunto de datos clásico de Holzinger y Swineford (1939), ampliamente empleado en la literatura metodológica para ilustrar modelos factoriales confirmatorios y análisis multigrupo.
head(HolzingerSwineford1939)
## id sex ageyr agemo school grade x1 x2 x3 x4 x5 x6
## 1 1 1 13 1 Pasteur 7 3.333333 7.75 0.375 2.333333 5.75 1.2857143
## 2 2 2 13 7 Pasteur 7 5.333333 5.25 2.125 1.666667 3.00 1.2857143
## 3 3 2 13 1 Pasteur 7 4.500000 5.25 1.875 1.000000 1.75 0.4285714
## 4 4 1 13 2 Pasteur 7 5.333333 7.75 3.000 2.666667 4.50 2.4285714
## 5 5 2 12 2 Pasteur 7 4.833333 4.75 0.875 2.666667 4.00 2.5714286
## 6 6 2 14 1 Pasteur 7 5.333333 5.00 2.250 1.000000 3.00 0.8571429
## x7 x8 x9
## 1 3.391304 5.75 6.361111
## 2 3.782609 6.25 7.916667
## 3 3.260870 3.90 4.416667
## 4 3.000000 5.30 4.861111
## 5 3.695652 6.30 5.916667
## 6 4.347826 6.65 7.500000
La vista preliminar de las primeras observaciones permite identificar el tipo general de información contenida en la base de datos, incluyendo variables demográficas, una variable de agrupación y puntuaciones en pruebas cognitivas.
El estudio original contiene puntuaciones de pruebas de capacidad mental aplicadas a 301 estudiantes de séptimo y octavo grado pertenecientes a dos escuelas distintas: Pasteur y Grant-White. En la versión completa del estudio se incluyen 26 pruebas; sin embargo, gran parte de la literatura utiliza un subconjunto reducido de 15 variables, que es el que se emplea en esta aplicación.
dim(HolzingerSwineford1939)
## [1] 301 15
La dimensión del conjunto de datos confirma que se dispone de 301 observaciones y 15 variables, lo cual resulta adecuado para ilustrar procedimientos de análisis factorial confirmatorio y evaluación de invarianza multigrupo.
Adicionalmente, el conjunto de datos presenta las siguientes características clave para el análisis de invarianza de medida:
Dos grupos, definidos por la variable school (Pasteur y Grant-White), que puede actuar como variable de agrupación en el análisis multigrupo.
Tres constructos latentes teóricamente definidos:
visual: habilidades de percepción visual.
textual: habilidades verbales.
speed: rapidez en tareas cognitivas.
Nueve indicadores observados, distribuidos equitativamente en tres ítems por cada factor latente.
A continuación se muestran los nombres de todas las variables incluidas en el conjunto de datos:
names(HolzingerSwineford1939)
## [1] "id" "sex" "ageyr" "agemo" "school" "grade" "x1" "x2"
## [9] "x3" "x4" "x5" "x6" "x7" "x8" "x9"
Las variables pueden agruparse conceptualmente de la siguiente forma:
Variables de identificación y contexto:
id: identificador del estudiante.
school: escuela (group 1 = Pasteur o group 2 = Grant-White).
grade: grado escolar.
Variables demográficas:
sex: género (1 = Male o 2 = Female).
ageyr: edad (parte del año).
agemo: edad (parte del mes).
Indicadores cognitivos x1, x2, …, x9, utilizados en el modelo factorial y que fueron calculadas a través de funciones de pruebas cognitivas:
Factor visual: habilidades de percepción y razonamiento visual
x1: Visual perception (percepción visual).
x2: Cubes (cubos).
x3: Lozenges (pastillas).
Factor textual : habilidades verbales y de comprensión lingüística
x4: Paragraph comprehension (comprensión de parágrafos).
x5: Sentence completion (completar oraciones).
x6: Word meaning (significado de palabras).
Factor speed: rapidez en tareas cognitivas simples
x7: Speeded addition (adición con velocidad).
x8: Speeded counting of dots (conteo de puntos con velocidad).
x9: Speeded discrimination straight and curved capitals (discriminación acelerada de letras mayúsculas rectas y curvas). Por ejemplo: letras con trazos rectos (A, E, F, H, I, K, L, M, N, T, V, W, X, Y, Z) y letras con trazos curvos (B, C, D, G, J, O, P, Q, R, S, U).
Finalmente, se inspecciona la estructura interna del conjunto de datos para identificar el tipo de cada variable (numérica, factor, carácter), información relevante para la correcta especificación del modelo CFA multigrupo:
str(HolzingerSwineford1939)
## 'data.frame': 301 obs. of 15 variables:
## $ id : int 1 2 3 4 5 6 7 8 9 11 ...
## $ sex : int 1 2 2 1 2 2 1 2 2 2 ...
## $ ageyr : int 13 13 13 13 12 14 12 12 13 12 ...
## $ agemo : int 1 7 1 2 2 1 1 2 0 5 ...
## $ school: Factor w/ 2 levels "Grant-White",..: 2 2 2 2 2 2 2 2 2 2 ...
## $ grade : int 7 7 7 7 7 7 7 7 7 7 ...
## $ x1 : num 3.33 5.33 4.5 5.33 4.83 ...
## $ x2 : num 7.75 5.25 5.25 7.75 4.75 5 6 6.25 5.75 5.25 ...
## $ x3 : num 0.375 2.125 1.875 3 0.875 ...
## $ x4 : num 2.33 1.67 1 2.67 2.67 ...
## $ x5 : num 5.75 3 1.75 4.5 4 3 6 4.25 5.75 5 ...
## $ x6 : num 1.286 1.286 0.429 2.429 2.571 ...
## $ x7 : num 3.39 3.78 3.26 3 3.7 ...
## $ x8 : num 5.75 6.25 3.9 5.3 6.3 6.65 6.2 5.15 4.65 4.55 ...
## $ x9 : num 6.36 7.92 4.42 4.86 5.92 ...
Esta inspección confirma la presencia de variables categóricas (por ejemplo, school) y variables numéricas correspondientes a los indicadores observados, lo cual resulta fundamental para la correcta definición del modelo de medición y de un análisis multigrupo posterior.
datosCompleto <- lavaan::HolzingerSwineford1939
attach(datosCompleto)
Se resalta que sólo algunas de estas variables se utilizarán para realizar el SEM.
dat <- datosCompleto[7:15]
attach(dat)
head(dat,4)
| x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 |
|---|---|---|---|---|---|---|---|---|
| 3.333333 | 7.75 | 0.375 | 2.333333 | 5.75 | 1.2857143 | 3.391304 | 5.75 | 6.361111 |
| 5.333333 | 5.25 | 2.125 | 1.666667 | 3.00 | 1.2857143 | 3.782609 | 6.25 | 7.916667 |
| 4.500000 | 5.25 | 1.875 | 1.000000 | 1.75 | 0.4285714 | 3.260870 | 3.90 | 4.416667 |
| 5.333333 | 7.75 | 3.000 | 2.666667 | 4.50 | 2.4285714 | 3.000000 | 5.30 | 4.861111 |
Primero, es recomendable examinar los datos antes de realizar cualquier análisis. Cualquier participante que tenga algún dato faltante será excluido por completo del análisis. Se pueden utilizar diversas funciones (como se muestra a continuación).
describe(dat)
## vars n mean sd median trimmed mad min max range skew kurtosis se
## x1 1 301 4.94 1.17 5.00 4.96 1.24 0.67 8.50 7.83 -0.25 0.31 0.07
## x2 2 301 6.09 1.18 6.00 6.02 1.11 2.25 9.25 7.00 0.47 0.33 0.07
## x3 3 301 2.25 1.13 2.12 2.20 1.30 0.25 4.50 4.25 0.38 -0.91 0.07
## x4 4 301 3.06 1.16 3.00 3.02 0.99 0.00 6.33 6.33 0.27 0.08 0.07
## x5 5 301 4.34 1.29 4.50 4.40 1.48 1.00 7.00 6.00 -0.35 -0.55 0.07
## x6 6 301 2.19 1.10 2.00 2.09 1.06 0.14 6.14 6.00 0.86 0.82 0.06
## x7 7 301 4.19 1.09 4.09 4.16 1.10 1.30 7.43 6.13 0.25 -0.31 0.06
## x8 8 301 5.53 1.01 5.50 5.49 0.96 3.05 10.00 6.95 0.53 1.17 0.06
## x9 9 301 5.37 1.01 5.42 5.37 0.99 2.78 9.25 6.47 0.20 0.29 0.06
Se resalta que, la función describe de la librería psych, el output:
timmed se refiere a la mediana truncada, que es una medida de tendencia central robusta que calcula la mediana de un conjunto de datos después de eliminar un cierto porcentaje de observaciones más extremas.
mad significa desviación absoluta mediana, que es una medida de dispersión que indica la variabilidad de los datos en relación con la mediana.
skew se refiere a la asimetría de los datos, que indica si la distribución de los datos es simétrica o si está sesgada hacia un lado. Un valor positivo indica sesgo hacia la derecha, mientras que un valor negativo indica sesgo hacia la izquierda.
kurtosis se refiere a la curtosis de los datos, que indica la forma de la distribución de los datos en relación con una distribución normal. Un valor de kurtosis mayor que cero indica una distribución más puntiaguda (más picos) que la distribución normal, mientras que un valor menor que cero indica una distribución más achatada (menos picos) que la distribución normal.
se se refiere al error estándar, que es una medida de la precisión de la estimación de una estadística de la muestra. Indica la variabilidad esperada en la estimación de la estadística si se muestrea repetidamente de la misma población. Un error estándar más pequeño indica una estimación más precisa de la estadística de interés.
summary(dat)
## x1 x2 x3 x4
## Min. :0.6667 Min. :2.250 Min. :0.250 Min. :0.000
## 1st Qu.:4.1667 1st Qu.:5.250 1st Qu.:1.375 1st Qu.:2.333
## Median :5.0000 Median :6.000 Median :2.125 Median :3.000
## Mean :4.9358 Mean :6.088 Mean :2.250 Mean :3.061
## 3rd Qu.:5.6667 3rd Qu.:6.750 3rd Qu.:3.125 3rd Qu.:3.667
## Max. :8.5000 Max. :9.250 Max. :4.500 Max. :6.333
## x5 x6 x7 x8
## Min. :1.000 Min. :0.1429 Min. :1.304 Min. : 3.050
## 1st Qu.:3.500 1st Qu.:1.4286 1st Qu.:3.478 1st Qu.: 4.850
## Median :4.500 Median :2.0000 Median :4.087 Median : 5.500
## Mean :4.341 Mean :2.1856 Mean :4.186 Mean : 5.527
## 3rd Qu.:5.250 3rd Qu.:2.7143 3rd Qu.:4.913 3rd Qu.: 6.100
## Max. :7.000 Max. :6.1429 Max. :7.435 Max. :10.000
## x9
## Min. :2.778
## 1st Qu.:4.750
## Median :5.417
## Mean :5.374
## 3rd Qu.:6.083
## Max. :9.250
Otra tabla de frecuencias:
# Genera la tablas usando dplyr and tidyr y kable
dat %>%
select(x1:x9) %>%
gather("Variable", "value") %>%
group_by(Variable) %>%
summarise(Mean=mean(value, na.rm=TRUE),
SD=sd(value, na.rm=TRUE),
min=min(value, na.rm=TRUE),
max=max(value, na.rm=TRUE),
'% Perdidos'=100*length(which(is.na(value)))/n()) %>%
kable(digits=2, format="pandoc", caption="Tabla 1: Estadisticos descriptivos para las variables observadas")
| Variable | Mean | SD | min | max | % Perdidos |
|---|---|---|---|---|---|
| x1 | 4.94 | 1.17 | 0.67 | 8.50 | 0 |
| x2 | 6.09 | 1.18 | 2.25 | 9.25 | 0 |
| x3 | 2.25 | 1.13 | 0.25 | 4.50 | 0 |
| x4 | 3.06 | 1.16 | 0.00 | 6.33 | 0 |
| x5 | 4.34 | 1.29 | 1.00 | 7.00 | 0 |
| x6 | 2.19 | 1.10 | 0.14 | 6.14 | 0 |
| x7 | 4.19 | 1.09 | 1.30 | 7.43 | 0 |
| x8 | 5.53 | 1.01 | 3.05 | 10.00 | 0 |
| x9 | 5.37 | 1.01 | 2.78 | 9.25 | 0 |
La mayoría de los elementos solo carecen de datos equivalentes a 20 o 30 participantes, lo cual no representa un gran problema en un conjunto de datos con 2800 observaciones. Sin embargo, es posible que algunos de estos valores faltantes no se superpongan, lo que significa que podrían faltar 20 o 30 individuos diferentes en cada una de las variables.
missings <- colSums(is.na(dat))
missings
## x1 x2 x3 x4 x5 x6 x7 x8 x9
## 0 0 0 0 0 0 0 0 0
summary(missings)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0 0 0 0 0 0
Alternativamente, podemos mirar algunas variables con alguna condición para el número de datos perdidos.
mydata <- dat[ , missings<15]
names(mydata)
## [1] "x1" "x2" "x3" "x4" "x5" "x6" "x7" "x8" "x9"
complete.casesNo obstante, podemos determinar el número de “casos completos” dentro de los datos, que son individuos que no tienen datos faltantes en absoluto en el cuestionario.
faltante <- complete.cases(dat);tail(faltante)
## [1] TRUE TRUE TRUE TRUE TRUE TRUE
sum(faltante)
## [1] 301
La función complete.cases produce un vector de valores booleanos, donde TRUE indica un caso completo y FALSE indica un caso con valores faltantes. La suma de este vector nos da el total de casos completos, que en este caso es 301. El porcentaje de datos ausentes es 0%:
(1 - (sum(faltante)/nrow(dat)))*100
## [1] 0
Aunque no existe un valor exacto que determine qué cantidad de datos faltantes es aceptable, la importancia del tamaño de la muestra en el análisis factorial es innegable. Según algunos expertos, se recomienda contar con al menos 10 observaciones por cada variable en dicho análisis, lo que sugiere que nuestro tamaño de muestra es apropiado para nuestros objetivos.
Un modelo CFA que se suele propuesto para estas 9 variables consta de tres variables latentes (o factores), cada una con tres indicadores:
Un factor visual (visual) medido por 3 variables: x1, x2 y x3.
Un factor textual (textual) medido por 3 variables: x4, x5 y x6.
Un factor de velocidad (speed) medido por 3 variables: x7, x8 y x9.
La Figura 5.1 contiene una representación gráfica del modelo de tres factores.
Figure 5.1: Modelo CFA para los datos HolzingerSwineford1939
Una sintaxis de modelo lavaan completa es simplemente una combinación de estos tipos de fórmulas, encerradas entre comillas simples.
modelo <- '
visual =~ x1 + x2 + x3
textual =~ x4 + x5 + x6
speed =~ x7 + x8 + x9
'
En este ejemplo, la sintaxis del modelo sólo contiene tres definiciones de variables latentes. En particular,
El operador =~ indica una relación de medición, es decir, que un factor latente explica un conjunto de variables observadas.
Las variables a la izquierda de =~ representan constructos latentes.
Las variables a la derecha representan indicadores observados.
Por ejemplo, la expresión:
visual =~ x1 + x2 + x3
indica que el factor latente visual se mide a través de los ítems x1, x2 y x3. Las cargas factoriales asociadas a estas relaciones se estiman a partir de los datos, salvo aquellas que se fijan para garantizar la identificabilidad del modelo (por ejemplo, fijando una carga factorial a 1 en cada factor).
En el contexto del análisis factorial confirmatorio (CFA) con el paquete lavaan en R, el número de parámetros en el output del modelo depende de las especificaciones del modelo y los datos utilizados.
El modelo que se ha indicado para los datos HolzingerSwineford1939 especifica tres factores latentes (Visual, Textual, Speed) cada uno con tres indicadores.
En este sentido, identificamos dos tipos de parámetros:
Parámetros de medidas.
Parámetros estructurales.
En un modelo CFA típico, los parámetros de medidas que se quieren estimar incluyen (véase la Figura 6.1):
1. Cargas Factoriales.
Las relaciones entre los factores latentes y sus indicadores.
\[\lambda_1, \quad \lambda_2, \quad \lambda_3, \quad \lambda_4, \quad \lambda_5, \quad \lambda_6, \quad \lambda_7, \quad \lambda_8, \quad \lambda_9\]
2. Interceptos de los Factores Latentes.
\[\tau_1, \quad \tau_2, \quad \tau_3, \quad \tau_4, \quad \tau_5, \quad \tau_6, \quad \tau_7, \quad \tau_8, \quad \tau_9\] 3. Varianzas de los Errores de Medición.
Varianzas de los términos de error asociados a cada indicador.
\[V(\varepsilon_1), \quad V(\varepsilon_2), \quad V(\varepsilon_3), \quad V(\varepsilon_4), \quad V(\varepsilon_5), \quad V(\varepsilon_6), \quad V(\varepsilon_7), \quad V(\varepsilon_8), \quad V(\varepsilon_9)\]
En un modelo CFA típico, los parámetros estructurales que se quieren estimar incluyen (véase la Figura 6.1):
4. La media de los factores.
\[\mu_1, \quad \mu_2, \quad \mu_3\]
5. Varianzas de los Factores Latentes.
Varianzas de cada factor.
\[\psi_{11}, \quad \psi_{22}, \quad \psi_{33}\]
6. Covarianzas de los Factores Latentes.
Covarianzas entre los factores.
\[\psi_{12}, \quad \psi_{13}, \quad \psi_{23}\]
Figure 6.1: Tipos de parámetros del modelo CFA
summary() y en los diagramas SEMEn un modelo CFA/SEM, la carga factorial estandarizada se define como:
\[ \lambda_{\text{std}} = \lambda_{\text{est}} \cdot \frac{\sigma_{\eta}}{\sigma_x}, \]
donde:
\(\lambda_{\text{est}}\) es la carga no estandarizada,
\(\sigma_{\eta}\) es la desviación estándar del factor latente y
\(\sigma_x\) es la desviación estándar del indicador observado.
Por defecto, la función summary() de lavaan presenta estimaciones no estandarizadas (columna Estimate). Estas estimaciones reflejan directamente el esquema de identificación del modelo, en el cual una carga factorial por factor suele fijarse en 1 (por ejemplo, x1 = 1, x4 = 1, x7 = 1) con el fin de definir la escala de las variables latentes.
En contraste, cuando se utiliza semPaths(..., what = "std", whatLabels = "std") del paquete semPlot, el diagrama SEM muestra coeficientes estandarizados. En este caso, las cargas factoriales fijadas a 1 en la métrica original no permanecen iguales a 1, ya que la estandarización transforma los parámetros. Por tanto, aun cuando \(\lambda_{\text{est}} = 1\), si \(\sigma_{\eta} \neq \sigma_x\), se obtiene necesariamente que
\[ \lambda_{\text{std}} \neq 1. \]
Esto explica por qué en la salida de summary() se van a observar cargas iguales a 1, mientras que en los diagramas estandarizados dichas cargas van tomar valores distintos (si no se escriben los argumentos apropiados).
Estimaciones no estandarizadas \(\lambda_{\text{est}}\): summary() \(\Longleftrightarrow\) semPaths(..., what = "est")
Estimaciones estandarizadas \(\lambda_{\text{std}}\): summary(..., standardized = TRUE) \(\Longleftrightarrow\) semPaths(..., what = "std")
En este capítulo, los diagramas SEM se presentan utilizando estimaciones no estandarizadas, de modo que las cargas fijadas en \(\lambda = 1\) se mantengan explícitas y reflejen correctamente el esquema de identificación del modelo.
lavaan::cfacfa: ejecuciónPodemos ajustar el modelo como sigue:
CFA <- lavaan::cfa(modelo, data=dat)
CFA
## lavaan 0.6-19 ended normally after 35 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 21
##
## Number of observations 301
##
## Model Test User Model:
##
## Test statistic 85.306
## Degrees of freedom 24
## P-value (Chi-square) 0.000
cfa: gráfico del modelo con R1. El diagrama básico.
semPaths(CFA,
what = "path", #Muestra las rutas con cargas, regresiones, covarianzas
#what = "std", #Muestra las estimaciones estandarizadas de las rutas
#what = "est", #Muestra las estimaciones no estandarizadas de las rutas
#what = "col", #Muestra matriz de varianzas-covarianzas de var. observadas
#what = "mod", #Muestra camino adicional que podría mejorar ajuste del modelo
#what = "model", #Muestra una representación gral del modelo
#what = "all", #Muestra todos elementos posibles (rutas y estimaciones)
#what = "par", #Muestra todos los parámetros estimados del modelo
#what = "eq", #Muestra las ecuaciones estructurales del modelo
layout = "circle", #Dispone nodos en círculo (solo permitido si rotation= 1 o 3)
title = FALSE, #No muestra el título del gráfico
edge.color = "red", #Establece el color de los bordes (aristas) en negro
edge.label.cex = 1 #Tamaño de las cargas factoriales
)
2. Se puede visualizar el modelo con nodos personalizados.
semPaths(CFA,
what = "path", #Muestra las rutas con cargas, regresiones, covarianzas
#what = "std", #Muestra las estimaciones estandarizadas de las rutas
#what = "est", #Muestra las estimaciones no estandarizadas de las rutas
#what = "col", #Muestra matriz de varianzas-covarianzas de var. observadas
#what = "mod", #Muestra camino adicional que podría mejorar ajuste del modelo
#what = "model", #Muestra una representación gral del modelo
#what = "all", #Muestra todos elementos posibles (rutas y estimaciones)
#what = "par", #Muestra todos los parámetros estimados del modelo
#what = "eq", #Muestra las ecuaciones estructurales del modelo
style = "lisrel", #Usa un estilo predefinido similar al estilo LISREL
#style = "ram": #Estilo de RAM (Reticular Action Model), común en gráficos SEM
#style = "mx": #Estilo de Mx, herramienta de SEM
#style = "eqs": #Estilo similar al software EQS
#layout = "tree", #Dispone nodos en una estructura jerárquica similar a un árbol
#layout="tree2", #Parecida a la anterior
layout="circle", #Dispone nodos en círculo (solo permitido si rotation= 1 o 3)
#layout = "spring", #Minimiza fuerzas de repulsión y atracción entre nodos
#layout = "lgl", #Algoritmo "Large Graph Layout" (útil para gráficos grandes)
#layout = "kamada", #Algorit. Kamada-Kawai para disposición basada en energía
#layout = "fruchterman", #Algoritmo Fruchterman-Reingold (disposición por fuerzas)
title = FALSE, #No muestra el título del gráfico
edge.color = "black", #Establece el color de los bordes (aristas) en negro
edge.label.cex = 1, #Tamaño de las cargas factoriales
#node.color = "blue", #Establece el color de fondo de los nodos
node.label.cex = 1.5, #Tamaño del texto de las etiquetas dentro de los nodos.
#node.shape = "rectangle", #Establece la forma de los nodos como rectángulos
curvePivot=TRUE, #Conexiones entre las variables observadas
label.prop = 1,
color = list(
lat = "orange", #Color de las variables latentes
man = "lightgreen" #Color de las variables observadas
)
)
3. Se puede visualizar el modelo con otras opciones personalizadas.
semPaths(CFA,
#what = "path", #Muestra las rutas con cargas, regresiones, covarianzas
#what = "std", #Muestra las estimaciones estandarizadas de las rutas
#what = "est", #Muestra las estimaciones no estandarizadas de las rutas
#what = "col", #Muestra matriz de varianzas-covarianzas de var. observadas
#what = "mod", #Muestra camino adicional que podría mejorar ajuste del modelo
#what = "model", #Muestra una representación gral del modelo
#what = "all", #Muestra todos elementos posibles (rutas y estimaciones)
#what = "par", #Muestra todos los parámetros estimados del modelo
what = "eq", #Muestra las ecuaciones estructurales del modelo
whatLabels ="est", #Muestra estimaciones no estandarizadas de los parámetros
#whatLabels ="std": #Muestra estimaciones estandarizadas de los parámetros
#whatLabels ="name": #Muestra los nombres de las relaciones o parámetros
#whatLabels ="none": #No muestra ninguna etiqueta en las aristas
#whatLabels ="eq": #Muestra etiquetas de ecuaciones (usualmente en SEM).
#whatLabels ="both": #Muestra estimaciones estandarizadas y no estandarizadas
style = "lisrel", #Usa un estilo predefinido similar al estilo LISREL
#style = "ram": #Estilo de RAM (Reticular Action Model), común en gráficos SEM
#style = "mx": #Estilo de Mx, herramienta de SEM
#style = "eqs": #Estilo similar al software EQS
#layout = "tree", #Dispone nodos en una estructura jerárquica similar a un árbol
layout="tree2", #Parecida a la anterior
#layout="circle", #Dispone nodos en círculo (solo permitido si rotation= 1 o 3)
#layout = "spring", #Minimiza fuerzas de repulsión y atracción entre nodos
#layout = "lgl", #Algorit. "Large Graph Layout" (útil para gráficos grandes)
#layout = "kamada", #Algorit. Kamada-Kawai para disposición basada en energía
#layout = "fruchterman", #Algoritmo Fruchterman-Reingold (disposición por fuerzas)
#rotation = 1, #Rotación de todo el diagrama
rotation=2,
#rotation=3,
nCharNodes = 0, #0=ajustar al número máximo de caracteres dentro de las latentes
sizeMan = 8, #Tamaño de los nodos que representan variables manifiestas
sizeLat = 9, #Tamaño de los nodos que representan variables latentes
sizeInt = 1, #Tamaño de los nodos que representan variables interiores
nCharEdges = 3, #Número máximo de caracteres para etiquetas de cargas factoriales
edge.label.cex = 1, #Tamaño de las cargas factoriales
#freeStyle = "blue", #Parámetros fijos son azules
fixedStyle = c("red",3), #Parámetros fijos son rojos y de tamaño 3
#curvePivot=TRUE, #Conexiones entre las variables observada
intercepts=TRUE, #Muestra u oculta los nodos de interceptos (medias) del modelo
residuals=FALSE, #Muestra las flechas asociadas a los términos residuales (errores)
exoCov=FALSE, #Muestra las covarianzas entre variables exógenas (latentes, etc.)
color = list(
lat = "orange", #Color de las variables latentes
man = "lightgreen" #Color de las variables observadas
)
)
cfa: observacionesLa función cfa es una función específica para establecer modelos de análisis factorial confirmatorio.
El primer argumento es el modelo especificado por el usuario.
El segundo argumento es el conjunto de datos que contiene las variables observadas.
Los interceptos \(\tau\) de los factores representan las medias de las variables observadas (x1, x2, x3, x4, x5, x6, x7, x8, x9) cuando los factores latentes (Visual, Textual, Speed) tienen un valor de cero.
cfa: primera parteEn la Figura 9.1 se resalta la primera parte del output de `lavaan.
Figure 9.1: Primera parte del output de lavaan (información general)
1. El modelo finalizó normalmente después de 35 iteraciones.
Este mensaje indica que el proceso de estimación del modelo finalizó correctamente después de 35 iteraciones. Esto significa que el algoritmo de optimización alcanzó una solución estable dentro del número especificado de iteraciones.
2. El estimador utilizado fue el máximo verosimilitud (ML).
ML significa Maximum Likelihood (Máxima Verosimilitud). Es el estimador utilizado para ajustar el modelo. El estimador de máxima verosimilitud es uno de los métodos más comunes para estimar los parámetros del modelo en análisis factorial confirmatorio, ya que se basa en la suposición de que los datos siguen una distribución normal multivariada.
3. El método de optimización fue NLMINB.
La abreviatura NLMINB se refiere a “Nonlinear MINimization using Bounds”, que significa “Minimización no lineal usando límites”.
Específicamente, NLMINB se refiere al método de optimización usado para encontrar los valores óptimos de los parámetros del modelo.
NLMINB es un algoritmo de optimización que es robusto y eficiente, especialmente para problemas de minimización no linealque tienen restricciones en los parámetros o son de naturaleza no lineal.
En secciones siguientes, se describirán brevemente otros métodos alternativos de optimización.
4. El modelo tiene 21 parámetros.
Esta línea indica que el modelo tiene un total de 21 parámetros a estimar. Esto incluye cargas factoriales, varianzas, covarianzas y términos de error, entre otros. En secciones siguientes se va a detallar más al respecto.
5. Se utilizaron 301 observaciones en el ajuste del modelo.
Esta sección muestra que se utilizaron 301 observaciones (o casos) para ajustar el modelo. Es el tamaño de la muestra de datos.
cfa: estimadoreslavaan (aparte de ML)1. MLR (Maximum Likelihood with Robust Standard Errors).
Proporciona errores estándar robustos y una prueba chi-cuadrado robusta.
Es útil cuando los datos no cumplen con la suposición de normalidad multivariada.
2. MLM (Maximum Likelihood with Robust Standard Errors).
Similar a MLR pero usa la corrección de Satorra-Bentler para el estadístico chi-cuadrado.
Es adecuado para datos que no son normales pero que tienen desviaciones leves de la normalidad.
3. MLF (Maximum Likelihood with Robust Standard Errors and a Scaling Factor).
Similar a MLR pero incluye un factor de escalado adicional para ajustar los errores estándar.
4. WLS (Weighted Least Squares).
Utiliza las matrices de covarianza y asimetría para estimar los parámetros. Es especialmente útil para datos categóricos y ordinales.
5. WLSM (Weighted Least Squares Mean and Variance adjusted).
Una variante del WLS que ajusta tanto la media como la varianza, proporcionando una corrección robusta.
También es adecuado para datos categóricos y ordinales.
6. WLSMV (Weighted Least Squares Mean and Variance adjusted).
Similar a WLSM pero con una corrección adicional para la media y la varianza.
Es ampliamente utilizado para modelos con datos categóricos.
7. ULS (Unweighted Least Squares).
Minimiza las discrepancias sin ponderar las observaciones.
Puede ser útil en casos donde se prefieren métodos no ponderados.
8. ULSM (Unweighted Least Squares Mean and Variance adjusted).
Similar a ULS pero ajusta la media y la varianza.
9. DWLS (Diagonally Weighted Least Squares).
Similar a WLS pero usa solo los elementos diagonales de la matriz de covarianza.
Es más eficiente computacionalmente y adecuado para datos con variables categóricas.
10. PML (Pseudomaximum Likelihood).
Utilizado principalmente para datos de conteo o cuando se tiene información incompleta.
11. Bayes (Bayesian Estimation).
Utiliza métodos bayesianos para la estimación de parámetros.
Es útil cuando se desea incorporar información a priori o cuando los modelos son complejos y otros métodos fallan en converger.
lavaan (ejemplos)1. A manera de ejemplo, para ajustar el modelo utilizando el estimador WLSMV, se ejecuta:
fit <- lavaan::cfa(modelo, data = dat, estimator = "WLSMV")
fit
## lavaan 0.6-19 ended normally after 44 iterations
##
## Estimator DWLS
## Optimization method NLMINB
## Number of model parameters 21
##
## Number of observations 301
##
## Model Test User Model:
## Standard Scaled
## Test Statistic 43.902 79.342
## Degrees of freedom 24 24
## P-value (Chi-square) 0.008 0.000
## Scaling correction factor 0.598
## Shift parameter 5.867
## simple second-order correction
2. A manera de ejemplo, para ajustar el modelo utilizando el estimador Bayes, se ejecuta:
fit <- blavaan::bcfa(modelo, data = dat, estimator = "Bayes", burnin = 100, sample = 1000)
fit
##
## SAMPLING FOR MODEL 'stanmarg' NOW (CHAIN 1).
## Chain 1:
## Chain 1: Gradient evaluation took 0.001585 seconds
## Chain 1: 1000 transitions using 10 leapfrog steps per transition would take 15.85 seconds.
## Chain 1: Adjust your expectations accordingly!
## Chain 1:
## Chain 1:
## Chain 1: WARNING: There aren't enough warmup iterations to fit the
## Chain 1: three stages of adaptation as currently configured.
## Chain 1: Reducing each adaptation stage to 15%/75%/10% of
## Chain 1: the given number of warmup iterations:
## Chain 1: init_buffer = 15
## Chain 1: adapt_window = 75
## Chain 1: term_buffer = 10
## Chain 1:
## Chain 1: Iteration: 1 / 1100 [ 0%] (Warmup)
## Chain 1: Iteration: 101 / 1100 [ 9%] (Sampling)
## Chain 1: Iteration: 210 / 1100 [ 19%] (Sampling)
## Chain 1: Iteration: 320 / 1100 [ 29%] (Sampling)
## Chain 1: Iteration: 430 / 1100 [ 39%] (Sampling)
## Chain 1: Iteration: 540 / 1100 [ 49%] (Sampling)
## Chain 1: Iteration: 650 / 1100 [ 59%] (Sampling)
## Chain 1: Iteration: 760 / 1100 [ 69%] (Sampling)
## Chain 1: Iteration: 870 / 1100 [ 79%] (Sampling)
## Chain 1: Iteration: 980 / 1100 [ 89%] (Sampling)
## Chain 1: Iteration: 1090 / 1100 [ 99%] (Sampling)
## Chain 1: Iteration: 1100 / 1100 [100%] (Sampling)
## Chain 1:
## Chain 1: Elapsed Time: 0.181 seconds (Warm-up)
## Chain 1: 1.881 seconds (Sampling)
## Chain 1: 2.062 seconds (Total)
## Chain 1:
##
## SAMPLING FOR MODEL 'stanmarg' NOW (CHAIN 2).
## Chain 2:
## Chain 2: Gradient evaluation took 0.000133 seconds
## Chain 2: 1000 transitions using 10 leapfrog steps per transition would take 1.33 seconds.
## Chain 2: Adjust your expectations accordingly!
## Chain 2:
## Chain 2:
## Chain 2: WARNING: There aren't enough warmup iterations to fit the
## Chain 2: three stages of adaptation as currently configured.
## Chain 2: Reducing each adaptation stage to 15%/75%/10% of
## Chain 2: the given number of warmup iterations:
## Chain 2: init_buffer = 15
## Chain 2: adapt_window = 75
## Chain 2: term_buffer = 10
## Chain 2:
## Chain 2: Iteration: 1 / 1100 [ 0%] (Warmup)
## Chain 2: Iteration: 101 / 1100 [ 9%] (Sampling)
## Chain 2: Iteration: 210 / 1100 [ 19%] (Sampling)
## Chain 2: Iteration: 320 / 1100 [ 29%] (Sampling)
## Chain 2: Iteration: 430 / 1100 [ 39%] (Sampling)
## Chain 2: Iteration: 540 / 1100 [ 49%] (Sampling)
## Chain 2: Iteration: 650 / 1100 [ 59%] (Sampling)
## Chain 2: Iteration: 760 / 1100 [ 69%] (Sampling)
## Chain 2: Iteration: 870 / 1100 [ 79%] (Sampling)
## Chain 2: Iteration: 980 / 1100 [ 89%] (Sampling)
## Chain 2: Iteration: 1090 / 1100 [ 99%] (Sampling)
## Chain 2: Iteration: 1100 / 1100 [100%] (Sampling)
## Chain 2:
## Chain 2: Elapsed Time: 0.247 seconds (Warm-up)
## Chain 2: 1.839 seconds (Sampling)
## Chain 2: 2.086 seconds (Total)
## Chain 2:
##
## SAMPLING FOR MODEL 'stanmarg' NOW (CHAIN 3).
## Chain 3:
## Chain 3: Gradient evaluation took 0.000141 seconds
## Chain 3: 1000 transitions using 10 leapfrog steps per transition would take 1.41 seconds.
## Chain 3: Adjust your expectations accordingly!
## Chain 3:
## Chain 3:
## Chain 3: WARNING: There aren't enough warmup iterations to fit the
## Chain 3: three stages of adaptation as currently configured.
## Chain 3: Reducing each adaptation stage to 15%/75%/10% of
## Chain 3: the given number of warmup iterations:
## Chain 3: init_buffer = 15
## Chain 3: adapt_window = 75
## Chain 3: term_buffer = 10
## Chain 3:
## Chain 3: Iteration: 1 / 1100 [ 0%] (Warmup)
## Chain 3: Iteration: 101 / 1100 [ 9%] (Sampling)
## Chain 3: Iteration: 210 / 1100 [ 19%] (Sampling)
## Chain 3: Iteration: 320 / 1100 [ 29%] (Sampling)
## Chain 3: Iteration: 430 / 1100 [ 39%] (Sampling)
## Chain 3: Iteration: 540 / 1100 [ 49%] (Sampling)
## Chain 3: Iteration: 650 / 1100 [ 59%] (Sampling)
## Chain 3: Iteration: 760 / 1100 [ 69%] (Sampling)
## Chain 3: Iteration: 870 / 1100 [ 79%] (Sampling)
## Chain 3: Iteration: 980 / 1100 [ 89%] (Sampling)
## Chain 3: Iteration: 1090 / 1100 [ 99%] (Sampling)
## Chain 3: Iteration: 1100 / 1100 [100%] (Sampling)
## Chain 3:
## Chain 3: Elapsed Time: 0.196 seconds (Warm-up)
## Chain 3: 1.897 seconds (Sampling)
## Chain 3: 2.093 seconds (Total)
## Chain 3:
## Computing post-estimation metrics (including lvs if requested)...
## blavaan 0.5.8 ended normally after 1000 iterations
##
## Estimator BAYES
## Optimization method MCMC
## Number of model parameters 21
##
## Number of observations 301
##
## Statistic MargLogLik PPP
## Value -3805.507 0.000
La elección del estimador depende de las características de nuestros datos y de las hipótesis subyacentes en tu modelo. Aquí hay algunas pautas generales:
ML (Maximum Likelihood): Utilizado comúnmente cuando se asume que los datos siguen una distribución normal multivariada.
MLR, MLM, MLF: Utilizados cuando los datos no cumplen con la normalidad multivariada.
WLS, WLSM, WLSMV, DWLS: Preferidos para datos categóricos u ordinales.
ULS, ULSM: Utilizados cuando se prefieren métodos no ponderados.
Bayes: Útil para modelos complejos o cuando se desea incorporar información a priori.
Cada estimador tiene sus propias ventajas y desventajas, por lo que es importante considerar las características de tus datos y el objetivo de tu análisis al seleccionar el estimador adecuado.
cfa: métodos de optimizaciónNLMINB1. Manejo de Restricciones.
NLMINB puede manejar tanto restricciones de igualdad como de desigualdad en los parámetros, lo cual es útil en muchos problemas prácticos donde ciertos parámetros deben mantenerse dentro de ciertos límites.
2. Robustez.
Es un algoritmo robusto, lo que significa que puede converger en una solución óptima en una amplia variedad de problemas, incluyendo aquellos que son difíciles de resolver para otros algoritmos de optimización.
3. Convergencia.
Funciona bien en problemas de optimización donde otros métodos podrían no converger, especialmente en presencia de restricciones complicadas.
lavaan (aparte de NLMINB)Además de NLMINB, lavaan ofrece otros métodos de optimización. Aquí hay una lista de algunas de las opciones y sus características principales:
BFGS: Método Broyden-Fletcher-Goldfarb-Shanno, un algoritmo quasi-Newton que es adecuado para problemas suaves y bien comportados. No maneja restricciones explícitas tan fácilmente como NLMINB.
L-BFGS-B: Una variante del BFGS que permite restricciones en los parámetros (cotas inferiores y superiores), útil en problemas donde los parámetros necesitan estar dentro de ciertos rangos.
CG: Gradiente conjugado, adecuado para problemas grandes y dispersos. Es menos intensivo en memoria comparado con BFGS.
SANN: Recocido simulado (Simulated Annealing), un algoritmo de optimización global que puede evitar mínimos locales, aunque es menos eficiente para encontrar soluciones precisas.
Nelder-Mead: Método simplex, útil para problemas sin restricciones no lineales. Es robusto, pero puede ser menos eficiente en problemas de gran escala.
solnp: Método de optimización no lineal con restricciones, útil en problemas que tienen tanto restricciones lineales como no lineales.
lavaan (ejemplos)1. A manera de ejemplo, para ajustar el modelo utilizando el método BFGS, se ejecuta:
fit <- lavaan::cfa(modelo, data = dat, optim.method = "BFGS")
fit
## lavaan 0.6-19 ended normally after 86 iterations
##
## Estimator ML
## Optimization method BFGS
## Number of model parameters 21
##
## Number of observations 301
##
## Model Test User Model:
##
## Test statistic 85.306
## Degrees of freedom 24
## P-value (Chi-square) 0.000
2. A manera de ejemplo, para ajustar el modelo utilizando el método solnp, se ejecuta:
fit <- lavaan::cfa(modelo, data = dat, optim.method = "solnp")
fit
cfa: interceptoslavaanEl paquete lavaan sigue ciertas convenciones y suposiciones en el análisis CFA que afectan la estimación y conteo de los parámetros:
1. Modelo en Escala Estándar (Standardized Solution).
En la solución estándar, las medias de los factores latentes se fijan a cero (\(\alpha_1=0\), \(\alpha_2=0\), \(\alpha_3=0\)).
Esto implica que las medias de las variables observadas se explican únicamente en términos de sus interceptos y no se requieren estimaciones adicionales de los interceptos.
2. Identificación del Modelo.
Para asegurar que el modelo sea identificable, a menudo se fijan ciertos parámetros a valores conocidos (por ejemplo, fijar una carga factorial a 1 y los interceptos de los factores a cero).
En consecuencia, los interceptos de los factores no se estiman de manera explícita en el modelo porque ya se asumen como parte del ajuste global del modelo.
Para explicar por qué el output de lavaan::cfa muestra 21 parámetros, debemos desglosar los componentes del modelo y los parámetros que se estiman.
Vamos a enumerar los parámetros para el modelo especificado:
1. Cargas Factoriales.
Cada indicador tiene una carga factorial para el factor al que está asignado:
Visual: x1, x2, x3.
Textual: x4, x5, x6.
Speed: x7, x8, x9.
Cada uno de estos indicadores tiene una carga factorial, sumando un total de 9 cargas factoriales.
2. Interceptos de los Factores Latentes.
Cada indicador tiene asociado un intecepto para x1, x2, x3, x4, x5, x6, x7, x8 y x9. Entonces, en total serían 9 interceptos.
3. Varianzas de los Errores de Medición:
Cada indicador tiene una varianza de error asociada para x1, x2, x3, x4, x5, x6, x7, x8 y x9. Esto suma 9 parámetros.
4. Medias de los factores.
Cada factor tiene asociada una media:
Media de Visual.
Media de Textual.
media de Speed.
Es decir, serían 3 parámetros.
5. Varianzas de los Factores Latentes.
Hay tres factores latentes (Visual, Textual, Speed), y se estima una varianza para cada uno:
Varianza de Visual.
Varianza de Textual.
Varianza de Speed.
Esto suma 3 parámetros.
6. Covarianzas entre los Factores Latentes.
Hay covarianzas entre cada par de factores latentes. Para tres factores, esto se calcula como \({3 \choose 2}=3\) covarianzas:
Covarianza de Visual-Textual.
Covarianza de Visual-Speed.
Covarianza de Textual-Speed.
Esto suma 3 parámetros.
Sumando todos los valores anteriores, tenemos (véase la Figura 12.1):
Cargas factoriales: 9
Interceptos de los Factores Latentes: 9
Varianzas de los errores de medición: 9
Medias de los factores: 3
Varianzas de los factores: 3
Covarianzas entre factores: 3
\[9 \;+\; 9\; +\; 9\; + \;3\; + \;3 \;+ \;3 \;=\; 36\]
En la Figura 12.1 se visualiza lo anterior.
Figure 12.1: Total de parámetros en el modelo CFA no estándar
En muchos casos, uno de los indicadores para cada factor se fija a 1 para que el modelo sea identificable: \[\lambda_1\;=\; \lambda_4\;=\; \lambda_7\;=\; 1\]
Esto significa que para cada factor, una de las cargas factoriales no se estima (ya que se fija). Dado que hay 3 factores, esto resta 3 parámetros del total
Por defecto, el paquete lavaan estima un modelo en Escala Estándar. Por esta razón:
\[\alpha_1 \;=\; \alpha_2 \;=\; \alpha_3 \;=\; 0\]
\[\tau_1 \;=\; \tau_2 \;=\; \tau_3 \;=\; \tau_4 \;=\; \tau_5 \;=\; \tau_6 \;=\; \tau_7 \;=\; \tau_8 \;=\; \tau_9 \;=\; 0\]
\[36\;−\;15\; =\; 21\]
Figure 12.2: Total de parámetros según lavaan (eliminando parámetros fijos)
6 cargas factoriales estimadas (3 factores x 3 indicadores, menos 3 fijas).
0 interceptos.
9 varianzas de los errores de medición.
0 medias de los factores latentes.
3 varianzas de los factores latentes.
3 covarianzas entre los factores latentes.
Esto da un total de 21 parámetros estimados en el modelo CFA utilizando los datos HolzingerSwineford1939 y el modelo especificado.
En la Figura 12.3 se visualiza lo anterior.
Figure 12.3: Número de parámetros según lavaan
cfa: segunda partelavaanEn la Figura 12.3 se resalta la segunda parte del output de lavaan.
Figure 13.1: Segunda parte del output de lavaan (cfa)
Estos resultados corresponden a una prueba de ajuste del modelo (Model Test). En el contexto de la prueba de ajuste del modelo (Model Test) en lavaan, las hipótesis nula y alternativa son las siguientes:
Hipótesis nula (H0): La hipótesis nula en este caso sería que el modelo propuesto se ajusta bien a los datos observados en la muestra. Esto significa que no hay diferencias significativas entre los datos observados y los datos esperados según el modelo.
Hipótesis alternativa (H1): La hipótesis alternativa sería que el modelo propuesto no se ajusta bien a los datos observados en la muestra. Esto implica que hay diferencias significativas entre los datos observados y los datos esperados según el modelo, lo que se traduce en un mal ajuste del modelo.
Aquí está el significado de cada uno de los elementos de la salida:
1. Test statistic (Estadístico de prueba).
Es el valor del estadístico de prueba (que tiene distribución chi-cuadrada) y calculado para evaluar el ajuste del modelo. Un valor alto generalmente indica un mal ajuste del modelo a los datos observados. En este caso, el valor es 85.306.
2.Degrees of freedom (Grados de libertad).
Representa el número de valores que son libres de variar una vez que ciertas restricciones son impuestas. En CFA, los grados de libertad se calculan como la diferencia entre el número de observaciones independientes (generalmente el número de entradas en la matriz de covarianza) y el número de parámetros estimados. En este caso, hay 24 grados de libertad.
3. P-value (Chi-square) (Valor p obtenido con la chi-cuadrada).
Es la probabilidad de obtener un valor del estadístico de prueba igual o más extremo que el valor observado, asumiendo que la hipótesis nula es verdadera. En el contexto de lavaan, un valor \(p\) bajo (\(< 0.05\)) generalmente indica un mal ajuste del modelo, lo que significa que los datos observados difieren significativamente de los datos esperados según el modelo. En este caso, el valor p es 0.000, lo que indica que el modelo no se ajusta bien a los datos, ya que la probabilidad de obtener un valor de estadístico de prueba igual o más extremo es muy baja.
summary de lavaansummary: descripciónUna vez que el modelo ha sido ajustado, la función summary proporciona un buen resumen del modelo ajustado.
El argumento fit.measures=TRUE en la función summary indica que se desean incluir medidas de ajuste del modelo en el resumen del modelo.
summary: ejecución y outputSe ejecuta así:
summary(CFA, fit.measures=TRUE)
## lavaan 0.6-19 ended normally after 35 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model 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 (SABIC) 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 H_0: RMSEA <= 0.050 0.001
## P-value H_0: RMSEA >= 0.080 0.840
##
## 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|)
## 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
summary: partes 1 y 2El modelo finalizó normalmente después de 35 iteraciones.
El estimador utilizado fue el máximo verosimilitud (ML).
El método de optimización fue NLMINB.
El modelo tiene 21 parámetros.
Se utilizaron 301 observaciones en el ajuste del modelo.
En la Figura 16.1 se puede visualizar la parte No. 1 del output de lavaan::summary (es la misma que aparece en la Figura 9.1).
El estadístico de prueba es 85.306.
El modelo tiene 24 grados de libertad.
El valor p asociado al Chi-cuadrado es 0.000, lo que indica que el modelo no se ajusta bien a los datos (valor p significativamente menor que 0.05).
En la Figura 16.1 se puede visualizar la parte No. 2 del output de lavaan::summary (es la misma que aparece en la Figura 13.1).
summary: test modelo nuloTest Baseline Model: Modelo nulo (Baseline Model)El Modelo Baseline (o modelo nulo) es un modelo muy restringido que asume que todas las variables observadas son independientes entre sí.
Es decir, no hay correlaciones entre las variables.
En este modelo, todas las covarianzas entre las variables observadas se establecen a cero.
Test Baseline Model: modelo nulo en RPara ello se ejecuta el siguiente código:
model_null <- '
x1 ~~ x1
x2 ~~ x2
x3 ~~ x3
x4 ~~ x4
x5 ~~ x5
x6 ~~ x6
x7 ~~ x7
x8 ~~ x8
x9 ~~ x9
'
# Ajustar el modelo nulo
fit_null <- cfa(model_null, data = dat)
fit_null
## lavaan 0.6-19 ended normally after 16 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 9
##
## Number of observations 301
##
## Model Test User Model:
##
## Test statistic 918.852
## Degrees of freedom 36
## P-value (Chi-square) 0.000
Test Baseline Model: gráficar modelo nulo en RPara ello, se puede ejecutar el siguiente código:
semPaths(fit_null,
what = "path", #Muestra las rutas con cargas, regresiones, covarianzas
#what = "std", #Muestra las estimaciones estandarizadas de las rutas
#what = "est", #Muestra las estimaciones no estandarizadas de las rutas
#what = "col", #Muestra matriz de varianzas-covarianzas de var. observadas
#what = "mod", #Muestra camino adicional que podría mejorar ajuste del modelo
#what = "model", #Muestra una representación gral del modelo
#what = "all", #Muestra todos elementos posibles (rutas y estimaciones)
#what = "par", #Muestra todos los parámetros estimados del modelo
#what = "eq", #Muestra las ecuaciones estructurales del modelo
layout = "tree", #Dispone nodos en círculo (solo permitido si rotation= 1 o 3)
title = FALSE, #No muestra el título del gráfico
edge.color = "Red", #Establece el color de los bordes (aristas) en negro
sizeMan = 8, #Tamaño de los nodos que representan variables manifiestas
color = list(man = "lightgreen" #Color de las variables observadas
)
)
Test Baseline Model: gráfico de parte No. 3lavaan::summary.
Figure 16.1: Parte No. 3 del output de lavaan::summary (Test Baseline Model)
Test Baseline Model: hipótesis1. La hipótesis nula (\(H_0\)) para el Model Test Baseline Model
Viene dada por:
\[H0: \;\text{El modelo nulo se ajusta bien a los datos}\]
Esto implica que las covarianzas entre las variables observadas no son significativamente diferentes de cero, es decir, que todas las variables observadas son independientes entre sí.
2. La hipótesis alternativa (\(H_1\))
Viene dad por:
\[H_1: \;\text{El modelo nulo no se ajusta bien a los datos}\] Esto implica que hay relaciones significativas entre las variables observadas, es decir, que las covarianzas entre las variables observadas son diferentes de cero.
Test Baseline Model: interpretaciones1. Estadístico de Chi-Cuadrado (\(\chi^2\)).
Mide la discrepancia entre la matriz de covarianza observada y la matriz de covarianza estimada bajo el modelo nulo. En este caso, el valor del estadístico es de 918.852.
2. Grados de Libertad (df).
La distribución se ajsuta con 36 grados de libertad.
3. Valor P.
Indica si la discrepancia observada (estadístico \(\chi^2\)) es significativa. Dado que el valor \(p\) es menor que 0.05, se rechaza la hipótesis nula (\(H_0\)), indicando que el modelo nulo no se ajusta bien a los datos y que existen relaciones significativas entre las variables observadas.
summary: user vs baselineUser vs Baseline: output de summarylavaan::summary.
Figure 17.1: Parte No. 4 del output de lavaan::summary (User vs Baseline)
User vs Baseline: descripciónEl User Model se refiere al modelo que el usuario ha especificado y que lavaan está analizando.
El output User Model versus Baseline Model se refiere a la comparación entre el modelo especificado por el usuario (User Model) y el modelo de referencia, también conocido como modelo baseline o nulo (Baseline Model).
User vs Baseline: hipótesis1. Hipótesis Nula (\(H_0\)).
La hipótesis nula (\(H_0\)) es que el modelo especificado por el usuario no se ajusta significativamente mejor que el modelo de referencia.
Es decir, no hay diferencia significativa entre el ajuste del modelo del usuario y el modelo nulo.
Matemáticamente, esto se podría expresar como:
\[H_0: \text{El User Model se ajusta significativamente mejor que el Baseline Model}\]
2. Hipótesis Alternativa (\(H_1\)).
La hipótesis alternativa (\(H_1\)) es que el modelo especificado por el usuario se ajusta significativamente mejor que el modelo de referencia.
Es decir, hay una diferencia significativa entre el ajuste del modelo del usuario y el modelo nulo.
Matemáticamente, esto se podría expresar como:
\[H_1: \text{El User Model se ajusta significativamente mejor que el Baseline Model}\]
User vs Baseline: CFI y TLI (generalidades)Esta comparación permite evaluar qué tan bien se ajusta el modelo propuesto por el usuario en comparación con un modelo muy simple que asume independencia completa entre las variables observadas.
La comparación entre el User Model y el Baseline Model proporciona información valiosa sobre la adecuación del modelo propuesto por el usuario en relación con un modelo extremadamente simple.
Esto se realiza utilizando diversos criterios de ajuste, como el Chi-cuadrado (\(\chi^2\)), el Comparative Fit Index (CFI), el Tucker-Lewis Index (TLI), entre otros.
Si el modelo propuesto por el usuario se ajusta significativamente mejor que el modelo de referencia (por ejemplo, un Chi-cuadrado significativamente más bajo y/o valores más altos de CFI y TLI), indica que el modelo propuesto proporciona un mejor ajuste a los datos en comparación con el modelo de referencia.
Esto sugiere que la estructura propuesta en el modelo del usuario es válida y representa la relación entre las variables de manera más precisa que el modelo nulo.
Por otro lado, si el modelo propuesto por el usuario no se ajusta significativamente mejor que el modelo de referencia, podría indicar que el modelo propuesto no proporciona un mejor ajuste a los datos en comparación con el modelo nulo, lo que sugiere que la estructura propuesta puede no ser adecuada o que se necesitan ajustes adicionales para mejorar la adecuación del modelo.
User vs Baseline: CFI y TLI (interpretaciones)1. Generalidad.
El Comparative Fit Index (CFI) y el Tucker-Lewis Index (TLI) son dos índices de ajuste comúnmente utilizados en el análisis factorial confirmatorio (CFA) para evaluar qué tan bien se ajusta un modelo especificado por el usuario a los datos observados en comparación con un modelo de referencia, como el modelo nulo o baseline. BAsado en los resultados encontrados (parte No. 4 del output), estos valores se puden interpretar de la siguiente manera:
2. Comparative Fit Index (CFI).
El CFI es un índice que evalúa qué tan bien se ajusta el modelo especificado por el usuario en comparación con el modelo nulo.
Un CFI cercano a 1 indica un buen ajuste del modelo, donde un valor de 1 indica un ajuste perfecto.
En general, un valor de CFI mayor a 0.90 se considera aceptable, aunque valores más cercanos a 0.95 o mayores indican un mejor ajuste.
Interpretación: Un CFI de 0.931 sugiere que el modelo especificado por el usuario explica aproximadamente el 93.1% de la varianza y la covarianza observada en los datos, en comparación con el modelo nulo.
3. Tucker-Lewis Index (TLI).
El TLI, también conocido como Non-Normed Fit Index (NNFI), es otro índice de ajuste que evalúa qué tan bien se ajusta el modelo especificado por el usuario en comparación con el modelo nulo.
Al igual que con el CFI, un valor de TLI mayor a 0.90 se considera aceptable, aunque valores más cercanos a 0.95 o mayores indican un mejor ajuste.
Interpretación: Un TLI de 0.896 sugiere que el modelo especificado por el usuario explica aproximadamente el 89.6% de la varianza y la covarianza observada en los datos, en comparación con el modelo nulo.
summary: loglik and criteriosLoglik and Criteria: output gráficolavaan::summary.
Figure 18.1: Parte No. 5 del output de lavaan::summary (Loglikelihood and Information Criteria)
Loglik and Criteria: log-verosimilitudEstos resultados pertenecen a la comparación del modelo del usuario (modelo especificado) con el modelo de referencia (modelo nulo) en términos de la función de verosimilitud logarítmica. Aquí está su interpretación:
1. Loglikelihood del modelo del usuario (\(H_0\)).
El valor de la log-verosimilitud (loglikelihood) para el modelo del usuario, que es el modelo especificado por el usuario. En este caso, el loglikelihood del modelo del usuario es -3737.745.
2. Loglikelihood del modelo no restringido (\(H_1\)).
El valor de la log-verosimilitud para el modelo no restringido, que es un modelo donde no se imponen restricciones (es decir, un modelo donde todas las covarianzas son libres de ser estimadas). En este caso, el loglikelihood del modelo no restringido es -3695.092.
Loglik and Criteria: criterios de InformaciónEstos resultados pertenecen a la comparación del modelo del usuario (modelo especificado) con el modelo de referencia (modelo nulo) en términos de varios criterios de información. Aquí está su interpretación:
1. Criterio de Información de Akaike (AIC).
Un criterio de selección de modelo que penaliza el sobreajuste del modelo al tener en cuenta el número de parámetros estimados. Se prefiere un valor de AIC más bajo, lo que indica un mejor equilibrio entre el ajuste del modelo y la complejidad del modelo. En este caso, el valor del AIC es 7517.490.
2. Criterio de Información Bayesiana (BIC).
Similar al AIC pero con una penalización más fuerte por el número de parámetros. Se prefiere un valor de BIC más bajo, lo que indica un mejor equilibrio entre el ajuste del modelo y la complejidad del modelo. En este caso, el valor del BIC es 7595.339.
3. Criterio de Información Bayesiana Ajustado por el Tamaño de la Muestra (SABIC).
Una variante del BIC que también tiene en cuenta el tamaño de la muestra. Se prefiere un valor de SABIC más bajo, lo que indica un mejor equilibrio entre el ajuste del modelo, la complejidad del modelo y el tamaño de la muestra. En este caso, el valor del SABIC es 7528.739.
Loglik and Criteria: Interpretaciones generalesEn general, se prefiere un loglikelihood más alto, ya que indica un mejor ajuste del modelo a los datos.
Para los criterios de información (AIC, BIC, SABIC), se prefieren valores más bajos, lo que indica un mejor equilibrio entre el ajuste del modelo y la complejidad del modelo.
En este caso, el modelo no restringido (\(H_1\)) tiene un loglikelihood más alto y valores más bajos para los criterios de información en comparación con el modelo del usuario (\(H_0\)).
Esto sugiere que el modelo no restringido proporciona un mejor ajuste a los datos en comparación con el modelo del usuario.
Sin embargo, la elección del modelo final debe basarse en una evaluación completa que considere tanto el ajuste del modelo como la teoría subyacente y los objetivos de investigación.
summary: RMSEARoot Mean Square: output gráficolavaan::summary.
Figure 19.1: Parte No. 6 del output de lavaan::summary (Root Mean Square)
Root Mean Square: generalidadesPara interpretar el Root Mean Square Error of Approximation (RMSEA) y el Standardized Root Mean Square Residual (SRMR), se necesitan algunos detalles adicionales sobre el contexto del análisis factorial confirmatorio (CFA) y los criterios de ajuste utilizados. Estos valores se utilizan para evaluar el ajuste del modelo propuesto a los datos observados. Aquí está la interpretación:
Root Mean Square: RMSEA (interpretación)El RMSEA (Raíz del Error Cuadrático Medio de Aproximación) es una medida de ajuste del modelo que indica cuánto se espera que el modelo se desvíe de los datos poblacionales en términos de la medida de error cuadrático medio.
Generalmente, se considera que un valor de RMSEA menor o igual a 0.05 indica un buen ajuste, valores entre 0.05 y 0.08 indican un ajuste moderado y valores superiores a 0.1 indican un ajuste deficiente.
En nuestro output, \(RMSEA = 0.092\).
Este valor indica que el modelo propuesto tiene un ajuste moderado a los datos.
Root Mean Square: RMSEA (90% IC)El intervalo de Confianza del 90% (90 Percent confidence interval) Proporciona una estimación de la precisión del RMSEA.
Los límites inferior y superior del intervalo de confianza indican el rango plausible de valores de RMSEA.
En este caso, el IC 90% va desde 0.071 hasta 0.114.
Root Mean Square: RMSEA (P-value)1. P-value H0: RMSEA <= 0.050 = 0.001.
Este valor \(p\) es el resultado de una prueba de hipótesis sobre si el RMSEA es menor o igual a 0.05.
Un valor p bajo (por debajo del nivel de significancia común de 0.05) sugiere que el modelo no se ajusta bien a los datos, ya que el RMSEA es significativamente mayor que 0.05.
2. P-value H0: RMSEA >= 0.080 = 0.840.
Este valor p es el resultado de una prueba de hipótesis sobre si el RMSEA es mayor o igual a 0.08.
Un valor p alto (por encima del nivel de significancia común de 0.05) sugiere que el modelo se ajusta bien a los datos, ya que el RMSEA no es significativamente mayor que 0.08.
Root Mean Square: SRMR (interpretación)El SRMR (Residual Estandarizado del Error Cuadrático Medio de Aproximación) es una medida de ajuste del modelo que indica cuánto se espera que la matriz de covarianza de los residuos estandarizados se desvíe de la matriz de covarianza de residuos poblacionales.
Generalmente, se considera que un valor de SRMR menor o igual a 0.08 indica un buen ajuste, mientras que valores superiores a 0.1 indican un ajuste deficiente.
En nuestro output, \(SRMR = 0.065\).
Este valor indica que el modelo propuesto tiene un ajuste moderado a los datos.
Root Mean Square: RMSEA y SRMR (conclusiones)En resumen, estos valores de ajuste (RMSEA y SRMR) sugieren que el modelo propuesto tiene un ajuste moderado a los datos.
A pesar de lo anterior:
El RMSEA sugiere un ajuste algo deficiente debido a su valor cercano a 0.1.
Y el valor \(p\) asociado con \(RMSEA \leq 0.050\) también sugiere una mala adaptación.
summary: estimación de parámetrosEstimates: output gráficoSe proporcionan estimaciones de los parámetros del modelo, como las cargas factoriales, covarianzas entre variables latentes y varianzas de las variables observadas y latentes, entre otros.
Cada fila representa una relación entre variables observadas y latentes o entre variables latentes, mostrando el estimado de la relación, su error estándar, valor \(z\) y valor \(p\) asociado.
En la Figura 20.1 se resalta la parte No. 6 del output de lavaan::summary.
Figure 20.1: Parte No. 6 del output de lavaan::summary (Parameter Estimates)
Estimates: output gráfico (explicaciones)En el gráfico anterior, vemos cuatro partes (explicaremos cada una de ellas en secciones siguientes):
Parte 6a: Información general.
Parte 6b: Estimaciones de las cargas factoriales de las variables latentes (visual, textual, speed) en las variables observadas (x1, …,x9).
Parte 6c: Estimaciones de las covarianzas entre las variables latentes.
Parte 6d: Estimaciones de las varianzas de las variables observadas y latentes.
Estimate: 6a (información general)Estimate: parte 6a (output gráfico)lavaan::summary.
Figure 21.1: Parte No. 6a del output de lavaan::summary (General information)
Estimate: 6a (información general)Estimate: parte 6a (interpretaciones)La sección de Parameter Estimates en el resumen de resultados de lavaan contiene información importante sobre los errores estándar y la información utilizada para calcularlos. Aquí hay una interpretación detallada de las líneas específicas que se han mencionado:
1. Standard Errors (Errores Estándar).
Indica que los errores estándar han sido calculados.
Los errores estándar son medidas de la precisión de las estimaciones de los parámetros; valores más pequeños indican estimaciones más precisas.
2. Information (Información).
Esta línea describe el tipo de información que se utilizó para calcular los errores estándar.
Existen diferentes métodos para calcular la matriz de información.
La elección del método puede influir en los errores estándar y, por lo tanto, en las pruebas de significancia.
3. Information Saturated (H1) Model.
La matriz de información del modelo saturado (también conocido como el modelo “h1”) se utiliza para calcular los errores estándar.
Un modelo saturado es un modelo que tiene tantos parámetros como sea posible para ajustarse perfectamente a los datos.
En otras palabras, es un modelo que asume que todas las variables están correlacionadas libremente.
La matriz de información del modelo saturado puede proporcionar una estimación robusta de la variabilidad de los parámetros del modelo.
4. Structured Information.
La información estructurada se refiere a la matriz de información derivada del modelo específico que se está evaluando (el modelo del usuario).
Esta matriz se basa en las restricciones y especificaciones del modelo del usuario. Proporciona una visión de la variabilidad de los parámetros tal como se estructura en el modelo especificado.
Estimate: parte 6a (interpretación general)Standard errors: Especifica que se han calculado los errores estándar para las estimaciones de los parámetros del modelo.
Information: Describe que la matriz de información ha sido utilizada para calcular estos errores estándar.
Information saturated (h1) model: Indica que la matriz de información del modelo saturado se ha utilizado para calcular los errores estándar. Este enfoque puede ser más robusto porque no depende de las restricciones del modelo específico.
Structured Information: Se refiere a la matriz de información calculada directamente a partir del modelo del usuario, que incluye todas las especificaciones y restricciones impuestas por el usuario en el modelo.
Estimate: parte 6a (conclución general)En resumen, esta sección del resumen de resultados de lavaan nos informa que los errores estándar se han calculado utilizando tanto la matriz de información del modelo saturado (h1) como la matriz de información estructurada del modelo del usuario.
Este enfoque proporciona una visión robusta y estructurada de la variabilidad de los parámetros del modelo y de la precisión de las estimaciones de los parámetros.
Estimate: 6b (latent variables)Estimates: parte 6b (output gráfico)lavaan::summary.
Figure 23.1: Parte No. 6 del output de lavaan::summary (Latent variables)
Estimates: parte 6b (generalidades)Se presentan las estimaciones de las cargas factoriales de las variables latentes (visual, textual, speed) en las variables observadas (x1, …,x9).
Para cada relación entre una variable latente y sus variables observadas, se muestra la estimación de la carga, su error estándar, valor \(z\) y valor \(p\) asociado:
Estimate: Indica la estimación \(\widehat{\lambda}\) de la carga factorial (factor loading) \(\lambda\) para cada indicador en relación con su variable latente correspondiente.
Std.Err: Es el error estándar \(S_{\widehat{\lambda}}\) de la estimación.
z-value: El valor \(z\) indica cuántas desviaciones estándar está la estimación por encima o por debajo de cero. Valores absolutos más grandes indican una mayor significancia estadística.
P(>|z|): Es el valor \(p\) asociado con el valor \(z\). Un valor \(p\) bajo (por ejemplo, <0.05) sugiere que la estimación es significativamente diferente de cero.
Si \(\lambda\) es la carga factorial correspondiente, entonces, las hipótesis que se contrastan son:
\[H_0: \; \lambda = 0 \quad \text{versus} \quad H_1: \; \lambda \ne 0\]
Estimates: parte 6b (ejemplo)visual:El indicador x1 tiene una carga factorial fija en \(\widehat{\lambda}_1=1\) (por convención).
Mientras que x2 y x3, respectivamente, tienen cargas factoriales estimadas de
\[\widehat{\lambda}_2=0.554, \quad \widehat{\lambda}_3=0.729\]
\[S_{\widehat{\lambda}_2} = 0.100, \quad S_{\widehat{\lambda}_3} = 0.109\]
3. Los valores \(z\) correspondientes a x2 y x3 son:
\[z_2= \frac{\widehat{\lambda}_2 - 0}{S_{\widehat{\lambda}_2}} = \frac{0.554 - 0}{0.100} = 5.554, \qquad z_2= \frac{\widehat{\lambda}_3 - 0}{S_{\widehat{\lambda}_3}} = \frac{0.729 - 0}{0.109} = 6.685\]
visual:\[\text{valor}\; p_2 = P(Z_2 > 5.554) = 0, \qquad \text{valor}\; p_3 = P(Z_3 > 6.685) = 0\]
textual y speed, los indicadores están bien asociados con sus variables latentes correspondientes, ya que todas las cargas factoriales son significativas.Estimate: 6c (covariances)Estimates: parte 6c (output gráfico)lavaan::summary.
Figure 24.1: Parte No. 6c del output de lavaan::summary (Covariances)
Estimates: parte 6c (generalidades)Se proporcionan las estimaciones de las covarianzas entre las variables latentes (visual, textual, speed).
Para cada covarianza, se muestra la estimación, su error estándar, valor \(z\) y valor \(p\) asociado:
Estimate: Indica la estimación \(\widehat{C}_{ij} = \widehat{Cov}(F_i,F_j)\) de la covarianza \(C_{ij}\) entre las variables latentes \(F_i\) y \(F_j\).
Std.Err: Es el error estándar \(S_{\widehat{C}_{ij}}\) de la estimación.
z-value: El valor \(z\) indica cuántas desviaciones estándar está la estimación por encima o por debajo de cero. Valores absolutos más grandes indican una mayor significancia estadística.
P(>|z|): Es el valor \(p\) asociado con el valor \(z\). Un valor \(p\) bajo (por ejemplo, <0.05) sugiere que la estimación es significativamente diferente de cero.
Si \({C}_{ij}\) es la covarianza correspondiente entre \(F_i\) y \(F_j\), entonces, las hipótesis que se contrastan son:
\[H_0: \; {C}_{ij} = 0 \quad \text{versus} \quad H_1: \; {C}_{ij} \ne 0\]
Estimates: parte 6c (ejemplo)La covarianza entre visual y textual es de 0.408, lo que indica que estas dos variables latentes están moderadamente correlacionadas.
Esta covarianza es significativa (\(P < 0.05\)), lo que sugiere una relación significativa entre las habilidades visuales y textuales.
Los cálculos correspondientes son muy similares a los realizados en la parte 6b.
Estimate: 6d (variances)Estimates: parte 6d (output gráfico)lavaan::summary.
Figure 25.1: Parte No. 6d del output de lavaan::summary (Variances)
Estimates: parte 6c (generalidades)Se presentan las estimaciones de las varianzas de las variables observadas (x1, …, x9) y latentes (visual, textual, speed).
Para cada varianza, se muestra la estimación, su error estándar, valor \(z\) y valor \(p\) asociado:
Estimate: Indica la estimación \(\widehat{C}_{ii}\) de la varianza \(C_{ii}\) entre las variables de interés.
Std.Err: Es el error estándar \(S_{\widehat{C}_{ii}}\) de la estimación.
z-value: El valor \(z\) indica cuántas desviaciones estándar está la estimación por encima o por debajo de cero. Valores absolutos más grandes indican una mayor significancia estadística.
P(>|z|): Es el valor \(p\) asociado con el valor \(z\). Un valor \(p\) bajo (por ejemplo, <0.05) sugiere que la estimación es significativamente diferente de cero.
Si \({C}_{ii}\) es la varianza correspondiente de la variable de interés, entonces, las hipótesis que se contrastan son:
\[H_0: \; {C}_{ii} = 0 \quad \text{versus} \quad H_1: \; {C}_{ii} \ne 0\]
Estimates: parte 6c (ejemplo)La varianza de la variable latente visual es de 0.809.
Esto indica cuánta varianza en visual no está explicada por sus indicadores.
Esta varianza es significativa (\(P < 0.05\)), lo que sugiere que la variable latente visual contribuye significativamente a la variabilidad en los datos observados.
Los cálculos correspondientes son muy similares a los realizados en la parte 6b.
inspectinspect: descripciónEl código de abajo proporcionará una tabla que muestra los estimados de los parámetros del modelo CFA.
El output incluye las cargas factoriales (\(\Lambda\)), las varianzas residuales (\(\Theta\)) y las covarianzas entre los factores (\(\Psi\)).
En secciones siguientes se describirán cada una de estas matrices. En conjunto, las matrices \(\boldsymbol{\Lambda}\), \(\boldsymbol{\Theta}\) y \(\boldsymbol{\Psi}\) definen completamente la estructura del modelo CFA, permitiendo expresar la llamada matriz de covarianzas implicada como:
\[ \boldsymbol{\Sigma} = \boldsymbol{\Lambda}\boldsymbol{\Psi}\boldsymbol{\Lambda}^\top + \boldsymbol{\Theta}. \]
La matriz de covarianzas implicada en un modelo de análisis factorial confirmatorio (CFA) es la matriz de covarianzas predicha por el modelo ajustado.
inspect: ejecucióninspect(CFA, "est")
attach(inspect(CFA, "est"))
lambda #cargas factoriales
theta #varianzas residuales (de los errores de las var. observadas)
psi #covarianzas entre los factores
## $lambda
## visual textul speed
## x1 1.000 0.000 0.000
## x2 0.554 0.000 0.000
## x3 0.729 0.000 0.000
## x4 0.000 1.000 0.000
## x5 0.000 1.113 0.000
## x6 0.000 0.926 0.000
## x7 0.000 0.000 1.000
## x8 0.000 0.000 1.180
## x9 0.000 0.000 1.082
##
## $theta
## x1 x2 x3 x4 x5 x6 x7 x8 x9
## x1 0.549
## x2 0.000 1.134
## x3 0.000 0.000 0.844
## x4 0.000 0.000 0.000 0.371
## x5 0.000 0.000 0.000 0.000 0.446
## x6 0.000 0.000 0.000 0.000 0.000 0.356
## x7 0.000 0.000 0.000 0.000 0.000 0.000 0.799
## x8 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.488
## x9 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.566
##
## $psi
## visual textul speed
## visual 0.809
## textual 0.408 0.979
## speed 0.262 0.173 0.384
La matriz de cargas factoriales estimadas es:
\[ \boldsymbol{\Lambda} = \begin{pmatrix} 1.000 & 0 & 0 \\ 0.554 & 0 & 0 \\ 0.729 & 0 & 0 \\ 0 & 1.000 & 0 \\ 0 & 1.113 & 0 \\ 0 & 0.926 & 0 \\ 0 & 0 & 1.000 \\ 0 & 0 & 1.180 \\ 0 & 0 & 1.082 \end{pmatrix}, \]
donde las columnas corresponden a los factores \(\text{visual}\), \(\text{textual}\) y \(\text{speed}\), y las filas a los ítems \(x_1,\dots,x_9\).
lambda #cargas factoriales
## visual textul speed
## x1 1.000 0.000 0.000
## x2 0.554 0.000 0.000
## x3 0.729 0.000 0.000
## x4 0.000 1.000 0.000
## x5 0.000 1.113 0.000
## x6 0.000 0.926 0.000
## x7 0.000 0.000 1.000
## x8 0.000 0.000 1.180
## x9 0.000 0.000 1.082
La matriz de varianzas residuales de los errores de medición es:
\[ \boldsymbol{\Theta} = \begin{pmatrix} 0.549 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 1.134 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0.844 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0.371 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0.446 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0.356 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0.799 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0.488 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0.566 \end{pmatrix}. \]
Esta matriz es diagonal, lo que implica que no se permiten covarianzas entre errores de medición.
theta #varianzas residuales (de los errores de las var. observadas)
## x1 x2 x3 x4 x5 x6 x7 x8 x9
## x1 0.549
## x2 0.000 1.134
## x3 0.000 0.000 0.844
## x4 0.000 0.000 0.000 0.371
## x5 0.000 0.000 0.000 0.000 0.446
## x6 0.000 0.000 0.000 0.000 0.000 0.356
## x7 0.000 0.000 0.000 0.000 0.000 0.000 0.799
## x8 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.488
## x9 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.566
La matriz de varianzas y covarianzas entre los factores latentes es:
\[ \boldsymbol{\Psi} = \begin{pmatrix} 0.809 & 0.408 & 0.262 \\ 0.408 & 0.979 & 0.173 \\ 0.262 & 0.173 & 0.384 \end{pmatrix}, \]
donde la diagonal contiene las varianzas de los factores \(\text{visual}\), \(\text{textual}\) y \(\text{speed}\), y los elementos fuera de la diagonal representan sus covarianzas.
psi #varianzas residuales (de los errores de las var. observadas)
## visual textul speed
## visual 0.809
## textual 0.408 0.979
## speed 0.262 0.173 0.384
inspect: argumento whatPara ver cómo lavaan representa internamente un modelo, puede escribir:
El código.
inspect(fit, what="list")
El output.
## id lhs op rhs user block group free ustart exo label plabel start
## 1 1 visual =~ x1 1 1 1 0 1 0 .p1. 1.000
## 2 2 visual =~ x2 1 1 1 1 NA 0 .p2. 0.778
## 3 3 visual =~ x3 1 1 1 2 NA 0 .p3. 1.107
## 4 4 textual =~ x4 1 1 1 0 1 0 .p4. 1.000
## 5 5 textual =~ x5 1 1 1 3 NA 0 .p5. 1.133
## 6 6 textual =~ x6 1 1 1 4 NA 0 .p6. 0.924
## 7 7 speed =~ x7 1 1 1 0 1 0 .p7. 1.000
## 8 8 speed =~ x8 1 1 1 5 NA 0 .p8. 1.225
## 9 9 speed =~ x9 1 1 1 6 NA 0 .p9. 0.854
## 10 10 x1 ~~ x1 0 1 1 7 NA 0 .p10. 0.679
## 11 11 x2 ~~ x2 0 1 1 8 NA 0 .p11. 0.691
## 12 12 x3 ~~ x3 0 1 1 9 NA 0 .p12. 0.637
## 13 13 x4 ~~ x4 0 1 1 10 NA 0 .p13. 0.675
## 14 14 x5 ~~ x5 0 1 1 11 NA 0 .p14. 0.830
## 15 15 x6 ~~ x6 0 1 1 12 NA 0 .p15. 0.598
## 16 16 x7 ~~ x7 0 1 1 13 NA 0 .p16. 0.592
## 17 17 x8 ~~ x8 0 1 1 14 NA 0 .p17. 0.511
## 18 18 x9 ~~ x9 0 1 1 15 NA 0 .p18. 0.508
## 19 19 visual ~~ visual 0 1 1 16 NA 0 .p19. 0.050
## 20 20 textual ~~ textual 0 1 1 17 NA 0 .p20. 0.050
## 21 21 speed ~~ speed 0 1 1 18 NA 0 .p21. 0.050
## 22 22 visual ~~ textual 0 1 1 19 NA 0 .p22. 0.000
## 23 23 visual ~~ speed 0 1 1 20 NA 0 .p23. 0.000
## 24 24 textual ~~ speed 0 1 1 21 NA 0 .p24. 0.000
## est se
## 1 1.000 0.000
## 2 0.554 0.100
## 3 0.729 0.109
## 4 1.000 0.000
## 5 1.113 0.065
## 6 0.926 0.055
## 7 1.000 0.000
## 8 1.180 0.165
## 9 1.082 0.151
## 10 0.549 0.114
## 11 1.134 0.102
## 12 0.844 0.091
## 13 0.371 0.048
## 14 0.446 0.058
## 15 0.356 0.043
## 16 0.799 0.081
## 17 0.488 0.074
## 18 0.566 0.071
## 19 0.809 0.145
## 20 0.979 0.112
## 21 0.384 0.086
## 22 0.408 0.074
## 23 0.262 0.056
## 24 0.173 0.049
Esto es equivalente a la función parTable. La tabla que se devuelve aquí se denomina tabla de parámetros. Se explicará en secciones siguientes.
lavInspectlavInspect: explicaciónLa función lavInspect acepta varios argumentos para especificar qué aspecto del modelo se desea inspeccionar. Algunos de los argumentos comunes incluyen:
1. object.
El modelo ajustado del cual se desean inspeccionar las propiedades.
2. what.
especifica qué propiedad del modelo se desea inspeccionar. Esto puede ser est para los parámetros estimados, residuals para los residuos, “cov” para las covarianzas, entre otros.
3. label.
Opcionalmente, permite especificar un nombre para etiquetar el resultado.
lavInspect: ejecuciónPor ejemplo, para inspeccionar los parámetros estimados de un modelo ajustado CFA, puedes usar lavInspect(fit, "est").
Esto devolverá una tabla que muestra los parámetros estimados del modelo, incluyendo las cargas factoriales, las varianzas residuales y las covarianzas entre los factores.
El output es exactamente el mismo que se obtiene con inspect.
lavInspect: ejemploslavInspect: ejemplo 1Por defecto, al llamar a lavInspect sobre un objeto lavaan ajustado se obtiene una lista de las matrices del modelo que se utilizan internamente para representar el modelo. Los parámetros libres son enteros distintos de cero.
El código.
lavInspect(fit)
El output.
## $lambda
## visual textul speed
## x1 0 0 0
## x2 1 0 0
## x3 2 0 0
## x4 0 0 0
## x5 0 3 0
## x6 0 4 0
## x7 0 0 0
## x8 0 0 5
## x9 0 0 6
##
## $theta
## x1 x2 x3 x4 x5 x6 x7 x8 x9
## x1 7
## x2 0 8
## x3 0 0 9
## x4 0 0 0 10
## x5 0 0 0 0 11
## x6 0 0 0 0 0 12
## x7 0 0 0 0 0 0 13
## x8 0 0 0 0 0 0 0 14
## x9 0 0 0 0 0 0 0 0 15
##
## $psi
## visual textul speed
## visual 16
## textual 19 17
## speed 20 21 18
A partir del modelo CFA se estiman la matriz de cargas factoriales (\(\boldsymbol{\Lambda}\)), la matriz de varianzas residuales de los errores de medición (\(\boldsymbol{\Theta}\)) y la matriz de varianzas–covarianzas de los factores latentes (\(\boldsymbol{\Psi}\)), respectivamente:
\[ \boldsymbol{\Lambda} = \begin{pmatrix} 1.000 & 0 & 0 \\ 0.554 & 0 & 0 \\ 0.729 & 0 & 0 \\ 0 & 1.000 & 0 \\ 0 & 1.113 & 0 \\ 0 & 0.926 & 0 \\ 0 & 0 & 1.000 \\ 0 & 0 & 1.180 \\ 0 & 0 & 1.082 \end{pmatrix}, \qquad \boldsymbol{\Theta} = \begin{pmatrix} 0.549 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 1.134 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0.844 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0.371 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0.446 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0.356 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0.799 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0.488 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0.566 \end{pmatrix},\]
\[ \boldsymbol{\Psi} = \begin{pmatrix} 0.809 & 0.408 & 0.262 \\ 0.408 & 0.979 & 0.173 \\ 0.262 & 0.173 & 0.384 \end{pmatrix} \]
lavInspect: ejemplo 2Para ver cómo lavaan representa internamente un modelo, puede escribir:
lavInspect(CFA, what = "list")
## id lhs op rhs user block group free ustart exo label plabel start
## 1 1 visual =~ x1 1 1 1 0 1 0 .p1. 1.000
## 2 2 visual =~ x2 1 1 1 1 NA 0 .p2. 0.778
## 3 3 visual =~ x3 1 1 1 2 NA 0 .p3. 1.107
## 4 4 textual =~ x4 1 1 1 0 1 0 .p4. 1.000
## 5 5 textual =~ x5 1 1 1 3 NA 0 .p5. 1.133
## 6 6 textual =~ x6 1 1 1 4 NA 0 .p6. 0.924
## 7 7 speed =~ x7 1 1 1 0 1 0 .p7. 1.000
## 8 8 speed =~ x8 1 1 1 5 NA 0 .p8. 1.225
## 9 9 speed =~ x9 1 1 1 6 NA 0 .p9. 0.854
## 10 10 x1 ~~ x1 0 1 1 7 NA 0 .p10. 0.679
## 11 11 x2 ~~ x2 0 1 1 8 NA 0 .p11. 0.691
## 12 12 x3 ~~ x3 0 1 1 9 NA 0 .p12. 0.637
## 13 13 x4 ~~ x4 0 1 1 10 NA 0 .p13. 0.675
## 14 14 x5 ~~ x5 0 1 1 11 NA 0 .p14. 0.830
## 15 15 x6 ~~ x6 0 1 1 12 NA 0 .p15. 0.598
## 16 16 x7 ~~ x7 0 1 1 13 NA 0 .p16. 0.592
## 17 17 x8 ~~ x8 0 1 1 14 NA 0 .p17. 0.511
## 18 18 x9 ~~ x9 0 1 1 15 NA 0 .p18. 0.508
## 19 19 visual ~~ visual 0 1 1 16 NA 0 .p19. 0.050
## 20 20 textual ~~ textual 0 1 1 17 NA 0 .p20. 0.050
## 21 21 speed ~~ speed 0 1 1 18 NA 0 .p21. 0.050
## 22 22 visual ~~ textual 0 1 1 19 NA 0 .p22. 0.000
## 23 23 visual ~~ speed 0 1 1 20 NA 0 .p23. 0.000
## 24 24 textual ~~ speed 0 1 1 21 NA 0 .p24. 0.000
## est se
## 1 1.000 0.000
## 2 0.554 0.100
## 3 0.729 0.109
## 4 1.000 0.000
## 5 1.113 0.065
## 6 0.926 0.055
## 7 1.000 0.000
## 8 1.180 0.165
## 9 1.082 0.151
## 10 0.549 0.114
## 11 1.134 0.102
## 12 0.844 0.091
## 13 0.371 0.048
## 14 0.446 0.058
## 15 0.356 0.043
## 16 0.799 0.081
## 17 0.488 0.074
## 18 0.566 0.071
## 19 0.809 0.145
## 20 0.979 0.112
## 21 0.384 0.086
## 22 0.408 0.074
## 23 0.262 0.056
## 24 0.173 0.049
Esto es equivalente a la función parTable. La tabla que se devuelve aquí se denomina tabla de parámetros. Se explicará en secciones siguientes.
lavInspect: ejemplo 3Estimar las cargas factoriales, las varianzas residuales y las covarianzas entre los factores carga factorial, varianza residual y covarianza entre factores. Por defecto, lavInspect(fit) devuelve las matrices internas del modelo, no con valores estimados, sino con índices enteros que identifican los parámetros libres del modelo.
Regla fundamental.
0 implica un parámetro fijo (generalmente a 0 o a un valor de identificación).
Entero positivo implica un parámetro libre, numerado según el vector interno de parámetros de lavaan.
Es decir, lavaan está mostrando la estructura paramétrica del modelo, no sus estimaciones numéricas.
El código.
lavInspect(fit, "est")
El output.
## $lambda
## visual textul speed
## x1 1.000 0.000 0.000
## x2 0.554 0.000 0.000
## x3 0.729 0.000 0.000
## x4 0.000 1.000 0.000
## x5 0.000 1.113 0.000
## x6 0.000 0.926 0.000
## x7 0.000 0.000 1.000
## x8 0.000 0.000 1.180
## x9 0.000 0.000 1.082
##
## $theta
## x1 x2 x3 x4 x5 x6 x7 x8 x9
## x1 0.549
## x2 0.000 1.134
## x3 0.000 0.000 0.844
## x4 0.000 0.000 0.000 0.371
## x5 0.000 0.000 0.000 0.000 0.446
## x6 0.000 0.000 0.000 0.000 0.000 0.356
## x7 0.000 0.000 0.000 0.000 0.000 0.000 0.799
## x8 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.488
## x9 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.566
##
## $psi
## visual textul speed
## visual 0.809
## textual 0.408 0.979
## speed 0.262 0.173 0.384
lavInspect: ejemplo 4La matriz de covarianzas implicada por el modelo CFA corresponde a las covarianzas poblacionales que el modelo predice entre las variables observadas. En este caso, la matriz de covarianzas implicada estimada es:
\[ \boldsymbol{\Sigma} \; = \; \boldsymbol{\Lambda}\boldsymbol{\Psi}\boldsymbol{\Lambda}^\top + \boldsymbol{\Theta} \; = \; \begin{pmatrix} 1.358 & 0.448 & 0.590 & 0.408 & 0.454 & 0.378 & 0.262 & 0.309 & 0.284 \\ 0.448 & 1.382 & 0.327 & 0.226 & 0.252 & 0.209 & 0.145 & 0.171 & 0.157 \\ 0.590 & 0.327 & 1.275 & 0.298 & 0.331 & 0.276 & 0.191 & 0.226 & 0.207 \\ 0.408 & 0.226 & 0.298 & 1.351 & 1.090 & 0.907 & 0.173 & 0.205 & 0.188 \\ 0.454 & 0.252 & 0.331 & 1.090 & 1.660 & 1.010 & 0.193 & 0.228 & 0.209 \\ 0.378 & 0.209 & 0.276 & 0.907 & 1.010 & 1.196 & 0.161 & 0.190 & 0.174 \\ 0.262 & 0.145 & 0.191 & 0.173 & 0.193 & 0.161 & 1.183 & 0.453 & 0.415 \\ 0.309 & 0.171 & 0.226 & 0.205 & 0.228 & 0.190 & 0.453 & 1.022 & 0.490 \\ 0.284 & 0.157 & 0.207 & 0.188 & 0.209 & 0.174 & 0.415 & 0.490 & 1.015 \end{pmatrix}. \]
El código.
lavInspect(CFA, "sigma")
El output.
## x1 x2 x3 x4 x5 x6 x7 x8 x9
## x1 1.358
## x2 0.448 1.382
## x3 0.590 0.327 1.275
## x4 0.408 0.226 0.298 1.351
## x5 0.454 0.252 0.331 1.090 1.660
## x6 0.378 0.209 0.276 0.907 1.010 1.196
## x7 0.262 0.145 0.191 0.173 0.193 0.161 1.183
## x8 0.309 0.171 0.226 0.205 0.228 0.190 0.453 1.022
## x9 0.284 0.157 0.207 0.188 0.209 0.174 0.415 0.490 1.015
Observación.
En un modelo bien ajustado, la matriz de covarianzas implicada \(\boldsymbol{\Sigma}\) debe aproximar adecuadamente a la matriz de covarianzas observadas \(\mathbf{S}_{\text{cov}}\).
parTableparTable: explicación de la funciónLa función se utiliza para generar una tabla que resume los parámetros estimados de un modelo ajustado.
Esta tabla proporciona una visión general de los parámetros del modelo, incluyendo las cargas factoriales, las varianzas residuales, las covarianzas entre los factores y otras estadísticas relevantes.
El código.
param <- parTable(CFA)
param
El output.
## id lhs op rhs user block group free ustart exo label plabel start
## 1 1 visual =~ x1 1 1 1 0 1 0 .p1. 1.000
## 2 2 visual =~ x2 1 1 1 1 NA 0 .p2. 0.778
## 3 3 visual =~ x3 1 1 1 2 NA 0 .p3. 1.107
## 4 4 textual =~ x4 1 1 1 0 1 0 .p4. 1.000
## 5 5 textual =~ x5 1 1 1 3 NA 0 .p5. 1.133
## 6 6 textual =~ x6 1 1 1 4 NA 0 .p6. 0.924
## 7 7 speed =~ x7 1 1 1 0 1 0 .p7. 1.000
## 8 8 speed =~ x8 1 1 1 5 NA 0 .p8. 1.225
## 9 9 speed =~ x9 1 1 1 6 NA 0 .p9. 0.854
## 10 10 x1 ~~ x1 0 1 1 7 NA 0 .p10. 0.679
## 11 11 x2 ~~ x2 0 1 1 8 NA 0 .p11. 0.691
## 12 12 x3 ~~ x3 0 1 1 9 NA 0 .p12. 0.637
## 13 13 x4 ~~ x4 0 1 1 10 NA 0 .p13. 0.675
## 14 14 x5 ~~ x5 0 1 1 11 NA 0 .p14. 0.830
## 15 15 x6 ~~ x6 0 1 1 12 NA 0 .p15. 0.598
## 16 16 x7 ~~ x7 0 1 1 13 NA 0 .p16. 0.592
## 17 17 x8 ~~ x8 0 1 1 14 NA 0 .p17. 0.511
## 18 18 x9 ~~ x9 0 1 1 15 NA 0 .p18. 0.508
## 19 19 visual ~~ visual 0 1 1 16 NA 0 .p19. 0.050
## 20 20 textual ~~ textual 0 1 1 17 NA 0 .p20. 0.050
## 21 21 speed ~~ speed 0 1 1 18 NA 0 .p21. 0.050
## 22 22 visual ~~ textual 0 1 1 19 NA 0 .p22. 0.000
## 23 23 visual ~~ speed 0 1 1 20 NA 0 .p23. 0.000
## 24 24 textual ~~ speed 0 1 1 21 NA 0 .p24. 0.000
## est se
## 1 1.000 0.000
## 2 0.554 0.100
## 3 0.729 0.109
## 4 1.000 0.000
## 5 1.113 0.065
## 6 0.926 0.055
## 7 1.000 0.000
## 8 1.180 0.165
## 9 1.082 0.151
## 10 0.549 0.114
## 11 1.134 0.102
## 12 0.844 0.091
## 13 0.371 0.048
## 14 0.446 0.058
## 15 0.356 0.043
## 16 0.799 0.081
## 17 0.488 0.074
## 18 0.566 0.071
## 19 0.809 0.145
## 20 0.979 0.112
## 21 0.384 0.086
## 22 0.408 0.074
## 23 0.262 0.056
## 24 0.173 0.049
parTable: descripción de cada columna de la tabla del outputA continuación se describen las columnas de parTable():
names(param)
## [1] "id" "lhs" "op" "rhs" "user" "block" "group" "free"
## [9] "ustart" "exo" "label" "plabel" "start" "est" "se"
id: identificador único de cada parámetro dentro del modelo.
lhs (left-hand side): variable del lado izquierdo del parámetro (por ejemplo, un factor latente como visual o una variable observada como x1).
op: operador que indica el tipo de relación:
=~ : carga factorial,
~~ : varianza o covarianza,
~1 : intercepto (o media latente si lhs es un factor).
rhs (right-hand side): variable del lado derecho del parámetro.
user: indica si el parámetro fue especificado explícitamente por el usuario en la sintaxis del modelo (user = 1) o si fue añadido automáticamente por lavaan para completar el modelo (user = 0).
block: identifica el bloque del modelo al que pertenece el parámetro. En SEM multigrupo, cada bloque corresponde a una combinación específica de grupo y tipo de ecuación utilizada internamente por lavaan. En realidad, esta columna no tiene interpretación sustantiva, sino que indica cómo lavaan organiza internamente el modelo para la estimación.Por ejemplo, en la tabla parTable() se observan filas como:
Parámetros del tipo visual =~ x1, visual =~ x2, visual =~ x3 con group = 1 y block = 1, los cuales pertenecen al bloque de medición
del factor visual en el primer grupo.
Parámetros del tipo x1 ~~ x1, x2 ~~ x2 aparecen en bloques distintos, ya que corresponden a varianzas residuales de variables diferentes.
En el segundo grupo (group = 2), los mismos tipos de parámetros aparecen asociados a bloques diferentes, reflejando que cada grupo tiene su propia representación interna del modelo.
group: grupo al que pertenece el parámetro (1 = primer grupo).
free: indicador del estado del parámetro:
free=0 = parámetro fijo. Significa que el valor del parámetro no se estima con los datos o que el valor ya está impuesto por el modelo. Por ejemplo, en la tabla vemos:visual =~ x1 free = 0 start = 1.000
Esto quiere decir que la carga de x1 sobre visual está fijada en 1.000. No se estima (por eso, free = 0).
free>0 = parámetro libre a estimar. Por ejemplo, si se ve free = 12, no significa que el parámetro vale 12, sino que es el parámetro libre número 12 que el algoritmo estima.ustart (user start): valor inicial definido por el usuario para el parámetro de la fila correspondeinte, en caso de haberlo especificado. Si no se define, suele aparecer como NA. Por ejemplo, consideremos esta fila: visual =~ x2 ustart = NA. En este caso, el parámetro es la carga factorial de x2 sobre visual. No se indicó ningún valor inicial en la sintaxis. Por eso, lavaan asignó automáticamente un valor inicial (aparece en start). Por eso ustart = NA. Entonces, se vería visual =~ x1 ustart = 0.5si el modelo fuese:HS.model <- 'visual =~ 0.5*x1 + x2 + x3'
exo: indica si la variable asociada al parámetro es tratada como exógena (exo = 1) o endógena (exo = 0). En modelos CFA estándar, la mayoría de variables observadas se tratan como endógenas.
label: etiqueta interna del parámetro, utilizada para imponer restricciones de igualdad entre grupos. La columna labelse usa cuando se quiere que varios parámetros compartan el mismo valor y si dos filas tienen el mismo label, lavaan las trata como un solo parámetro común. Por ejemplo, supongamos que se quiere que la carga de x2 sea igual a a:
visual =~ a*x2
En parTable() se vería algo así:
lhs op rhs group label
visual =~ x2 1 a
plabel (parameter label): etiqueta interna única utilizada por lavaan para identificar el parámetro durante la estimación. A diferencia de label, esta etiqueta es siempre única, incluso cuando se imponen restricciones de igualdad. Cada fila tiene su propio plabel (incluso cuando dos parámetros son forzados a ser iguales (label igual),
cada uno conserva su propio plabel). Considere este ejemplo:lhs op rhs group label plabel
visual =~ x2 1 a .p2.
Aquí label = a indica valor del parámetro y plabel = .p2., parámetro en la estructura interna.
start: valor inicial utilizado por el algoritmo de estimación.
est y se: estimación final del parámetro y su error estándar.
parTable: interpretación general de la tabla del outputEn el modelo se observa que:
Las cargas factoriales fijadas en 1.00 (por ejemplo, visual =~ x1, textual =~ x4, speed =~ x7) cumplen la función de identificación de la escala de los factores latentes.
Las filas con operador ~~ corresponden a varianzas (cuando lhs \(=\) rhs) y covarianzas (cuando lhs \(\ne\) rhs).
Las filas con operador ~1 y lhs igual a una variable observada representan interceptos; cuando lhs es un factor latente, representan medias latentes.
parTable: nota pedagógicaLa función parTable() no está pensada para la interpretación sustantiva directa, sino para entender cómo lavaan codifica internamente el modelo. Sin embargo, resulta extremadamente útil para:
Comprender la lógica de las restricciones de igualdad.
Verificar qué parámetros están fijos o libres.
Conectar la sintaxis del modelo con los resultados numéricos.
Por esta razón, parTable() es una herramienta clave para el estudio rigurosode la invarianza factorial y el SEM multigrupo.
inspect)El código.
inspect(CFA, "est")
attach(inspect(CFA, "est"))
lambda #cargas factoriales
#theta #varianzas residuales
#psi #covarianzas entre los factores
El otuput.
## $lambda
## visual textul speed
## x1 1.000 0.000 0.000
## x2 0.554 0.000 0.000
## x3 0.729 0.000 0.000
## x4 0.000 1.000 0.000
## x5 0.000 1.113 0.000
## x6 0.000 0.926 0.000
## x7 0.000 0.000 1.000
## x8 0.000 0.000 1.180
## x9 0.000 0.000 1.082
##
## $theta
## x1 x2 x3 x4 x5 x6 x7 x8 x9
## x1 0.549
## x2 0.000 1.134
## x3 0.000 0.000 0.844
## x4 0.000 0.000 0.000 0.371
## x5 0.000 0.000 0.000 0.000 0.446
## x6 0.000 0.000 0.000 0.000 0.000 0.356
## x7 0.000 0.000 0.000 0.000 0.000 0.000 0.799
## x8 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.488
## x9 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.566
##
## $psi
## visual textul speed
## visual 0.809
## textual 0.408 0.979
## speed 0.262 0.173 0.384
## visual textul speed
## x1 1.000 0.000 0.000
## x2 0.554 0.000 0.000
## x3 0.729 0.000 0.000
## x4 0.000 1.000 0.000
## x5 0.000 1.113 0.000
## x6 0.000 0.926 0.000
## x7 0.000 0.000 1.000
## x8 0.000 0.000 1.180
## x9 0.000 0.000 1.082
El resultado corresponde a :
\[\boldsymbol{\Lambda} = \begin{pmatrix} 1.000 & 0 & 0 \\ 0.554 & 0 & 0 \\ 0.729 & 0 & 0 \\ 0 & 1.000 & 0 \\ 0 & 1.113 & 0 \\ 0 & 0.926 & 0 \\ 0 & 0 & 1.000 \\ 0 & 0 & 1.180 \\ 0 & 0 & 1.082 \end{pmatrix}\]
En el output de abajo, el argumento standardized=TRUE indica que se deben devolver las estimaciones estandarizadas.
La estimación estandarizada se ajusta por el error estándar de la variable implicada, permitiendo así la comparación entre diferentes parámetros en una escala común.
El código.
parameterEstimates(CFA, standardized=TRUE) %>%
filter(op == "=~") %>%
select('Factor'=lhs,
'Indicador'=rhs,
'Estimación'=est,
'Error std.'=se,
'Estimación std.'=std.all, #Estimaciones estandarizadas
'Z'=z,
'p valor'= pvalue
) %>%
kable(digits = 3, align="c", format="pandoc", caption="Factor Loadings")
El output.
| Factor | Indicador | Estimación | Error std. | Estimación std. | Z | p valor |
|---|---|---|---|---|---|---|
| visual | x1 | 1.000 | 0.000 | 0.772 | NA | NA |
| visual | x2 | 0.554 | 0.100 | 0.424 | 5.554 | 0 |
| visual | x3 | 0.729 | 0.109 | 0.581 | 6.685 | 0 |
| textual | x4 | 1.000 | 0.000 | 0.852 | NA | NA |
| textual | x5 | 1.113 | 0.065 | 0.855 | 17.014 | 0 |
| textual | x6 | 0.926 | 0.055 | 0.838 | 16.703 | 0 |
| speed | x7 | 1.000 | 0.000 | 0.570 | NA | NA |
| speed | x8 | 1.180 | 0.165 | 0.723 | 7.152 | 0 |
| speed | x9 | 1.082 | 0.151 | 0.665 | 7.155 | 0 |
En la salida de abajo, los asteriscos indican la significancia de la estimación basada en los valores \(p\) (*** para \(p < .001\), ** para \(p < .01\), * para \(p < .05\)).
El código.
parameterEstimates(CFA, standardized=TRUE) %>%
filter(op == "=~") %>%
mutate(stars = ifelse(pvalue < .001, "***",
ifelse(pvalue < .01, "**",
ifelse(pvalue < .05, "*", "")))) %>%
select('Factor'=lhs,
'Indicador'=rhs,
'Estimación'=est,
'Error std.'=se,
'Z'=z,
'Estimación std.'=std.all, #Estimaciones estandarizadas
'p valor'= pvalue,
'Sig.'=stars) %>%
kable(digits = 3, align="c", format="pandoc", caption="Cargas factoriales")
El output.
| Factor | Indicador | Estimación | Error std. | Z | Estimación std. | p valor | Sig. |
|---|---|---|---|---|---|---|---|
| visual | x1 | 1.000 | 0.000 | NA | 0.772 | NA | NA |
| visual | x2 | 0.554 | 0.100 | 5.554 | 0.424 | 0 | *** |
| visual | x3 | 0.729 | 0.109 | 6.685 | 0.581 | 0 | *** |
| textual | x4 | 1.000 | 0.000 | NA | 0.852 | NA | NA |
| textual | x5 | 1.113 | 0.065 | 17.014 | 0.855 | 0 | *** |
| textual | x6 | 0.926 | 0.055 | 16.703 | 0.838 | 0 | *** |
| speed | x7 | 1.000 | 0.000 | NA | 0.570 | NA | NA |
| speed | x8 | 1.180 | 0.165 | 7.152 | 0.723 | 0 | *** |
| speed | x9 | 1.082 | 0.151 | 7.155 | 0.665 | 0 | *** |
inspectEstos valores representan las desviaciones de los ítems observados de sus valores esperados basados en las cargas factoriales y la media latente del factor.
El código.
inspect(CFA, "est")
attach(inspect(CFA, "est"))
#lambda #cargas factoriales
theta #varianzas residuales (de los errores de las var. observadas)
#psi #covarianzas entre los factores
El otuput.
## x1 x2 x3 x4 x5 x6 x7 x8 x9
## x1 0.549
## x2 0.000 1.134
## x3 0.000 0.000 0.844
## x4 0.000 0.000 0.000 0.371
## x5 0.000 0.000 0.000 0.000 0.446
## x6 0.000 0.000 0.000 0.000 0.000 0.356
## x7 0.000 0.000 0.000 0.000 0.000 0.000 0.799
## x8 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.488
## x9 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.566
El resultado corresponde a:
\[\boldsymbol{\Theta} = \begin{pmatrix} 0.549 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 1.134 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0.844 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0.371 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0.446 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0.356 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0.799 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0.488 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0.566 \end{pmatrix}\]
La matriz de covarianzas observadas \(\mathbf{S}_{\text{cov}}\) es una matriz que muestra las covarianzas entre las variables observadas en nuestros datos.
Esta matriz es una representación directa de la relación entre las variables tal como se presenta en tus datos reales, sin ninguna suposición adicional o modelado.
En un modelo bien ajustado, la matriz de covarianzas implicada \(\boldsymbol{\Sigma}\) debe aproximar adecuadamente a la matriz de covarianzas observadas \(\mathbf{S}_{\text{cov}}\).
covSea \(\mathbf{X} = (X_1, \ldots, X_9)^\top\) el vector de variables observadas (ítems), y sea \(N\) el tamaño muestral. La matriz de covarianzas observadas se define como:
\[ \mathbf{S}_{\text{cov}} = \operatorname{Cov}(\mathbf{X}), \]
y, para los datos analizados, toma la forma:
\[ \mathbf{S}_{\text{cov}} = \operatorname{Cov}(\mathbf{X}) = \begin{pmatrix} 1.363 & 0.409 & 0.582 & 0.507 & 0.442 & 0.456 & 0.085 & 0.265 & 0.460 \\ 0.409 & 1.386 & 0.453 & 0.210 & 0.212 & 0.248 & -0.097 & 0.110 & 0.245 \\ 0.582 & 0.453 & 1.279 & 0.209 & 0.113 & 0.245 & 0.089 & 0.213 & 0.375 \\ 0.507 & 0.210 & 0.209 & 1.355 & 1.101 & 0.899 & 0.220 & 0.126 & 0.244 \\ 0.442 & 0.212 & 0.113 & 1.101 & 1.665 & 1.018 & 0.143 & 0.181 & 0.296 \\ 0.456 & 0.248 & 0.245 & 0.899 & 1.018 & 1.200 & 0.145 & 0.166 & 0.237 \\ 0.085 & -0.097 & 0.089 & 0.220 & 0.143 & 0.145 & 1.187 & 0.537 & 0.375 \\ 0.265 & 0.110 & 0.213 & 0.126 & 0.181 & 0.166 & 0.537 & 1.025 & 0.459 \\ 0.460 & 0.245 & 0.375 & 0.244 & 0.296 & 0.237 & 0.375 & 0.459 & 1.018 \end{pmatrix}. \]
El código.
# Calcular la matriz de covarianzas observadas
S_cov <- round(cov(dat),3)
# Mostrar la matriz de covarianzas observadas
print(S_cov)
El output.
## x1 x2 x3 x4 x5 x6 x7
## x1 1.36289774 0.40872923 0.58183232 0.5065178 0.4420843 0.4563242 0.08504799
## x2 0.40872923 1.38638981 0.45256748 0.2096198 0.2117947 0.2483697 -0.09707352
## x3 0.58183232 0.45256748 1.27911441 0.2088635 0.1126706 0.2449227 0.08863631
## x4 0.50651778 0.20961978 0.20886351 1.3551667 1.1014120 0.8985008 0.22047507
## x5 0.44208426 0.21179471 0.11267061 1.1014120 1.6653184 1.0179058 0.14347621
## x6 0.45632416 0.24836972 0.24492268 0.8985008 1.0179058 1.2003462 0.14455865
## x7 0.08504799 -0.09707352 0.08863631 0.2204751 0.1434762 0.1445587 1.18708326
## x8 0.26471714 0.11002492 0.21303038 0.1260120 0.1812072 0.1659824 0.53702937
## x9 0.45986634 0.24482282 0.37509875 0.2441739 0.2962255 0.2367836 0.37454154
## x8 x9
## x1 0.2647171 0.4598663
## x2 0.1100249 0.2448228
## x3 0.2130304 0.3750987
## x4 0.1260120 0.2441739
## x5 0.1812072 0.2962255
## x6 0.1659824 0.2367836
## x7 0.5370294 0.3745415
## x8 1.0253894 0.4588409
## x9 0.4588409 1.0183872
Observación clave.
La función cov() calcula la covarianza usando el divisor \(N-1\):
\[ \mathbf{S}_{\text{cov}} = \frac{1}{N-1} \sum_{i=1}^{N} (\mathbf{x}_i - \bar{\mathbf{x}}) (\mathbf{x}_i - \bar{\mathbf{x}})^{\top}. \]
Esta forma produce un estimador insesgado de la covarianza poblacional bajo supuestos clásicos, y es la matriz que se utiliza habitualmente en estadística descriptiva y análisis exploratorio.
lavTechCuando se ajusta un modelo CFA mediante máxima verosimilitud (ML), lavaan no trabaja con \(\mathbf{S}_{\text{cov}}\), sino con una versión ligeramente distinta de la matriz de covarianzas muestrales, denotada aquí por \(\mathbf{S}_{\text{lav}}\). Esta matriz puede extraerse directamente desde el objeto ajustado:
El código.
S_lav <- lavTech(CFA, "sampstat")[[1]]$cov
S_lav
El output.
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1.35836985 0.40737133 0.57989932 0.5048350 0.4406155 0.4548081
## [2,] 0.40737133 1.38178387 0.45106394 0.2089234 0.2110911 0.2475446
## [3,] 0.57989932 0.45106394 1.27486486 0.2081696 0.1122963 0.2441090
## [4,] 0.50483500 0.20892337 0.20816961 1.3506645 1.0977528 0.8955157
## [5,] 0.44061554 0.21109108 0.11229629 1.0977528 1.6597858 1.0145240
## [6,] 0.45480813 0.24754457 0.24410898 0.8955157 1.0145240 1.1963584
## [7,] 0.08476543 -0.09675102 0.08834184 0.2197426 0.1429995 0.1440784
## [8,] 0.26383768 0.10965939 0.21232264 0.1255933 0.1806052 0.1654310
## [9,] 0.45833855 0.24400945 0.37385257 0.2433627 0.2952413 0.2359969
## [,7] [,8] [,9]
## [1,] 0.08476543 0.2638377 0.4583385
## [2,] -0.09675102 0.1096594 0.2440095
## [3,] 0.08834184 0.2123226 0.3738526
## [4,] 0.21974259 0.1255933 0.2433627
## [5,] 0.14299955 0.1806052 0.2952413
## [6,] 0.14407839 0.1654310 0.2359969
## [7,] 1.18313946 0.5352452 0.3732972
## [8,] 0.53524522 1.0219828 0.4573166
## [9,] 0.37329722 0.4573166 1.0150039
y resulta ser:
\[ \mathbf{S}_{\text{lav}}= \begin{pmatrix} 1.3584 & 0.4074 & 0.5799 & 0.5048 & 0.4406 & 0.4548 & 0.0848 & 0.2638 & 0.4583 \\ 0.4074 & 1.3818 & 0.4511 & 0.2089 & 0.2111 & 0.2475 & -0.0968 & 0.1097 & 0.2440 \\ 0.5799 & 0.4511 & 1.2749 & 0.2082 & 0.1123 & 0.2441 & 0.0883 & 0.2123 & 0.3739 \\ 0.5048 & 0.2089 & 0.2082 & 1.3507 & 1.0978 & 0.8955 & 0.2197 & 0.1256 & 0.2434 \\ 0.4406 & 0.2111 & 0.1123 & 1.0978 & 1.6598 & 1.0145 & 0.1430 & 0.1806 & 0.2952 \\ 0.4548 & 0.2475 & 0.2441 & 0.8955 & 1.0145 & 1.1964 & 0.1441 & 0.1654 & 0.2360 \\ 0.0848 & -0.0968 & 0.0883 & 0.2197 & 0.1430 & 0.1441 & 1.1831 & 0.5352 & 0.3733 \\ 0.2638 & 0.1097 & 0.2123 & 0.1256 & 0.1806 & 0.1654 & 0.5352 & 1.0220 & 0.4573 \\ 0.4583 & 0.2440 & 0.3739 & 0.2434 & 0.2952 & 0.2360 & 0.3733 & 0.4573 & 1.0150 \end{pmatrix} \]
Observación clave.
La matriz \(\mathbf{S}_{\text{lav}}\) se calcula usando el divisor \(N\), ya que está formulada para el estimador de máxima verosimilitud (ML). En particular, lavaan (con estimador ML) trabaja internamente con:
\[ \mathbf{S}_{\text{lav}} = \frac{1}{N} \sum_{i=1}^{N} (\mathbf{x}_i - \bar{\mathbf{x}}) (\mathbf{x}_i - \bar{\mathbf{x}})^{\top}, \]
Esta forma aparece de manera natural en la función de verosimilitud de la distribución normal multivariada, y por ello constituye la base teórica del estimador de máxima verosimilitud (ML). Aunque \(\mathbf{S}_{\text{lav}}\) no es un estimador insesgado, es internamente coherente con el procedimiento de estimación ML.
Aunque ambas matrices se construyen a partir de los mismos datos, no son idénticas, ya que difieren únicamente en el divisor utilizado:
\[ \mathbf{S}_{\text{cov}} = \frac{N}{N-1} \,\mathbf{S}_{\text{lav}}. \]
Por tanto, la diferencia entre ellas es puramente un factor de escala. Cuando el tamaño muestral \(N\) es grande, esta diferencia es pequeña, pero no es exactamente cero.
Debido a esta diferencia, no debe esperarse que coincidan exactamente las siguientes cantidades:
\[ \mathbf{S}_{\text{cov}} - \boldsymbol{\Sigma} \quad \text{y} \quad \mathbf{S}_{\text{lav}} - \boldsymbol{\Sigma}, \]
donde \(\boldsymbol{\Sigma}\) es la matriz de covarianzas implícita estimada bajo el modelo CFA. Esto explica por qué:
Restas manuales de matrices,
residuals(CFA)$cov,
residuals(CFA, type = "cor")$cov,
no van a producir matrices numéricamente idénticas, aun cuando todas representan discrepancias entre lo observado y lo implicado por el modelo. Esto se explicará con más detalles en las siguientes secciones.
\(\mathbf{S}_{\text{cov}}\): matriz descriptiva clásica (fuera del marco ML).
\(\mathbf{S}_{\text{lav}}\): matriz coherente con la teoría de máxima verosimilitud.
lavaan es internamente consistente: siempre compara cantidades construidas bajo el mismo criterio ML.
Por ello, las diferencias numéricas observadas son esperadas, correctas y teóricamente justificadas.
Definición matemática.
Recordemos que
\[\Sigma \;=\; \Lambda \;\Psi\; \Lambda^{\top} \;+\; \Theta\]
Donde:
\(\Sigma\) representa la matriz de covarianzas estimada de las variables observadas (la llamada matriz de covarianzas implicada).
\(\Lambda\) es la matriz de cargas factoriales.
\(\Psi\) es la matriz de varianzas-covarianzas de los factores latentes.
\(\Theta\) es la matriz de varianzas residuales.
Observaciones importantes.
La matriz de covarianzas implicada en un modelo de análisis factorial confirmatorio (CFA) es la matriz de covarianzas predicha por el modelo ajustado.
Esta matriz muestra las covarianzas entre las variables observadas que el modelo supone que existirían, basado en las relaciones especificadas entre las variables latentes y observadas.
Interpretación de la Matriz de Covarianzas Implicada.
La matriz de covarianzas implicada refleja cómo el modelo ajustado espera que las variables observadas se relacionen entre sí.
Es una representación matemática de las suposiciones del modelo.
Sigma <- lambda %*% psi %*% t(lambda) + theta
round(Sigma, 3)
## x1 x2 x3 x4 x5 x6 x7 x8 x9
## x1 1.358
## x2 0.448 1.382
## x3 0.590 0.327 1.275
## x4 0.408 0.226 0.298 1.351
## x5 0.454 0.252 0.331 1.090 1.660
## x6 0.378 0.209 0.276 0.907 1.010 1.196
## x7 0.262 0.145 0.191 0.173 0.193 0.161 1.183
## x8 0.309 0.171 0.226 0.205 0.228 0.190 0.453 1.022
## x9 0.284 0.157 0.207 0.188 0.209 0.174 0.415 0.490 1.015
Es decir,
\[\boldsymbol{\Sigma} \; = \; \begin{pmatrix} 1.358 & 0.448 & 0.590 & 0.408 & 0.454 & 0.378 & 0.262 & 0.309 & 0.284 \\ 0.448 & 1.382 & 0.327 & 0.226 & 0.252 & 0.209 & 0.145 & 0.171 & 0.157 \\ 0.590 & 0.327 & 1.275 & 0.298 & 0.331 & 0.276 & 0.191 & 0.226 & 0.207 \\ 0.408 & 0.226 & 0.298 & 1.351 & 1.090 & 0.907 & 0.173 & 0.205 & 0.188 \\ 0.454 & 0.252 & 0.331 & 1.090 & 1.660 & 1.010 & 0.193 & 0.228 & 0.209 \\ 0.378 & 0.209 & 0.276 & 0.907 & 1.010 & 1.196 & 0.161 & 0.190 & 0.174 \\ 0.262 & 0.145 & 0.191 & 0.173 & 0.193 & 0.161 & 1.183 & 0.453 & 0.415 \\ 0.309 & 0.171 & 0.226 & 0.205 & 0.228 & 0.190 & 0.453 & 1.022 & 0.490 \\ 0.284 & 0.157 & 0.207 & 0.188 & 0.209 & 0.174 & 0.415 & 0.490 & 1.015 \end{pmatrix}\]
fitted (segunda forma)El código.
# Obtener la matriz de covarianzas implicadas
fitted_values <- fitted(CFA)
fitted_values
# Extraer la matriz de covarianzas implicadas
Sigma <- fitted_values$cov
# Mostrar la matriz de covarianzas implicadas
print(Sigma)
Explicación del código.
Se usa la función fitted(CFA) para obtener las matrices implicadas del modelo ajustado:
## $cov
## x1 x2 x3 x4 x5 x6 x7 x8 x9
## x1 1.358
## x2 0.448 1.382
## x3 0.590 0.327 1.275
## x4 0.408 0.226 0.298 1.351
## x5 0.454 0.252 0.331 1.090 1.660
## x6 0.378 0.209 0.276 0.907 1.010 1.196
## x7 0.262 0.145 0.191 0.173 0.193 0.161 1.183
## x8 0.309 0.171 0.226 0.205 0.228 0.190 0.453 1.022
## x9 0.284 0.157 0.207 0.188 0.209 0.174 0.415 0.490 1.015
Luego, se extrae la matriz de covarianzas implicada con ...$cov. El output correspondiente es:
## x1 x2 x3 x4 x5 x6 x7
## x1 1.3583700 0.4479566 0.5902910 0.4082324 0.4543940 0.3780829 0.2622246
## x2 0.4479566 1.3817831 0.3267262 0.2259568 0.2515072 0.2092690 0.1451414
## x3 0.5902910 0.3267262 1.2748647 0.2977526 0.3314214 0.2757624 0.1912588
## x4 0.4082324 0.2259568 0.2977526 1.3506644 1.0902489 0.9071522 0.1734947
## x5 0.4543940 0.2515072 0.3314214 1.0902489 1.6597856 1.0097299 0.1931129
## x6 0.3780829 0.2092690 0.2757624 0.9071522 1.0097299 1.1963583 0.1606814
## x7 0.2622246 0.1451414 0.1912588 0.1734947 0.1931129 0.1606814 1.1831393
## x8 0.3094121 0.1712597 0.2256760 0.2047152 0.2278637 0.1895962 0.4528034
## x9 0.2836038 0.1569748 0.2068522 0.1876397 0.2088574 0.1737818 0.4150347
## x8 x9
## x1 0.3094121 0.2836038
## x2 0.1712597 0.1569748
## x3 0.2256760 0.2068522
## x4 0.2047152 0.1876397
## x5 0.2278637 0.2088574
## x6 0.1895962 0.1737818
## x7 0.4528034 0.4150347
## x8 1.0219828 0.4897205
## x9 0.4897205 1.0150038
## attr(,"class")
## [1] "lavaan.matrix.symmetric" "matrix"
fitted y unclass() (tercera forma)Sigma <- round(unclass(fitted(CFA)$cov),3)
Sigma
## x1 x2 x3 x4 x5 x6 x7 x8 x9
## x1 1.358 0.448 0.590 0.408 0.454 0.378 0.262 0.309 0.284
## x2 0.448 1.382 0.327 0.226 0.252 0.209 0.145 0.171 0.157
## x3 0.590 0.327 1.275 0.298 0.331 0.276 0.191 0.226 0.207
## x4 0.408 0.226 0.298 1.351 1.090 0.907 0.173 0.205 0.188
## x5 0.454 0.252 0.331 1.090 1.660 1.010 0.193 0.228 0.209
## x6 0.378 0.209 0.276 0.907 1.010 1.196 0.161 0.190 0.174
## x7 0.262 0.145 0.191 0.173 0.193 0.161 1.183 0.453 0.415
## x8 0.309 0.171 0.226 0.205 0.228 0.190 0.453 1.022 0.490
## x9 0.284 0.157 0.207 0.188 0.209 0.174 0.415 0.490 1.015
lavInspect (cuarta forma)Sigma <- lavInspect(CFA, "sigma")
Sigma
## x1 x2 x3 x4 x5 x6 x7 x8 x9
## x1 1.358
## x2 0.448 1.382
## x3 0.590 0.327 1.275
## x4 0.408 0.226 0.298 1.351
## x5 0.454 0.252 0.331 1.090 1.660
## x6 0.378 0.209 0.276 0.907 1.010 1.196
## x7 0.262 0.145 0.191 0.173 0.193 0.161 1.183
## x8 0.309 0.171 0.226 0.205 0.228 0.190 0.453 1.022
## x9 0.284 0.157 0.207 0.188 0.209 0.174 0.415 0.490 1.015
En análisis factorial confirmatorio (CFA) y, en general, en modelos de ecuaciones estructurales (SEM), es frecuente evaluar el ajuste del modelo en la escala de correlaciones, ya que esta escala elimina la influencia de las unidades de medida y permite comparaciones directas entre pares de variables. Antes de definir residuos en correlaciones, es fundamental distinguir con claridad entre:
Correlaciones observadas, obtenidas a partir de los datos, y
*Correlaciones implicadas por el modelo**, obtenidas a partir de la matriz de covarianzas implicada \(\boldsymbol{\Sigma}\).
Sea \(\mathbf{A}\) una matriz de covarianzas (muestral o implicada por un modelo). La matriz de correlaciones asociada a \(\mathbf{A}\) se obtiene mediante la transformación:
\[ \operatorname{Cor}(\mathbf{A}) = \mathbf{D}_{\mathbf{A}}^{-1/2}\, \mathbf{A}\, \mathbf{D}_{\mathbf{A}}^{-1/2}, \]
donde
\[ \mathbf{D}_{\mathbf{A}} = \operatorname{diag}(a_{11}, \ldots, a_{pp}) \]
es la matriz diagonal que contiene las varianzas de las variables observadas. Esta transformación estandariza cada variable para que tenga varianza unitaria, produciendo una matriz con unos en la diagonal y coeficientes de correlación fuera de ella.
En CFA/SEM pueden considerarse dos versiones de la matriz de correlaciones observadas, dependiendo de la matriz de covarianzas muestrales de partida.
Si se parte de la matriz de covarianzas muestral clásica,
\[ \mathbf{S}_{\text{cov}} = \frac{1}{N-1} \sum_{i=1}^{N} (\mathbf{x}_i - \bar{\mathbf{x}}) (\mathbf{x}_i - \bar{\mathbf{x}})^{\top}, \]
entonces la matriz de correlaciones observadas descriptivas se define como:
\[ \operatorname{Cor}(\mathbf{S}_{\text{cov}}) = \mathbf{D}(\mathbf{S}_{\text{cov}})^{-1/2}\, \mathbf{S}_{\text{cov}}\, \mathbf{D}(\mathbf{S}_{\text{cov}})^{-1/2}. \]
Esta es la matriz de correlaciones que se utiliza habitualmente en estadística descriptiva y análisis exploratorio.
lavaan)Cuando el modelo CFA se ajusta mediante máxima verosimilitud (ML), lavaan trabaja internamente con la matriz:
\[ \mathbf{S}_{\text{lav}} = \frac{1}{N} \sum_{i=1}^{N} (\mathbf{x}_i - \bar{\mathbf{x}}) (\mathbf{x}_i - \bar{\mathbf{x}})^{\top}. \]
La correspondiente matriz de correlaciones observadas, coherente con el marco ML, es:
\[ \operatorname{Cor}(\mathbf{S}_{\text{lav}}) = \mathbf{D}(\mathbf{S}_{\text{lav}})^{-1/2}\, \mathbf{S}_{\text{lav}}\, \mathbf{D}(\mathbf{S}_{\text{lav}})^{-1/2}. \]
Aunque \(\mathbf{S}_{\text{cov}}\) y \(\mathbf{S}_{\text{lav}}\) difieren por un factor de escala, sus matrices de correlaciones suelen ser muy similares, ya que el proceso de estandarización elimina gran parte de esa diferencia.
Sea \(\boldsymbol{\Sigma}\) la matriz de covarianzas implicada por el modelo CFA ajustado, estimada a partir de los parámetros del modelo. La matriz de correlaciones implicadas por el modelo se obtiene estandarizando \(\boldsymbol{\Sigma}\) a varianzas unitarias:
[:
\[ \operatorname{Cor}(\boldsymbol{\Sigma}) = \mathbf{D}(\boldsymbol{\Sigma})^{-1/2}\, \boldsymbol{\Sigma}\, \mathbf{D}(\boldsymbol{\Sigma})^{-1/2}. \]
En la f´romula de arriba, la matriz \(\mathbf{D}(\boldsymbol{\Sigma})\) es la matriz diagonal de varianzas implicadas por el modelo, es decir:
\[ \mathbf{D}(\boldsymbol{\Sigma}) = \operatorname{diag}\big(\sigma_{11},\sigma_{22},\ldots,\sigma_{pp}\big). \]
Aquí:
\(\sigma_{ii}\) es la varianza predicha por el modelo para la variable observada \(X_i\),
\(\mathbf{D}(\boldsymbol{\Sigma})^{-1/2}=\operatorname{diag}\!\left(\frac{1}{\sqrt{\sigma_{11}}},\ldots,\frac{1}{\sqrt{\sigma_{pp}}}\right)\) es la matriz que estandariza cada variable dividiendo por su desviación estándar implicada por el modelo.
En consecuencia, \(\operatorname{Cor}(\boldsymbol{\Sigma})\) es la matriz que contiene las correlaciones que el modelo CFA predice. entre los ítems.
REn esta sección calculamos las siguientes tres matrices de correlaciones:
\(\operatorname{Cor}(\mathbf{S}_{\text{cov}})\): correlaciones observadas a partir de cov(dat) (divisor \(N-1\)).
\(\operatorname{Cor}(\mathbf{S}_{\text{lav}})\): correlaciones observadas a partir de la matriz usada por lavaan bajo ML (divisor \(N\)).
\(\operatorname{Cor}(\boldsymbol{\Sigma})\): correlaciones implicadas por el modelo, construidas a partir de la matriz \(\boldsymbol{\Sigma}\) ajustada.
La función cov2cor_mat() convierte una matriz de covarianzas \(\mathbf{A}\) en su matriz de correlaciones \(\operatorname{Cor}(\mathbf{A})\) mediante la transformación:
\[ \operatorname{Cor}(\mathbf{A}) = \mathbf{D}_{\mathbf{A}}^{-1/2}\, \mathbf{A}\, \mathbf{D}_{\mathbf{A}}^{-1/2}, \qquad \mathbf{D}_{\mathbf{A}}=\operatorname{diag}(a_{11},\ldots,a_{pp}). \]
Aquí:
\(\mathbf{D}_{\mathbf{A}}\) es la matriz diagonal que contiene las varianzas (la diagonal de \(\mathbf{A}\)).
\(\mathbf{D}_{\mathbf{A}}^{-1/2}\) contiene en la diagonal \(1/\sqrt{a_{jj}}\), es decir, el inverso de las desviaciones estándar.
Al premultiplicar y postmultiplicar por \(\mathbf{D}^{-1/2}\), se “estandarizan” las covarianzas para que la diagonal quede en 1 y el resto sean correlaciones.
# 1) Matrices de covarianzas "observadas"
S_cov <- cov(dat) # clásico, divisor N-1
S_lav <- lavTech(CFA, "sampstat")[[1]]$cov # divisor N (ML)
# 2) Matriz de covarianzas implicada por el modelo
Sigma <- fitted(CFA)$cov
# 3) Función auxiliar: Cov -> Cor
cov2cor_mat <- function(A) {
Dinvhalf <- diag(1 / sqrt(diag(A)))
Dinvhalf %*% A %*% Dinvhalf
}
# 4) Correlaciones observadas (clásico, dicisor N-1)
Cor_Scov <- cov2cor_mat(S_cov)
Cor_Scov
# 4) Correlaciones observadas (coherente con ML, lavaan, divisor N)
Cor_Slav <- cov2cor_mat(S_lav)
Cor_Slav
# 4) Correlaciones implicadas por el modelo
Cor_Sigma <- cov2cor_mat(Sigma)
Cor_Sigma
Las matrices de correlaciones observadas (desde \(\mathbf{S}_{\text{cov}}\) y \(\mathbf{S}_{\text{lav}}\)) son
Cor_Scov
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1.00000000 0.29734551 0.44066800 0.3727063 0.29344369 0.3567702
## [2,] 0.29734551 1.00000000 0.33984898 0.1529302 0.13938749 0.1925319
## [3,] 0.44066800 0.33984898 1.00000000 0.1586396 0.07719823 0.1976610
## [4,] 0.37270627 0.15293019 0.15863957 1.0000000 0.73317017 0.7044802
## [5,] 0.29344369 0.13938749 0.07719823 0.7331702 1.00000000 0.7199555
## [6,] 0.35677019 0.19253190 0.19766102 0.7044802 0.71995554 1.0000000
## [7,] 0.06686392 -0.07566892 0.07193105 0.1738291 0.10204475 0.1211017
## [8,] 0.22392677 0.09227923 0.18601263 0.1068984 0.13866998 0.1496113
## [9,] 0.39034041 0.20604057 0.32865061 0.2078483 0.22746642 0.2141617
## [,7] [,8] [,9]
## [1,] 0.06686392 0.22392677 0.3903404
## [2,] -0.07566892 0.09227923 0.2060406
## [3,] 0.07193105 0.18601263 0.3286506
## [4,] 0.17382912 0.10689838 0.2078483
## [5,] 0.10204475 0.13866998 0.2274664
## [6,] 0.12110170 0.14961132 0.2141617
## [7,] 1.00000000 0.48675793 0.3406457
## [8,] 0.48675793 1.00000000 0.4490154
## [9,] 0.34064572 0.44901545 1.0000000
Cor_Slav
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1.00000000 0.29734551 0.44066800 0.3727063 0.29344369 0.3567702
## [2,] 0.29734551 1.00000000 0.33984898 0.1529302 0.13938749 0.1925319
## [3,] 0.44066800 0.33984898 1.00000000 0.1586396 0.07719823 0.1976610
## [4,] 0.37270627 0.15293019 0.15863957 1.0000000 0.73317017 0.7044802
## [5,] 0.29344369 0.13938749 0.07719823 0.7331702 1.00000000 0.7199555
## [6,] 0.35677019 0.19253190 0.19766102 0.7044802 0.71995554 1.0000000
## [7,] 0.06686392 -0.07566892 0.07193105 0.1738291 0.10204475 0.1211017
## [8,] 0.22392677 0.09227923 0.18601263 0.1068984 0.13866998 0.1496113
## [9,] 0.39034041 0.20604057 0.32865061 0.2078483 0.22746642 0.2141617
## [,7] [,8] [,9]
## [1,] 0.06686392 0.22392677 0.3903404
## [2,] -0.07566892 0.09227923 0.2060406
## [3,] 0.07193105 0.18601263 0.3286506
## [4,] 0.17382912 0.10689838 0.2078483
## [5,] 0.10204475 0.13866998 0.2274664
## [6,] 0.12110170 0.14961132 0.2141617
## [7,] 1.00000000 0.48675793 0.3406457
## [8,] 0.48675793 1.00000000 0.4490154
## [9,] 0.34064572 0.44901545 1.0000000
En estos resultados se observa que:
\[ \operatorname{Cor}(\mathbf{S}_{\text{cov}}) = \operatorname{Cor}(\mathbf{S}_{\text{lav}}) = \begin{pmatrix} 1.0000 & 0.2973 & 0.4407 & 0.3727 & 0.2934 & 0.3568 & 0.0669 & 0.2239 & 0.3903 \\ 0.2973 & 1.0000 & 0.3398 & 0.1529 & 0.1394 & 0.1925 & -0.0757 & 0.0923 & 0.2060 \\ 0.4407 & 0.3398 & 1.0000 & 0.1586 & 0.0772 & 0.1977 & 0.0719 & 0.1860 & 0.3287 \\ 0.3727 & 0.1529 & 0.1586 & 1.0000 & 0.7332 & 0.7045 & 0.1738 & 0.1069 & 0.2078 \\ 0.2934 & 0.1394 & 0.0772 & 0.7332 & 1.0000 & 0.7200 & 0.1020 & 0.1387 & 0.2275 \\ 0.3568 & 0.1925 & 0.1977 & 0.7045 & 0.7200 & 1.0000 & 0.1211 & 0.1496 & 0.2142 \\ 0.0669 & -0.0757 & 0.0719 & 0.1738 & 0.1020 & 0.1211 & 1.0000 & 0.4868 & 0.3406 \\ 0.2239 & 0.0923 & 0.1860 & 0.1069 & 0.1387 & 0.1496 & 0.4868 & 1.0000 & 0.4490 \\ 0.3903 & 0.2060 & 0.3287 & 0.2078 & 0.2275 & 0.2142 & 0.3406 & 0.4490 & 1.0000 \end{pmatrix}. \]
Esto es esperable porque \(\mathbf{S}_{\text{cov}}\) y \(\mathbf{S}_{\text{lav}}\) difieren únicamente por un factor de escala global:
\[ \mathbf{S}_{\text{cov}} = \frac{N}{N-1}\,\mathbf{S}_{\text{lav}}. \]
Al convertir covarianzas a correlaciones, ese factor se elimina automáticamente, ya que se divide por las desviaciones estándar (raíces de las varianzas en la diagonal). Por eso, aunque las covarianzas cambien levemente (por el divisor \(N-1\) vs. \(N\)), las correlaciones observadas terminan siendo iguales (salvo diferencias por redondeo).
La matriz de correlaciones implicadas por el modelo es:
Cor_Sigma
## [,1] [,2] [,3] [,4] [,5] [,6] [,7]
## [1,] 1.0000000 0.3269693 0.4485647 0.3013872 0.3026199 0.2965838 0.2068457
## [2,] 0.3269693 1.0000000 0.2461682 0.1653986 0.1660751 0.1627625 0.1135150
## [3,] 0.4485647 0.2461682 1.0000000 0.2269080 0.2278361 0.2232916 0.1557297
## [4,] 0.3013872 0.1653986 0.2269080 1.0000000 0.7281585 0.7136345 0.1372444
## [5,] 0.3026199 0.1660751 0.2278361 0.7281585 1.0000000 0.7165535 0.1378057
## [6,] 0.2965838 0.1627625 0.2232916 0.7136345 0.7165535 1.0000000 0.1350570
## [7,] 0.2068457 0.1135150 0.1557297 0.1372444 0.1378057 0.1350570 1.0000000
## [8,] 0.2626071 0.1441164 0.1977113 0.1742427 0.1749554 0.1714657 0.4117844
## [9,] 0.2415290 0.1325489 0.1818420 0.1602571 0.1609126 0.1577030 0.3787325
## [,8] [,9]
## [1,] 0.2626071 0.2415290
## [2,] 0.1441164 0.1325489
## [3,] 0.1977113 0.1818420
## [4,] 0.1742427 0.1602571
## [5,] 0.1749554 0.1609126
## [6,] 0.1714657 0.1577030
## [7,] 0.4117844 0.3787325
## [8,] 1.0000000 0.4808312
## [9,] 0.4808312 1.0000000
\[ \operatorname{Cor}(\boldsymbol{\Sigma}) = \begin{pmatrix} 1.0000 & 0.3270 & 0.4486 & 0.3014 & 0.3026 & 0.2966 & 0.2068 & 0.2626 & 0.2415 \\ 0.3270 & 1.0000 & 0.2462 & 0.1654 & 0.1661 & 0.1628 & 0.1135 & 0.1441 & 0.1325 \\ 0.4486 & 0.2462 & 1.0000 & 0.2269 & 0.2278 & 0.2233 & 0.1557 & 0.1977 & 0.1818 \\ 0.3014 & 0.1654 & 0.2269 & 1.0000 & 0.7282 & 0.7136 & 0.1372 & 0.1742 & 0.1603 \\ 0.3026 & 0.1661 & 0.2278 & 0.7282 & 1.0000 & 0.7166 & 0.1378 & 0.1750 & 0.1609 \\ 0.2966 & 0.1628 & 0.2233 & 0.7136 & 0.7166 & 1.0000 & 0.1351 & 0.1715 & 0.1577 \\ 0.2068 & 0.1135 & 0.1557 & 0.1372 & 0.1378 & 0.1351 & 1.0000 & 0.4118 & 0.3787 \\ 0.2626 & 0.1441 & 0.1977 & 0.1742 & 0.1750 & 0.1715 & 0.4118 & 1.0000 & 0.4808 \\ 0.2415 & 0.1325 & 0.1818 & 0.1603 & 0.1609 & 0.1577 & 0.3787 & 0.4808 & 1.0000 \end{pmatrix}. \]
Se resalta que la matriz \(\operatorname{Cor}(\boldsymbol{\Sigma})\) no tiene por qué coincidir con las correlaciones observadas, porque resume lo que el modelo CFA implica bajo su estructura (factores, cargas, varianzas y covarianzas estimadas). Por ejemplo, en el output:
La correlación observada entre \(x_1\) y \(x_2\) es \(0.2973\).
La correlación implicada por el modelo entre \(x_1\) y \(x_2\) es \(0.3270\).
La diferencia entre ambas se interpreta luego como evidencia de misfit local en escala de correlaciones (esto será exactamente lo que capturan las matrices residuales \(\mathbf{R}_{\text{cor}}\)).
Las matrices \(\operatorname{Cor}(\mathbf{S}_{\text{cov}})\), \(\operatorname{Cor}(\mathbf{S}_{\text{lav}})\) y \(\operatorname{Cor}(\boldsymbol{\Sigma})\) constituyen los bloques fundamentales del análisis de ajuste en escala de correlaciones en CFA/SEM.
Las dos primeras representan las correlaciones observadas (obtenidas a partir de la matriz muestral clásica y de la matriz coherente con ML, respectivamente), mientras que \(\operatorname{Cor}(\boldsymbol{\Sigma})\) recoge las correlaciones implicadas por el modelo bajo sus supuestos estructurales.
En la siguiente sección, estas matrices se combinarán para construir las matrices de correlaciones residuales, las cuales cuantifican de forma directa y comparable las discrepancias entre lo observado y lo implicado por el modelo. Este contraste en escala de correlaciones es especialmente útil para el diagnóstico de misfit local, ya que elimina los efectos de escala propios de las covarianzas y permite interpretar las discrepancias en términos estandarizados.
cov():\[ \mathbf{R}_{\text{cov}} = \mathbf{S}_{\text{cov}}-\boldsymbol{\Sigma}, \qquad \mathbf{S}_{\text{cov}} = \frac{1}{N-1}\sum_{i=1}^N(\mathbf{x}_i-\bar{\mathbf{x}})(\mathbf{x}_i-\bar{\mathbf{x}})^\top . \]
lavaan), basado en la matriz usada internamente por el ajuste:\[ \mathbf{R}_{\text{lav}} = \mathbf{S}_{\text{lav}}-\boldsymbol{\Sigma}, \qquad \mathbf{S}_{\text{lav}} = \frac{1}{N}\sum_{i=1}^N(\mathbf{x}_i-\bar{\mathbf{x}})(\mathbf{x}_i-\bar{\mathbf{x}})^\top . \]
# 1) Matriz muestral clásica (divisor N-1)
S_cov <- cov(dat)
# 2) Matriz muestral usada por lavaan bajo ML (divisor N)
S_lav <- lavTech(CFA, "sampstat")[[1]]$cov
# 3) Matriz de covarianzas implícita por el modelo (ajustada, ML)
Sigma_hat <- fitted(CFA)$cov # equivalente a fitted.values(CFA)$cov
# 4) Dos versiones de residuales (escala covarianzas)
R_cov <- S_cov - Sigma_hat
R_cov
R_lav <- S_lav - Sigma_hat
R_lav
La matriz residual basada en \(\mathbf{S}_{\text{cov}}\) es:
R_cov
## x1 x2 x3 x4 x5 x6 x7 x8 x9
## x1 0.005
## x2 -0.039 0.005
## x3 -0.008 0.126 0.004
## x4 0.098 -0.016 -0.089 0.005
## x5 -0.012 -0.040 -0.219 0.011 0.006
## x6 0.078 0.039 -0.031 -0.009 0.008 0.004
## x7 -0.177 -0.242 -0.103 0.047 -0.050 -0.016 0.004
## x8 -0.045 -0.061 -0.013 -0.079 -0.047 -0.024 0.084 0.003
## x9 0.176 0.088 0.168 0.057 0.087 0.063 -0.040 -0.031 0.003
Es decir,
\[ \mathbf{R}_{\text{cov}} = \mathbf{S}_{\text{cov}}-\boldsymbol{\Sigma}= \begin{pmatrix} 0.005 & -0.039 & -0.008 & 0.098 & -0.012 & 0.078 & -0.177 & -0.045 & 0.176 \\ -0.039 & 0.005 & 0.126 & -0.016 & -0.040 & 0.039 & -0.242 & -0.061 & 0.088 \\ -0.008 & 0.126 & 0.004 & -0.089 & -0.219 & -0.031 & -0.103 & -0.013 & 0.168 \\ 0.098 & -0.016 & -0.089 & 0.005 & 0.011 & -0.009 & 0.047 & -0.079 & 0.057 \\ -0.012 & -0.040 & -0.219 & 0.011 & 0.006 & 0.008 & -0.050 & -0.047 & 0.087 \\ 0.078 & 0.039 & -0.031 & -0.009 & 0.008 & 0.004 & -0.016 & -0.024 & 0.063 \\ -0.177 & -0.242 & -0.103 & 0.047 & -0.050 & -0.016 & 0.004 & 0.084 & -0.040 \\ -0.045 & -0.061 & -0.013 & -0.079 & -0.047 & -0.024 & 0.084 & 0.003 & -0.031 \\ 0.176 & 0.088 & 0.168 & 0.057 & 0.087 & 0.063 & -0.040 & -0.031 & 0.003 \end{pmatrix}. \]
La matriz residual basada en \(\mathbf{S}_{\text{lav}}\) es:
R_lav
## x1 x2 x3 x4 x5 x6 x7 x8 x9
## x1 0.000
## x2 -0.041 0.000
## x3 -0.010 0.124 0.000
## x4 0.097 -0.017 -0.090 0.000
## x5 -0.014 -0.040 -0.219 0.008 0.000
## x6 0.077 0.038 -0.032 -0.012 0.005 0.000
## x7 -0.177 -0.242 -0.103 0.046 -0.050 -0.017 0.000
## x8 -0.046 -0.062 -0.013 -0.079 -0.047 -0.024 0.082 0.000
## x9 0.175 0.087 0.167 0.056 0.086 0.062 -0.042 -0.032 0.000
\[ \mathbf{R}_{\text{lav}} = \mathbf{S}_{\text{lav}}-\boldsymbol{\Sigma} = \begin{pmatrix} 0.000 & -0.041 & -0.010 & 0.097 & -0.014 & 0.077 & -0.177 & -0.046 & 0.175 \\ -0.041 & 0.000 & 0.124 & -0.017 & -0.040 & 0.038 & -0.242 & -0.062 & 0.087 \\ -0.010 & 0.124 & 0.000 & -0.090 & -0.219 & -0.032 & -0.103 & -0.013 & 0.167 \\ 0.097 & -0.017 & -0.090 & 0.000 & 0.008 & -0.012 & 0.046 & -0.079 & 0.056 \\ -0.014 & -0.040 & -0.219 & 0.008 & 0.000 & 0.005 & -0.050 & -0.047 & 0.086 \\ 0.077 & 0.038 & -0.032 & -0.012 & 0.005 & 0.000 & -0.017 & -0.024 & 0.062 \\ -0.177 & -0.242 & -0.103 & 0.046 & -0.050 & -0.017 & 0.000 & 0.082 & -0.042 \\ -0.046 & -0.062 & -0.013 & -0.079 & -0.047 & -0.024 & 0.082 & 0.000 & -0.032 \\ 0.175 & 0.087 & 0.167 & 0.056 & 0.086 & 0.062 & -0.042 & -0.032 & 0.000 \end{pmatrix}. \]
El paquete lavaan (con estimador de máxima verosimilitud, ML) no compara el modelo contra la covarianza descriptiva clásica, sino contra la matriz de covarianzas muestrales utilizada internamente por el estimador ML, \(\mathbf{S}_{\text{lav}}\). Por esta razón, la salida de residuals(fit)$cov coincide con \(\mathbf{R}_{\text{lav}}\) y no con \(\mathbf{R}_{\text{cov}}\).
# 5) Residuos crudos reportados por lavaan
residuals(CFA)
R_raw <- residuals(CFA)$cov
# 6) Verificación típica:
all.equal(R_lav, R_raw) # 6a) Suele dar TRUE (o muy cercano)
all.equal(R_cov, R_raw) # 6b) NO debe dar TRUE
La verificación esperada es:
all.equal(R_lav, R_raw_lavaan) debe generar TRUE (o casi TRUE), lo que confirma que lavaan define sus residuos crudos como## [1] TRUE
all.equal(R_cov, R_raw_lavaan) no debe ser TRUE, ya que \(\mathbf{S}_{\text{cov}}\) y \(\mathbf{S}_{\text{lav}}\) utilizan divisores distintos (\(N-1\) vs. \(N\)) y, por tanto, generan residuos numéricamente diferentes.## [1] "Mean relative difference: 0.02342357"
Observe que, en general, laS salidas de residuals(CFA) y residuals(CFA)$cov son:
residuals(CFA)
## $type
## [1] "raw"
##
## $cov
## x1 x2 x3 x4 x5 x6 x7 x8 x9
## x1 0.000
## x2 -0.041 0.000
## x3 -0.010 0.124 0.000
## x4 0.097 -0.017 -0.090 0.000
## x5 -0.014 -0.040 -0.219 0.008 0.000
## x6 0.077 0.038 -0.032 -0.012 0.005 0.000
## x7 -0.177 -0.242 -0.103 0.046 -0.050 -0.017 0.000
## x8 -0.046 -0.062 -0.013 -0.079 -0.047 -0.024 0.082 0.000
## x9 0.175 0.087 0.167 0.056 0.086 0.062 -0.042 -0.032 0.000
R_raw
## x1 x2 x3 x4 x5 x6 x7 x8 x9
## x1 0.000
## x2 -0.041 0.000
## x3 -0.010 0.124 0.000
## x4 0.097 -0.017 -0.090 0.000
## x5 -0.014 -0.040 -0.219 0.008 0.000
## x6 0.077 0.038 -0.032 -0.012 0.005 0.000
## x7 -0.177 -0.242 -0.103 0.046 -0.050 -0.017 0.000
## x8 -0.046 -0.062 -0.013 -0.079 -0.047 -0.024 0.082 0.000
## x9 0.175 0.087 0.167 0.056 0.086 0.062 -0.042 -0.032 0.000
respectivamente. Observe que
\[\mathbf{R}_{\text{raw}} = \mathbf{R}_{\text{lav}} \]
Nota.
Las matrices \(\mathbf{R}_{\text{cov}}\) y \(\mathbf{R}_{\text{lav}}\) representan residuos de covarianzas calculados bajo distintos criterios muestrales. Aunque conceptualmente ambas cuantifican \(\mathbf{S} - \boldsymbol{\Sigma}\), sus valores numéricos difieren debido al uso de divisores distintos (\(N-1\) frente a \(N\)), siendo \(\mathbf{R}_{\text{lav}}\) la matriz coherente con la estimación por máxima verosimilitud utilizada internamente por lavaan.
En CFA/SEM, una estrategia habitual para diagnosticar misfit local consiste en evaluar las discrepancias entre lo observado y lo implicado por el modelo en la escala de correlaciones. Esta escala elimina los efectos de magnitud propios de las covarianzas y permite comparaciones directas entre pares de variables. Para cualquier matriz de covarianzas \(\mathbf{A}\), su versión en correlaciones se define como:
\[ \operatorname{Cor}(\mathbf{A}) = \mathbf{D}_{\mathbf{A}}^{-1/2}\, \mathbf{A}\, \mathbf{D}_{\mathbf{A}}^{-1/2}, \qquad \mathbf{D}_{\mathbf{A}}=\operatorname{diag}(a_{11},\ldots,a_{pp}), \]
donde \(\mathbf{D}_{\mathbf{A}}\) es la matriz diagonal que contiene las varianzas asociadas a \(\mathbf{A}\). Con esta transformación, la matriz de covarianzas residuales en escala de correlaciones se define como la diferencia entre:
La matriz de correlaciones observadas, obtenida a partir de una matriz de covarianzas muestrales, y
La matriz de correlaciones implicadas por el modelo, construida a partir de la matriz de covarianzas \(\boldsymbol{\Sigma}\) estimada bajo el modelo CFA.
En particular, es útil distinguir dos versiones de esta matriz residual, dependiendo de qué matriz muestral se tome como referencia observada:
\[ \mathbf{R}_{\text{cor,cov}} = \operatorname{Cor}(\mathbf{S}_{\text{cov}}) - \operatorname{Cor}(\boldsymbol{\Sigma}), \qquad \mathbf{S}_{\text{cov}} = \frac{1}{N-1} \sum_{i=1}^N (\mathbf{x}_i-\bar{\mathbf{x}}) (\mathbf{x}_i-\bar{\mathbf{x}})^\top. \]
Esta versión tiene un carácter descriptivo, ya que utiliza la matriz de covarianzas clásica empleada en estadística exploratoria.
lavaan). Basados en la matriz de covarianzas utilizada internamente por lavaan bajo máxima verosimilitud:\[ \mathbf{R}_{\text{cor,lav}} = \operatorname{Cor}(\mathbf{S}_{\text{lav}}) - \operatorname{Cor}(\boldsymbol{\Sigma}), \qquad \mathbf{S}_{\text{lav}} = \frac{1}{N} \sum_{i=1}^N (\mathbf{x}_i-\bar{\mathbf{x}}) (\mathbf{x}_i-\bar{\mathbf{x}})^\top. \]
Esta es la versión conceptualmente coherente con el ajuste ML y, por tanto, la más alineada con los residuos que reporta lavaan cuando se solicitan resultados en escala de correlaciones.
Esta definición aclara que la matriz \(\mathbf{R}_{\text{cor, lav}}\) no corresponde a la resta directa de covarianzas \(\mathbf{R}_{\text{cov}}=\mathbf{S}_{\text{cov}} - \boldsymbol{\Sigma}\) (o \(\mathbf{R}_{\text{lav}}=\mathbf{S}_{\text{lav}} - \boldsymbol{\Sigma}\) ), sino a la discrepancia entre matrices expresadas en una escala estandarizada.
Cada elemento \(r_{ij}\) de la matriz de covarianzas residuales (\(\mathbf{R}_{\text{cor, cov}}\) o \(\mathbf{R}_{\text{cor, lav}}\)) se define como:
\[ r_{ij} = \operatorname{cor}(X_i, X_j) - \operatorname{cor}_{\text{modelo}}(X_i, X_j), \]
y cuantifica la parte de la covarianza entre los ítems \(X_i\) y \(X_j\) que no es explicada por el modelo CFA ajustado. En particular:
Valores cercanos a 0 (\(r_{ij} \approx 0\)) implica buen ajuste local del modelo. Es decir, el modelo explica exactamente la relación entre \(X_i\) y \(X_j\).
Valores grandes en valor absoluto (\(r_{ij} \neq 0\)) sugieren la presencia de desajuste local (local misfit). Es decir, existe asociación entre \(X_i\) y \(X_j\) no capturada por el modelo.
El objetivo general del análisis CFA es que la matriz residual satisfaga \(R \approx 0\).
Con residuales estandarizados pueden emplearse criterios empíricos claros, por ejemplo:
Si \(\lvert r_{ij} \rvert < 0.05\), entonces, hay un ajuste local excelente.
Si \(0.05 \le \lvert r_{ij} \rvert < 0.10\), entonces, hay un ajuste local aceptable.
Si \(\lvert r_{ij} \rvert \ge 0.10\), entonces, hay un potencial problema de ajuste local. Es decir, los residuales de correlación con valores absolutos superiores a 0.10 sugieren asociaciones no explicadas por el modelo CFA y constituyen candidatos naturales para un análisis más detallado mediante índices de modificación o revisión teórica del modelo.
Este tipo de evaluación no es posible de forma directa y comparable cuando se trabaja con covarianzas no estandarizadas.
En esta sección calculamos las matrices de correlaciones residuales como resta de matrices. Para pasar de covarianzas a correlaciones usamos la transformación \(\operatorname{Cor}(\mathbf{A})\) definida anteriormente. El código correspondiente es:
# 1) Matrices de covarianzas "observadas"
S_cov <- cov(dat) # divisor N-1
S_lav <- lavTech(CFA, "sampstat")[[1]]$cov # divisor N (ML)
# 2) Matriz de covarianzas implicada por el modelo
Sigma <- fitted(CFA)$cov
# 3) Función auxiliar: Cov -> Cor
cov2cor_mat <- function(A) {
Dinvhalf <- diag(1 / sqrt(diag(A)))
Dinvhalf %*% A %*% Dinvhalf
}
# 4) Correlaciones observadas e implicadas
Cor_Scov <- cov2cor_mat(S_cov)
Cor_Slav <- cov2cor_mat(S_lav)
Cor_Sigma <- cov2cor_mat(Sigma)
# 5) Dos versiones del residual en correlaciones
R_cor_cov <- Cor_Scov - Cor_Sigma
R_cor_lav <- Cor_Slav - Cor_Sigma
R_cor_cov
R_cor_lav
Se obtienen:
R_cor_cov
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.000000000 -2.962380e-02 -7.896667e-03 7.131910e-02 -0.009176244
## [2,] -0.029623801 2.220446e-16 9.368075e-02 -1.246837e-02 -0.026687592
## [3,] -0.007896667 9.368075e-02 -3.330669e-16 -6.826841e-02 -0.150637875
## [4,] 0.071319095 -1.246837e-02 -6.826841e-02 -2.220446e-16 0.005011633
## [5,] -0.009176244 -2.668759e-02 -1.506379e-01 5.011633e-03 0.000000000
## [6,] 0.060186395 2.976940e-02 -2.563060e-02 -9.154239e-03 0.003402082
## [7,] -0.139981768 -1.891840e-01 -8.379866e-02 3.658475e-02 -0.035760980
## [8,] -0.038680367 -5.183719e-02 -1.169869e-02 -6.734432e-02 -0.036285416
## [9,] 0.148811459 7.349166e-02 1.468086e-01 4.759121e-02 0.066553827
## [,6] [,7] [,8] [,9]
## [1,] 6.018640e-02 -1.399818e-01 -3.868037e-02 1.488115e-01
## [2,] 2.976940e-02 -1.891840e-01 -5.183719e-02 7.349166e-02
## [3,] -2.563060e-02 -8.379866e-02 -1.169869e-02 1.468086e-01
## [4,] -9.154239e-03 3.658475e-02 -6.734432e-02 4.759121e-02
## [5,] 3.402082e-03 -3.576098e-02 -3.628542e-02 6.655383e-02
## [6,] -2.220446e-16 -1.395533e-02 -2.185437e-02 5.645876e-02
## [7,] -1.395533e-02 2.220446e-16 7.497350e-02 -3.808680e-02
## [8,] -2.185437e-02 7.497350e-02 4.440892e-16 -3.181577e-02
## [9,] 5.645876e-02 -3.808680e-02 -3.181577e-02 -2.220446e-16
R_cor_lav
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.000000000 -2.962380e-02 -0.007896667 7.131910e-02 -0.009176244
## [2,] -0.029623801 2.220446e-16 0.093680752 -1.246837e-02 -0.026687592
## [3,] -0.007896667 9.368075e-02 0.000000000 -6.826841e-02 -0.150637875
## [4,] 0.071319095 -1.246837e-02 -0.068268413 -2.220446e-16 0.005011633
## [5,] -0.009176244 -2.668759e-02 -0.150637875 5.011633e-03 0.000000000
## [6,] 0.060186395 2.976940e-02 -0.025630597 -9.154239e-03 0.003402082
## [7,] -0.139981768 -1.891840e-01 -0.083798661 3.658475e-02 -0.035760980
## [8,] -0.038680367 -5.183719e-02 -0.011698686 -6.734432e-02 -0.036285416
## [9,] 0.148811459 7.349166e-02 0.146808608 4.759121e-02 0.066553827
## [,6] [,7] [,8] [,9]
## [1,] 6.018640e-02 -1.399818e-01 -3.868037e-02 0.14881146
## [2,] 2.976940e-02 -1.891840e-01 -5.183719e-02 0.07349166
## [3,] -2.563060e-02 -8.379866e-02 -1.169869e-02 0.14680861
## [4,] -9.154239e-03 3.658475e-02 -6.734432e-02 0.04759121
## [5,] 3.402082e-03 -3.576098e-02 -3.628542e-02 0.06655383
## [6,] -1.110223e-16 -1.395533e-02 -2.185437e-02 0.05645876
## [7,] -1.395533e-02 2.220446e-16 7.497350e-02 -0.03808680
## [8,] -2.185437e-02 7.497350e-02 4.440892e-16 -0.03181577
## [9,] 5.645876e-02 -3.808680e-02 -3.181577e-02 0.00000000
En este conjunto de datos ocurre algo particular:
\[ \operatorname{Cor}(\mathbf{S}_{\text{cov}}) = \operatorname{Cor}(\mathbf{S}_{\text{lav}}). \]
Esto se debe a que \(\mathbf{S}_{\text{cov}}\) y \(\mathbf{S}_{\text{lav}}\) difieren únicamente por un factor escalar global, dado por:
\[ \mathbf{S}_{\text{cov}} = \frac{N}{N-1}\,\mathbf{S}_{\text{lav}}. \]
Al transformar una matriz de covarianzas a correlaciones, dicho factor escalar se cancela automáticamente, ya que la estandarización divide cada elemento por las desviaciones estándar correspondientes. Por esta razón, en este caso se obtiene que las matrices de correlaciones residuales coinciden:
\[ \mathbf{R}_{\text{cor,cov}} = \mathbf{R}_{\text{cor,lav}}. \]
En particular, la matriz residual en escala de correlaciones es la misma independientemente de si se parte de \(\mathbf{S}_{\text{cov}}\) o de \(\mathbf{S}_{\text{lav}}\), y corresponde a la discrepancia entre la correlaciones observadas y las correlaciones implicadas por el modelo.
\[ \mathbf{R}_{\text{cor, cov}} = \mathbf{R}_{\text{cor, lav}} = \begin{pmatrix} 0.000 & -0.030 & -0.008 & 0.071 & -0.009 & 0.060 & -0.140 & -0.039 & 0.149 \\ -0.030 & 0.000 & 0.094 & -0.012 & -0.027 & 0.030 & -0.189 & -0.052 & 0.073 \\ -0.008 & 0.094 & 0.000 & -0.068 & -0.151 & -0.026 & -0.084 & -0.012 & 0.147 \\ 0.071 & -0.012 & -0.068 & 0.000 & 0.005 & -0.009 & 0.037 & -0.067 & 0.048 \\ -0.009 & -0.027 & -0.151 & 0.005 & 0.000 & 0.003 & -0.036 & -0.036 & 0.067 \\ 0.060 & 0.030 & -0.026 & -0.009 & 0.003 & 0.000 & -0.014 & -0.022 & 0.056 \\ -0.140 & -0.189 & -0.084 & 0.037 & -0.036 & -0.014 & 0.000 & 0.075 & -0.038 \\ -0.039 & -0.052 & -0.012 & -0.067 & -0.036 & -0.022 & 0.075 & 0.000 & -0.032 \\ 0.149 & 0.073 & 0.147 & 0.048 & 0.067 & 0.056 & -0.038 & -0.032 & 0.000 \end{pmatrix}. \]
A continuación se destacan los residuales más relevantes, considerando su valor absoluto.
\[ r_{7,2} = -0.189, \qquad r_{7,1} = -0.140, \qquad r_{9,1} = 0.149, \qquad r_{9,3} = 0.147, \qquad r_{5,3} = -0.151. \]
Estos valores superan claramente el umbral de \(0.10\), lo que sugiere:
Asociaciones entre ítems no explicadas por los factores latentes,
Posibles cargas cruzadas no especificadas, o
La necesidad de introducir covarianzas residuales entre esos ítems.
\[ r_{3,2} = 0.094, \qquad r_{4,1} = 0.071, \qquad r_{8,7} = 0.075. \]
Estos valores no son alarmantes, pero merecen inspección, especialmente si existe una justificación teórica para una relación adicional entre los ítems involucrados.
La mayoría de los residuales presentan valores cercanos a cero, por ejemplo:
\[ r_{6,5} = 0.003, \qquad r_{4,5} = 0.005, \qquad r_{3,1} = -0.008. \]
Estos pares de ítems están adecuadamente explicados por el modelo CFA ajustado, lo que indica un buen ajuste local en dichas relaciones.
residuals): en escala de correlaciones (no z), sin estandarizarresiduals() en lavaanHasta ahora, las matrices de correlaciones residuales se han construido explícitamente como una resta de matrices:
\[ \mathbf{R}_{\text{cor}} = \operatorname{Cor}(\mathbf{S}) - \operatorname{Cor}(\boldsymbol{\Sigma}). \]
Sin embargo, cuando se trabaja con modelos CFA ajustados con lavaan, no es necesario realizar este cálculo manualmente. El paquete proporciona una forma directa de obtener estas discrepancias en escala de correlaciones.
residuals() en lavaanLa función residuals() del paquete lavaan calcula los residuos del modelo ajustado, es decir, las discrepancias entre las relaciones observadas en los datos y las relaciones implicadas por el modelo CFA. La opción type = "cor" solicita explícitamente que dichas discrepancias se expresen en escala de correlaciones y permite evaluar el ajuste local del modelo de forma comparable entre pares de ítems.. Esta es la misma escala definida anteriormente mediante la transformación: \(\operatorname{Cor}(\mathbf{A}) = \mathbf{D}_{\mathbf{A}}^{-1/2}\, \mathbf{A}\, \mathbf{D}_{\mathbf{A}}^{-1/2}\), donde \(\mathbf{D}_{\mathbf{A}}\) es la matriz diagonal que contiene las varianzas (asociadas a los elementos diagonales de \(\mathbf{A}\)).
# Correlaciones residuales reportadas directamente por lavaan
residuals(CFA, type = "cor")
## $type
## [1] "cor.bollen"
##
## $cov
## x1 x2 x3 x4 x5 x6 x7 x8 x9
## x1 0.000
## x2 -0.030 0.000
## x3 -0.008 0.094 0.000
## x4 0.071 -0.012 -0.068 0.000
## x5 -0.009 -0.027 -0.151 0.005 0.000
## x6 0.060 0.030 -0.026 -0.009 0.003 0.000
## x7 -0.140 -0.189 -0.084 0.037 -0.036 -0.014 0.000
## x8 -0.039 -0.052 -0.012 -0.067 -0.036 -0.022 0.075 0.000
## x9 0.149 0.073 0.147 0.048 0.067 0.056 -0.038 -0.032 0.000
El componente ...$cov permite extraer específicamente la matriz de covarianzas residuales a partir del objeto devuelto por residuals().
# Correlaciones residuales reportadas directamente por lavaan
R_cor <- residuals(CFA, type = "cor")$cov
R_cor
## x1 x2 x3 x4 x5 x6 x7 x8 x9
## x1 0.000
## x2 -0.030 0.000
## x3 -0.008 0.094 0.000
## x4 0.071 -0.012 -0.068 0.000
## x5 -0.009 -0.027 -0.151 0.005 0.000
## x6 0.060 0.030 -0.026 -0.009 0.003 0.000
## x7 -0.140 -0.189 -0.084 0.037 -0.036 -0.014 0.000
## x8 -0.039 -0.052 -0.012 -0.067 -0.036 -0.022 0.075 0.000
## x9 0.149 0.073 0.147 0.048 0.067 0.056 -0.038 -0.032 0.000
Se observa que \(\mathbf{R}_{\text{cor}}\) es la misma matriz hallada anteriormente (\(\mathbf{R}_{\text{cor,cov}}\) y \(\mathbf{R}_{\text{cor,lav}}\)).
resid en lavaanImportante (distinción clave):
Las matrices \(\mathbf{R}_{\text{cor,cov}}\) y \(\mathbf{R}_{\text{cor,lav}}\) están expresadas en escala de correlaciones (valores entre \(-1\) y \(1\)), pero no corresponden a residuos estandarizados tipo z. Los residuos tipo z, que incorporan además una normalización por la variabilidad esperada bajo el modelo, se explicarán en la sección siguiente. Estos últimos son los más apropiados cuando se desea evaluar la magnitud del misfit local en términos de desviaciones estándar.
resid(fit, type = "standardized")
resid): en escala de correlaciones estandarizada (normalizada)residLas funciones resid() y residuals() en lavaan devuelven los residuos del modelo ajustado, es decir, las discrepancias entre lo observado en los datos y lo implicado por el modelo. La matriz devuelta por resid(CFA, type = "standardized") corresponde a una versión estandarizada (normalizada) de los residuos de covarianzas del modelo.
resid(CFA, type="standardized")
## $type
## [1] "standardized"
##
## $cov
## x1 x2 x3 x4 x5 x6 x7 x8 x9
## x1 0.000
## x2 -1.996 0.000
## x3 -0.997 2.689 0.000
## x4 2.679 -0.284 -1.899 0.000
## x5 -0.359 -0.591 -4.157 1.545 0.000
## x6 2.155 0.681 -0.711 -2.588 0.942 0.000
## x7 -3.773 -3.654 -1.858 0.865 -0.842 -0.326 0.000
## x8 -1.380 -1.119 -0.300 -2.021 -1.099 -0.641 4.823 0.000
## x9 4.077 1.606 3.518 1.225 1.701 1.423 -2.325 -4.132 0.000
En términos matriciales, puede escribirse como:
\[ \mathbf{R}_{\text{std}} = \mathbf{D}^{-1/2} \left( \mathbf{S} - \boldsymbol{\Sigma} \right) \mathbf{D}^{-1/2}, \]
donde \(\mathbf{D}\) es una matriz de escalamiento que depende de las varianzas de las variables observadas y del estimador utilizado (en este caso, máxima verosimilitud, ML). Cada elemento de \(\mathbf{R}_{\text{std}}\) indica cuántas desviaciones estándar separan la covarianza observada entre dos ítems de la covarianza predicha por el modelo.
¿Qué es la matriz \(\mathbf{D}\)?
En la expresión anterior, la matriz \(\mathbf{D}\) es una matriz de escalamiento que recoge la variabilidad esperada de las covarianzas bajo el modelo ajustado. En el caso del estimador de máxima verosimilitud (ML), \(\mathbf{D}\) se construye a partir de:
Las varianzas de las variables observadas, y
La matriz de información del modelo, de modo que cada residuo quede expresado en unidades de desviación estándar.
Por esta razón, los residuos estandarizados no son simplemente \((\mathbf{S}-\boldsymbol{\Sigma})\) divididos elemento a elemento por las varianzas, sino una normalización estadísticamente informada, coherente con el estimador utilizado.
resid(...)$covEn este caso, con ...$cov se obtiene la matriz de residuos estandarizados:
R_std <- resid(CFA, type="standardized")$cov
R_std
## x1 x2 x3 x4 x5 x6 x7 x8 x9
## x1 0.000
## x2 -1.996 0.000
## x3 -0.997 2.689 0.000
## x4 2.679 -0.284 -1.899 0.000
## x5 -0.359 -0.591 -4.157 1.545 0.000
## x6 2.155 0.681 -0.711 -2.588 0.942 0.000
## x7 -3.773 -3.654 -1.858 0.865 -0.842 -0.326 0.000
## x8 -1.380 -1.119 -0.300 -2.021 -1.099 -0.641 4.823 0.000
## x9 4.077 1.606 3.518 1.225 1.701 1.423 -2.325 -4.132 0.000
\[ \mathbf{R}_{\text{std}} = \begin{pmatrix} 0.000 & -1.996 & -0.997 & 2.679 & -0.359 & 2.155 & -3.773 & -1.380 & 4.077 \\ -1.996 & 0.000 & 2.689 & -0.284 & -0.591 & 0.681 & -3.654 & -1.119 & 1.606 \\ -0.997 & 2.689 & 0.000 & -1.899 & -4.157 & -0.711 & -1.858 & -0.300 & 3.518 \\ 2.679 & -0.284 & -1.899 & 0.000 & 1.545 & -2.588 & 0.865 & -2.021 & 1.225 \\ -0.359 & -0.591 & -4.157 & 1.545 & 0.000 & 0.942 & -0.842 & -1.099 & 1.701 \\ 2.155 & 0.681 & -0.711 & -2.588 & 0.942 & 0.000 & -0.326 & -0.641 & 1.423 \\ -3.773 & -3.654 & -1.858 & 0.865 & -0.842 & -0.326 & 0.000 & 4.823 & -2.325 \\ -1.380 & -1.119 & -0.300 & -2.021 & -1.099 & -0.641 & 4.823 & 0.000 & -4.132 \\ 4.077 & 1.606 & 3.518 & 1.225 & 1.701 & 1.423 & -2.325 & -4.132 & 0.000 \end{pmatrix}. \]
Aunque todas estas matrices se basan en la misma discrepancia fundamental \(\mathbf{S} - \boldsymbol{\Sigma}\), cada una utiliza una escala distinta. En particular, los residuos estandarizados son especialmente útiles para el diagnóstico de misfit local, ya que permiten identificar relaciones entre ítems cuya covarianza observada se aparta del modelo en más de dos o tres desviaciones estándar. En consecuencia, \(\mathbf{R}_{\text{std}}\) permite evaluar el misfit local en una escala comparable entre pares de ítems, algo que no es posible usando directamente \(\mathbf{S}-\boldsymbol{\Sigma}\).
Compare las cuatro matrices que se describen abajo:
R_std = resid(CFA, type = "standardized")$cov es la matriz \(\mathbf{R}_{\text{std}}\) que contiene residuos estandarizados (valores tipo z).R_std
R_cor = residuals(CFA, type = "cor")$cov es la matriz \(\mathbf{R}_{\text{cor}}\) que contiene los residuos expresados en escala de correlaciones.R_cor
## x1 x2 x3 x4 x5 x6 x7 x8 x9
## x1 0.000
## x2 -0.030 0.000
## x3 -0.008 0.094 0.000
## x4 0.071 -0.012 -0.068 0.000
## x5 -0.009 -0.027 -0.151 0.005 0.000
## x6 0.060 0.030 -0.026 -0.009 0.003 0.000
## x7 -0.140 -0.189 -0.084 0.037 -0.036 -0.014 0.000
## x8 -0.039 -0.052 -0.012 -0.067 -0.036 -0.022 0.075 0.000
## x9 0.149 0.073 0.147 0.048 0.067 0.056 -0.038 -0.032 0.000
type = "standardized".R_cov
## x1 x2 x3 x4 x5 x6 x7 x8 x9
## x1 0.005
## x2 -0.039 0.005
## x3 -0.008 0.126 0.004
## x4 0.098 -0.016 -0.089 0.005
## x5 -0.012 -0.040 -0.219 0.011 0.006
## x6 0.078 0.039 -0.031 -0.009 0.008 0.004
## x7 -0.177 -0.242 -0.103 0.047 -0.050 -0.016 0.004
## x8 -0.045 -0.061 -0.013 -0.079 -0.047 -0.024 0.084 0.003
## x9 0.176 0.088 0.168 0.057 0.087 0.063 -0.040 -0.031 0.003
type = "standardized".R_lav
## x1 x2 x3 x4 x5 x6 x7 x8 x9
## x1 0.000
## x2 -0.041 0.000
## x3 -0.010 0.124 0.000
## x4 0.097 -0.017 -0.090 0.000
## x5 -0.014 -0.040 -0.219 0.008 0.000
## x6 0.077 0.038 -0.032 -0.012 0.005 0.000
## x7 -0.177 -0.242 -0.103 0.046 -0.050 -0.017 0.000
## x8 -0.046 -0.062 -0.013 -0.079 -0.047 -0.024 0.082 0.000
## x9 0.175 0.087 0.167 0.056 0.086 0.062 -0.042 -0.032 0.000
inspect)El código.
inspect(CFA, "est")
attach(inspect(CFA, "est"))
#lambda #cargas factoriales
#theta #varianzas residuales
psi #covarianzas entre los factores
El otuput.
## visual textul speed
## visual 0.809
## textual 0.408 0.979
## speed 0.262 0.173 0.384
En este caso, se obtiene:
\[ \boldsymbol{\Psi} = \begin{pmatrix} 0.809 & 0.408 & 0.262 \\ 0.408 & 0.979 & 0.173 \\ 0.262 & 0.173 & 0.384 \end{pmatrix} \]
El código.
parameterEstimates(CFA, standardized=TRUE) %>%
filter(op == "~~",
lhs %in% c("visual", "textual", "speed"),
!is.na(pvalue)) %>%
mutate(stars = ifelse(pvalue < .001, "***",
ifelse(pvalue < .01, "**",
ifelse(pvalue < .05, "*", "")))) %>%
select('Factor 1'=lhs,
'Factor 2'=rhs,
'Correlación'=est,
'Sig.'=stars) %>%
kable(digits = 3, align="c", format="pandoc", caption="Covarianzas entre los factores")
El output.
| Factor 1 | Factor 2 | Correlación | Sig. |
|---|---|---|---|
| visual | visual | 0.809 | *** |
| textual | textual | 0.979 | *** |
| speed | speed | 0.384 | *** |
| visual | textual | 0.408 | *** |
| visual | speed | 0.262 | *** |
| textual | speed | 0.173 | *** |
El código.
m <- inspect(CFA, 'fit.measures'); m #1. Todas las medidas
m <- fitMeasures(CFA); m #2. Igual que el anterior
El output.
## npar fmin chisq
## 21.000 0.142 85.306
## df pvalue baseline.chisq
## 24.000 0.000 918.852
## baseline.df baseline.pvalue cfi
## 36.000 0.000 0.931
## tli nnfi rfi
## 0.896 0.896 0.861
## nfi pnfi ifi
## 0.907 0.605 0.931
## rni logl unrestricted.logl
## 0.931 -3737.745 -3695.092
## aic bic ntotal
## 7517.490 7595.339 301.000
## bic2 rmsea rmsea.ci.lower
## 7528.739 0.092 0.071
## rmsea.ci.upper rmsea.ci.level rmsea.pvalue
## 0.114 0.900 0.001
## rmsea.close.h0 rmsea.notclose.pvalue rmsea.notclose.h0
## 0.050 0.840 0.080
## rmr rmr_nomean srmr
## 0.082 0.082 0.065
## srmr_bentler srmr_bentler_nomean crmr
## 0.065 0.065 0.073
## crmr_nomean srmr_mplus srmr_mplus_nomean
## 0.073 0.065 0.065
## cn_05 cn_01 gfi
## 129.490 152.654 0.943
## agfi pgfi mfi
## 0.894 0.503 0.903
## ecvi
## 0.423
El código.
lista <- c("chisq", "df", "cfi", "rmsea", "srmr", "mfi", "bic", "nfi")
lista
ms<-fitMeasures(CFA)[lista]; ms #3. Lista específica de medidas
ms<-fitMeasures(CFA, lista); ms #4. Igual que el anterior
ms<-round(ms,3); ms
El output.
## [1] "chisq" "df" "cfi" "rmsea" "srmr" "mfi" "bic" "nfi"
## chisq df cfi rmsea srmr mfi bic nfi
## 85.306 24.000 0.931 0.092 0.065 0.903 7595.339 0.907
En general, los modelos de ecuaciones estructurales se utilizan para modelar la matriz de covarianza de las variables observadas en un conjunto de datos.
No obstante, en algunas aplicaciones, es útil incluir también las medias de las variables observadas.
Para lograr esto, se pueden especificar explícitamente los interceptos en la sintaxis de lavaan.
Esto se realiza incluyendo “fórmulas de intercepto” en la sintaxis del modelo. Una fórmula de intercepto tiene el siguiente formato:
variable ~ 1
Por ejemplo, en el modelo de análisis factorial confirmatorio (CFA) de tres factores de Holzinger y Swineford, podemos añadir los interceptos de las variables observadas de la siguiente manera:
El modelo.
# Ejemplo de sintaxis en lavaan con interceptos
visual =~ x1 + x2 + x3
textual =~ x4 + x5 + x6
speed =~ x7 + x8 + x9
x1 ~ 1
x2 ~ 1
x3 ~ 1
x4 ~ 1
x5 ~ 1
x6 ~ 1
x7 ~ 1
x8 ~ 1
x9 ~ 1
meanstructuremeanstructure: explicaciónA veces, es más conveniente omitir las fórmulas de intercepto en la sintaxis del modelo (a menos que desee sus valores), y añadir el argumento meanstructure = TRUE en las llamadas a las funciones cfa y sem.
meanstructure: ejemploEl código.
fit <- cfa(modelo, data=dat, meanstructure=TRUE)
summary(fit)
El output.
## lavaan 0.6-19 ended normally after 35 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 30
##
## 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
##
## Intercepts:
## Estimate Std.Err z-value P(>|z|)
## .x1 4.936 0.067 73.473 0.000
## .x2 6.088 0.068 89.855 0.000
## .x3 2.250 0.065 34.579 0.000
## .x4 3.061 0.067 45.694 0.000
## .x5 4.341 0.074 58.452 0.000
## .x6 2.186 0.063 34.667 0.000
## .x7 4.186 0.063 66.766 0.000
## .x8 5.527 0.058 94.854 0.000
## .x9 5.374 0.058 92.546 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
meanstructure: InterpretaciónComo puede observar en el resultado, el modelo incluye parámetros de intercepción tanto para las variables observadas como para las latentes.
Por defecto, las funciones cfa y sem fijan los interceptos de las variables latentes (que en este caso corresponden a las medias latentes) a cero.
De otro modo, el modelo no sería estimable.
Cabe destacar que el estadístico chi-cuadrado y el número de grados de libertad son los mismos que en el modelo original (sin estructura de medias).
Esto se debe a que, aunque hemos añadido nuevos datos (un valor medio para cada una de las 9 variables observadas), también hemos introducido 9 parámetros adicionales al modelo (un intercepto para cada una de las 9 variables observadas).
El resultado final es un ajuste idéntico.
En la práctica, la única razón para que un usuario añada fórmulas de intercepción en la sintaxis del modelo es para especificar ciertas restricciones necesarias en el modelo.
Por ejemplo, revise la situación que se indica a continuación.
meanstructure: fijando interceptosPor ejemplo, supongamos que deseamos x los interceptos de las variables x1, x2, x3 y x4 a, digamos, 0.5. Escribiríamos la sintaxis del modelo como sigue:
El modelo.
# Modelo de tres factores
modelo.fix <- '
visual =~ x1 + x2 + x3
textual =~ x4 + x5 + x6
speed =~ x7 + x8 + x9
# Interceptos con valores fijos
x1 + x2 + x3 + x4 ~ 0.5*1
'
Observación.
Arriba hemos utilizado el lado izquierdo de la fórmula para «repetir» el lado derecho para cada elemento del lado izquierdo.
Ejecutando CFA.
CFA.fix <- cfa(modelo.fix, data=dat)
summary(CFA.fix)
## lavaan 0.6-19 ended normally after 113 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 26
##
## Number of observations 301
##
## Model Test User Model:
##
## Test statistic 1120.542
## Degrees of freedom 28
## 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 1.224 0.020 59.759 0.000
## x3 0.405 0.013 30.933 0.000
## textual =~
## x4 1.000
## x5 1.065 0.020 53.504 0.000
## x6 0.890 0.017 51.989 0.000
## speed =~
## x7 1.000
## x8 1.183 0.061 19.433 0.000
## x9 1.050 0.058 18.154 0.000
##
## Covariances:
## Estimate Std.Err z-value P(>|z|)
## visual ~~
## textual 11.800 1.007 11.720 0.000
## speed 5.152 0.500 10.296 0.000
## textual ~~
## speed 2.995 0.298 10.040 0.000
##
## Intercepts:
## Estimate Std.Err z-value P(>|z|)
## .x1 0.500
## .x2 0.500
## .x3 0.500
## .x4 0.500
## .x5 1.625 0.050 32.530 0.000
## .x6 -0.083 0.043 -1.932 0.053
## .x7 3.083 0.061 50.440 0.000
## .x8 4.222 0.056 75.567 0.000
## .x9 4.216 0.056 75.038 0.000
##
## Variances:
## Estimate Std.Err z-value P(>|z|)
## .x1 0.442 0.105 4.214 0.000
## .x2 1.757 0.208 8.439 0.000
## .x3 0.964 0.083 11.677 0.000
## .x4 0.355 0.045 7.915 0.000
## .x5 0.463 0.055 8.479 0.000
## .x6 0.361 0.041 8.891 0.000
## .x7 0.791 0.076 10.380 0.000
## .x8 0.473 0.061 7.730 0.000
## .x9 0.582 0.062 9.389 0.000
## visual 20.593 1.717 11.993 0.000
## textual 7.554 0.645 11.713 0.000
## speed 1.610 0.189 8.510 0.000
vcovLa función vcov retorna la matriz de covarianzas estimada de los parámetros libres estimados del modelo. Formalmente:
No es una matriz de datos.
No es una matriz de covarianzas entre ítems.
Es la matriz de covarianzas del vector de estimadores.
Si denotamos por
\[ \widehat{\boldsymbol{\theta}} = (\widehat{\theta}_1, \widehat{\theta}_2, \ldots, \widehat{\theta}_p)^\top \]
el vector de parámetros estimados del modelo (cargas factoriales, varianzas, covarianzas, entre otros), entonces la matriz de varianzas-covarianzas de los estimadores está dada por:
\[ \operatorname{vcov}(\widehat{\boldsymbol{\theta}}) = \operatorname{Var}(\widehat{\boldsymbol{\theta}}). \]
REl código.
vcov(CFA)
El output.
## vsl=~2 vsl=~3 txt=~5 txt=~6 spd=~8 spd=~9 x1~~x1 x2~~x2 x3~~x3
## visual=~x2 0.010
## visual=~x3 0.004 0.012
## textual=~x5 0.000 0.000 0.004
## textual=~x6 0.000 0.000 0.002 0.003
## speed=~x8 0.000 0.000 0.000 0.000 0.027
## speed=~x9 0.000 0.000 0.000 0.000 0.014 0.023
## x1~~x1 0.005 0.008 0.000 0.000 0.000 0.000 0.013
## x2~~x2 -0.002 -0.001 0.000 0.000 0.000 0.000 -0.001 0.010
## x3~~x3 -0.001 -0.004 0.000 0.000 0.000 0.000 -0.003 0.000 0.008
## x4~~x4 0.000 0.000 0.001 0.001 0.000 0.000 0.000 0.000 0.000
## x5~~x5 0.000 0.000 -0.001 0.000 0.000 0.000 0.000 0.000 0.000
## x6~~x6 0.000 0.000 0.000 -0.001 0.000 0.000 0.000 0.000 0.000
## x7~~x7 0.000 0.000 0.000 0.000 0.005 0.004 0.000 0.000 0.000
## x8~~x8 0.000 0.000 0.000 0.000 -0.006 0.001 0.000 0.000 0.000
## x9~~x9 0.000 0.000 0.000 0.000 0.001 -0.004 0.000 0.000 0.000
## visual~~visual -0.007 -0.010 0.000 0.000 0.000 0.000 -0.011 0.001 0.003
## textual~~textual 0.000 0.000 -0.004 -0.003 0.000 0.000 0.000 0.000 0.000
## speed~~speed 0.000 0.000 0.000 0.000 -0.011 -0.009 0.000 0.000 0.000
## visual~~textual -0.001 -0.002 -0.001 -0.001 0.000 0.000 -0.001 0.000 0.001
## visual~~speed -0.001 -0.001 0.000 0.000 -0.004 -0.003 -0.001 0.000 0.000
## textual~~speed 0.000 0.000 0.000 0.000 -0.003 -0.002 0.000 0.000 0.000
## x4~~x4 x5~~x5 x6~~x6 x7~~x7 x8~~x8 x9~~x9 vsl~~v txtl~~t
## visual=~x2
## visual=~x3
## textual=~x5
## textual=~x6
## speed=~x8
## speed=~x9
## x1~~x1
## x2~~x2
## x3~~x3
## x4~~x4 0.002
## x5~~x5 -0.001 0.003
## x6~~x6 0.000 0.000 0.002
## x7~~x7 0.000 0.000 0.000 0.007
## x8~~x8 0.000 0.000 0.000 -0.001 0.006
## x9~~x9 0.000 0.000 0.000 0.000 -0.002 0.005
## visual~~visual 0.000 0.000 0.000 0.000 0.000 0.000 0.021
## textual~~textual -0.001 0.001 0.000 0.000 0.000 0.000 0.001 0.013
## speed~~speed 0.000 0.000 0.000 -0.002 0.001 0.000 0.000 0.000
## visual~~textual 0.000 0.000 0.000 0.000 0.000 0.000 0.005 0.004
## visual~~speed 0.000 0.000 0.000 -0.001 0.001 0.000 0.003 0.000
## textual~~speed 0.000 0.000 0.000 -0.001 0.000 0.000 0.001 0.002
## spd~~s vsl~~t vsl~~s txtl~~s
## visual=~x2
## visual=~x3
## textual=~x5
## textual=~x6
## speed=~x8
## speed=~x9
## x1~~x1
## x2~~x2
## x3~~x3
## x4~~x4
## x5~~x5
## x6~~x6
## x7~~x7
## x8~~x8
## x9~~x9
## visual~~visual
## textual~~textual
## speed~~speed 0.007
## visual~~textual 0.000 0.005
## visual~~speed 0.003 0.001 0.003
## textual~~speed 0.002 0.001 0.001 0.002
Con respecto a la estructura de la matriz tenemos:
Filas y columnas: corresponden a los parámetros estimados del modelo (por ejemplo, visual=~x2, x1~~x1, visual~~textual, etc.).
Diagonal: contiene las varianzas de los estimadores,
\[ \operatorname{Var}(\widehat{\theta}_i), \]
cuya raíz cuadrada corresponde al error estándar del estimador:
\[ \operatorname{SE}(\widehat{\theta}_i) = \sqrt{\operatorname{Var}(\widehat{\theta}_i)}. \]
\[ \operatorname{Cov}(\widehat{\theta}_i, \widehat{\theta}_j), \]
las cuales indican dependencia estadística entre los estimadores, un fenómeno habitual en modelos de ecuaciones estructurales (SEM).
AIC y BICEl código y la salida.
El comando de abajo extrae y presenta de forma conjunta dos criterios de información ampliamente utilizados para la comparación de modelos: el Akaike Information Criterion (AIC) y el Bayesian Information Criterion (BIC).
cbind(AIC(CFA), BIC(CFA))
## [,1] [,2]
## [1,] 7517.49 7595.339
Claves de interpretación
Valores más pequeños de AIC o BIC indican un mejor compromiso entre ajuste y parsimonia.
AIC penaliza la complejidad de manera más suave y es preferido cuando el objetivo es comparar modelos predictivos.
BIC impone una penalización más fuerte, especialmente en muestras grandes, y tiende a favorecer modelos más parsimoniosos.
Estos criterios no se interpretan de forma absoluta, sino relativa: solo tienen sentido al comparar dos o más modelos ajustados a los mismos datos.
Observaciones importantes
En este caso, los valores reportados de AIC y BIC constituyen una línea base que puede utilizarse para comparar este modelo CFA con modelos alternativos (por ejemplo, modelos con restricciones adicionales o modelos más complejos).
AIC y BIC permiten comparar modelos CFA considerando simultáneamente su ajuste a los datos y su complejidad, favoreciendo aquellos que explican mejor la estructura observada con el menor número de parámetros.
parameterEstimatesEl código y la salida.
Aquí, parameterEstimates(CFA) devuelve una tabla con las estimaciones y los estadísticos de inferencia asociados a cada parámetro del modelo.
parameterEstimates(CFA)
## lhs op rhs est se z pvalue ci.lower ci.upper
## 1 visual =~ x1 1.000 0.000 NA NA 1.000 1.000
## 2 visual =~ x2 0.554 0.100 5.554 0 0.358 0.749
## 3 visual =~ x3 0.729 0.109 6.685 0 0.516 0.943
## 4 textual =~ x4 1.000 0.000 NA NA 1.000 1.000
## 5 textual =~ x5 1.113 0.065 17.014 0 0.985 1.241
## 6 textual =~ x6 0.926 0.055 16.703 0 0.817 1.035
## 7 speed =~ x7 1.000 0.000 NA NA 1.000 1.000
## 8 speed =~ x8 1.180 0.165 7.152 0 0.857 1.503
## 9 speed =~ x9 1.082 0.151 7.155 0 0.785 1.378
## 10 x1 ~~ x1 0.549 0.114 4.833 0 0.326 0.772
## 11 x2 ~~ x2 1.134 0.102 11.146 0 0.934 1.333
## 12 x3 ~~ x3 0.844 0.091 9.317 0 0.667 1.022
## 13 x4 ~~ x4 0.371 0.048 7.779 0 0.278 0.465
## 14 x5 ~~ x5 0.446 0.058 7.642 0 0.332 0.561
## 15 x6 ~~ x6 0.356 0.043 8.277 0 0.272 0.441
## 16 x7 ~~ x7 0.799 0.081 9.823 0 0.640 0.959
## 17 x8 ~~ x8 0.488 0.074 6.573 0 0.342 0.633
## 18 x9 ~~ x9 0.566 0.071 8.003 0 0.427 0.705
## 19 visual ~~ visual 0.809 0.145 5.564 0 0.524 1.094
## 20 textual ~~ textual 0.979 0.112 8.737 0 0.760 1.199
## 21 speed ~~ speed 0.384 0.086 4.451 0 0.215 0.553
## 22 visual ~~ textual 0.408 0.074 5.552 0 0.264 0.552
## 23 visual ~~ speed 0.262 0.056 4.660 0 0.152 0.373
## 24 textual ~~ speed 0.173 0.049 3.518 0 0.077 0.270
Como se indicó previamente, a continuación se describen únicamente aquellas columnas que no aparecen directamente en parTable() o que no se reportan allí como resultados inferenciales. En este output, dichas columnas son las siguientes:
se (standard error): corresponde al error estándar de la estimación est. Mide la incertidumbre asociada al estimador y se obtiene a partir de la matriz de varianzas–covarianzas de los estimadores:\[ \operatorname{SE}(\widehat{\theta}_i) = \sqrt{\operatorname{Var}(\widehat{\theta}_i)}. \]
z: estadístico de Wald para contrastar la hipótesis nula \(H_0: \theta = 0\), definido como:\[ z = \frac{\widehat{\theta}}{\operatorname{SE}(\widehat{\theta})}. \]
Si se = 0 (como ocurre en parámetros fijados por identificación), el valor de \(z\) no está definido y se reporta como NA.
pvalue: valor-\(p\) asociado al test de Wald bajo una aproximación normal. Indica la evidencia estadística contra la hipótesis nula \(H_0: \theta = 0\). Valores pequeños sugieren que el parámetro es significativamente distinto de cero.
ci.lower, ci.upper: límites inferior y superior del intervalo de confianza (por defecto, típicamente del 95%), que suele calcularse como:
\[ \widehat{\theta} \pm z_{0.975}\,\operatorname{SE}(\widehat{\theta}). \]
Cuando el intervalo de confianza no contiene el valor cero, el resultado es consistente con un valor-\(p\) pequeño en el test bilateral.
Notas rápidas sobre la tabla:
Las cargas factoriales fijadas a 1 por razones de identificación (por ejemplo, visual =~ x1) presentan se = 0, por lo que los estadísticos z y pvalue aparecen como NA, y el intervalo de confianza se reduce al valor \([1,\,1]\).
Para las cargas factoriales y covarianzas libres, se observan valores grandes del estadístico \(z\) y valores-\(p\) cercanos a cero, lo que indica que estos parámetros son significativamente distintos de cero.
standardizedSolutionEl código y la salida.
La función standardizedSolution() presenta las estimaciones de los parámetros en escala estandarizada, lo que permite interpretar directamente la magnitud relativa de las relaciones del modelo, independientemente de las unidades de medida originales.
A diferencia de parameterEstimates(), el énfasis aquí recae en la columna est.std, que contiene los parámetros completamente estandarizados.
standardizedSolution(CFA)
## lhs op rhs est.std se z pvalue ci.lower ci.upper
## 1 visual =~ x1 0.772 0.055 14.041 0 0.664 0.880
## 2 visual =~ x2 0.424 0.060 7.105 0 0.307 0.540
## 3 visual =~ x3 0.581 0.055 10.539 0 0.473 0.689
## 4 textual =~ x4 0.852 0.023 37.776 0 0.807 0.896
## 5 textual =~ x5 0.855 0.022 38.273 0 0.811 0.899
## 6 textual =~ x6 0.838 0.023 35.881 0 0.792 0.884
## 7 speed =~ x7 0.570 0.053 10.714 0 0.465 0.674
## 8 speed =~ x8 0.723 0.051 14.309 0 0.624 0.822
## 9 speed =~ x9 0.665 0.051 13.015 0 0.565 0.765
## 10 x1 ~~ x1 0.404 0.085 4.763 0 0.238 0.571
## 11 x2 ~~ x2 0.821 0.051 16.246 0 0.722 0.920
## 12 x3 ~~ x3 0.662 0.064 10.334 0 0.537 0.788
## 13 x4 ~~ x4 0.275 0.038 7.157 0 0.200 0.350
## 14 x5 ~~ x5 0.269 0.038 7.037 0 0.194 0.344
## 15 x6 ~~ x6 0.298 0.039 7.606 0 0.221 0.374
## 16 x7 ~~ x7 0.676 0.061 11.160 0 0.557 0.794
## 17 x8 ~~ x8 0.477 0.073 6.531 0 0.334 0.620
## 18 x9 ~~ x9 0.558 0.068 8.208 0 0.425 0.691
## 19 visual ~~ visual 1.000 0.000 NA NA 1.000 1.000
## 20 textual ~~ textual 1.000 0.000 NA NA 1.000 1.000
## 21 speed ~~ speed 1.000 0.000 NA NA 1.000 1.000
## 22 visual ~~ textual 0.459 0.064 7.189 0 0.334 0.584
## 23 visual ~~ speed 0.471 0.073 6.461 0 0.328 0.613
## 24 textual ~~ speed 0.283 0.069 4.117 0 0.148 0.418
Interpretación de la salida
est.std: estimación estandarizada del parámetro. En el caso de las cargas factoriales, representa la correlación entre el
ítem observado y el factor latente. Valores cercanos a 1 indican una relación fuerte, mientras que valores bajos indican una contribución débil del ítem al factor.
Para las varianzas residuales estandarizadas (x_i ~~ x_i), est.std representa la proporción de varianza no explicada del ítem. Valores más pequeños indican que el factor explica una mayor proporción de la varianza del ítem.
En las covarianzas entre factores latentes, los valores estandarizados pueden interpretarse como correlaciones latentes, facilitando la comparación de la fuerza de asociación entre factores.
fitted.valuesEn lavaan, la función fitted.values() permite obtener los valores ajustados del modelo, expresados en términos de las matrices implícitas que el modelo estima internamente. En particular, cuando se aplica a un objeto de clase lavaan (como CFA), esta función devuelve una lista que incluye la matriz de covarianzas implícita del modelo ajustado.
Es importante señalar que, en el contexto de lavaan, las funciones fitted() y fitted.values() son equivalentes en su contenido: ambas devuelven los valores ajustados del modelo. En particular:
fitted(fit)$cov y fitted.values(fit)$cov proporcionan la misma matriz de covarianzas implícita, denotada por \({\boldsymbol{\Sigma}}\).
Cuando el modelo incluye medias o interceptos, los componentes fitted(fit)$mean y fitted.values(fit)$mean devuelven el vector de medias implícitas del modelo.
Esta equivalencia explica por qué, al utilizar fitted.values(CFA), se obtiene exactamente la misma matriz de covarianzas que con fitted(CFA)$cov.
El código.
fitted.values(CFA)
El output.
## $cov
## x1 x2 x3 x4 x5 x6 x7 x8 x9
## x1 1.358
## x2 0.448 1.382
## x3 0.590 0.327 1.275
## x4 0.408 0.226 0.298 1.351
## x5 0.454 0.252 0.331 1.090 1.660
## x6 0.378 0.209 0.276 0.907 1.010 1.196
## x7 0.262 0.145 0.191 0.173 0.193 0.161 1.183
## x8 0.309 0.171 0.226 0.205 0.228 0.190 0.453 1.022
## x9 0.284 0.157 0.207 0.188 0.209 0.174 0.415 0.490 1.015
Es decir, se obtiene la matriz de covarianzas implícita del modelo:
\[ \boldsymbol{\Sigma} = \boldsymbol{\Lambda}\boldsymbol{\Psi}\boldsymbol{\Lambda}^\top + \boldsymbol{\Theta} = \begin{pmatrix} 1.358 & 0.448 & 0.590 & 0.408 & 0.454 & 0.378 & 0.262 & 0.309 & 0.284 \\ 0.448 & 1.382 & 0.327 & 0.226 & 0.252 & 0.209 & 0.145 & 0.171 & 0.157 \\ 0.590 & 0.327 & 1.275 & 0.298 & 0.331 & 0.276 & 0.191 & 0.226 & 0.207 \\ 0.408 & 0.226 & 0.298 & 1.351 & 1.090 & 0.907 & 0.173 & 0.205 & 0.188 \\ 0.454 & 0.252 & 0.331 & 1.090 & 1.660 & 1.010 & 0.193 & 0.228 & 0.209 \\ 0.378 & 0.209 & 0.276 & 0.907 & 1.010 & 1.196 & 0.161 & 0.190 & 0.174 \\ 0.262 & 0.145 & 0.191 & 0.173 & 0.193 & 0.161 & 1.183 & 0.453 & 0.415 \\ 0.309 & 0.171 & 0.226 & 0.205 & 0.228 & 0.190 & 0.453 & 1.022 & 0.490 \\ 0.284 & 0.157 & 0.207 & 0.188 & 0.209 & 0.174 & 0.415 & 0.490 & 1.015 \end{pmatrix}. \]
Observación pedagógica.
El uso de fitted.values() en lavaan no es erróneo. Sin embargo, es importante destacar una diferencia conceptual con otros modelos en R:
En modelos de regresión clásicos (por ejemplo, lm o glm), fitted.values() suele devolver valores ajustados del vector respuesta
\(\hat{y}\).
En modelos SEM implementados con lavaan, fitted.values() está definido como un método específico para objetos lavaan* y devuelve las matrices implícitas del modelo (covarianzas y, cuando corresponde, medias).
Por esta razón, aunque fitted() y fitted.values() producen el mismo resultado en este contexto, el uso explícito de fitted.values() puede resultar útil para enfatizar que se están recuperando los valores ajustados del modelo, y no predicciones individuales a nivel de observación.
En la Figura 41.1 se muestra una lista de funciones para inspeccionar modelos ajustados.
Figure 41.1: Funciones de extracción para inspeccionar modelos ajustados
En la Figura 41.2 se muestra una lista de funciones para inspeccionar modelos ajustados.
Figure 41.2: Otras funciones especiales
Para profundizar en los temas de invarianza de medida, y en particular en la invarianza de medias latentes, se recomienda consultar los siguientes recursos, que abordan tanto la teoría como su implementación práctica.
Teoría: Click derecho aquí.
Aplicación: Click derecho aquí.
Considere el siguiente conjunto de datos que contiene 100 observaciones y 2 variables:
El número de horas que se suelen dedicar a las matemáticas (MathHomework)
La puntuación en un test estandarizado de rendimiento de matemática (MathAchievement).
# Crear el dataframe en R
MathHmwk.data <- data.frame(
MathHomework = c(2, 0, 4, 0, 2, 0, 1, 0, 3, 0, 4, 7, 3, 1, 1, 0, 3, 0, 1, 3, 3, 0, 2, 0, 1, 4, 1, 4, 3, 1, 1, 3, 3, 5, 2, 5, 1, 3, 2, 2, 0, 2, 5, 0, 2, 2, 1, 2, 1, 4, 0, 0, 4, 10, 1, 1, 2, 2, 1, 2, 2, 1, 2, 2, 3, 2, 0, 0, 3, 2, 5, 5, 1, 0, 0, 2, 2, 3, 0, 2, 4, 0, 3, 1, 2, 3, 4, 4, 4, 2, 1, 6, 3, 5, 6, 4, 3, 2, 2, 1),
MathAchievement = c(54, 53, 53, 56, 59, 30, 49, 54, 37, 49, 55, 50, 45, 44, 60, 36, 53, 22, 56, 54, 75, 37, 42, 64, 61, 57, 53, 63, 75, 53, 54, 64, 54, 59, 48, 65, 57, 48, 54, 62, 53, 61, 56, 32, 50, 44, 62, 39, 61, 51, 36, 38, 38, 59, 46, 55, 48, 54, 41, 61, 52, 63, 25, 64, 72, 65, 41, 29, 39, 70, 68, 38, 59, 29, 49, 39, 45, 74, 41, 53, 71, 41, 63, 34, 61, 51, 62, 55, 64, 47, 48, 47, 44, 52, 50, 48, 58, 39, 41, 51)
)
# Ver el dataframe
head(MathHmwk.data)
## MathHomework MathAchievement
## 1 2 54
## 2 0 53
## 3 4 53
## 4 0 56
## 5 2 59
## 6 0 30
La pregunta de interés es: ¿El tiempo dedicado a los deberes de matemáticas está directamente relacionado con el rendimiento en matemáticas?
Dibuje un diagrama de dispersión entre ambas variables.
Realice una regresión típica estandarizado y no estandarizado, utilizando la función lm. Sugerencia: Para la no estandarizada aplique la función scale a ambos conjuntos de datos y haga la regresión.
Dibuje un path model estandarizado y no estandarizado de la regresión.
Realice el análisis como un path model en lavaan utilizando la función sem. Obtenga tanto los coeficientes estandarizados como los no estandarizados. Sugerencia: Para no estandarizado use el argumento meanstructure = TRUE.
¿Cómo se relacionan los resultados de los incisos (b) y (d)?
Page y Keith (1981) utilizaron encuestados de los datos de 1980 High School and Beyond para investigar la siguiente pregunta: ¿Cuál es la relación entre el tipo de escuela y el rendimiento académico? Los datos aparecen en la Figura 43.1 en forma de matriz de correlaciones. En la Figura 43.2 se muestra un path model para los análisis.
El código R para la matriz es:
library(lavaan)
privSchool.cor <- c(1, 0.178, 0.23, 0.106, 0.195, 1, 0.327, 0.245, 0.356, 1, 0.183, 0.721, 1, 0.178, 1)
privSchool.cor <- lav_matrix_upper2full(privSchool.cor)
#privSchool.cor <- lav_matrix_lower2full(privSchool.cor)
dimnames(privSchool.cor) <- list(c("Race", "SES", "CogAbil", "SchTyp", "AcadAch"), c("Race", "SES", "CogAbil", "SchTyp", "AcadAch"))
privSchool.cor
## Race SES CogAbil SchTyp AcadAch
## Race 1.000 0.178 0.230 0.106 0.195
## SES 0.178 1.000 0.327 0.245 0.356
## CogAbil 0.230 0.327 1.000 0.183 0.721
## SchTyp 0.106 0.245 0.183 1.000 0.178
## AcadAch 0.195 0.356 0.721 0.178 1.000
Figure 43.1: Correlaciones (n = 18,058)
El path model es:
Figure 43.2: Path model
Crear el modelo de trayectorias utilizando lavaan. Asegúrese de etiquetar los mismos parámetros que en la Figura 43.2.
Realizar el análisis de path model correspondiente. Interprete todos los resultados posibles.
¿Cuál es la relación entre el tipo de escuela y el rendimiento académico (es decir, camino j)?
MacKinnon (2008, p. 113) proporciona un conjunto de datos de un estudio hipotético sobre las expectativas de los profesores respecto al rendimiento de los alumnos. y el rendimiento de los alumnos. Su modelo de trayectoria se muestra en la Figura Figura 43.3 y las covarianzas del modelo se indican en la Figura 43.4.
El path model es:
Figure 43.3: Path model
El código R para la matriz de covarianzas es:
library(lavaan)
privSchool.cor <- c(1, 0.178, 0.23, 0.106, 0.195, 1, 0.327, 0.245, 0.356, 1, 0.183, 0.721, 1, 0.178, 1)
privSchool.cor <- lav_matrix_upper2full(privSchool.cor)
#privSchool.cor <- lav_matrix_lower2full(privSchool.cor)
dimnames(privSchool.cor) <- list(c("Race", "SES", "CogAbil", "SchTyp", "AcadAch"), c("Race", "SES", "CogAbil", "SchTyp", "AcadAch"))
privSchool.cor
## Race SES CogAbil SchTyp AcadAch
## Race 1.000 0.178 0.230 0.106 0.195
## SES 0.178 1.000 0.327 0.245 0.356
## CogAbil 0.230 0.327 1.000 0.183 0.721
## SchTyp 0.106 0.245 0.183 1.000 0.178
## AcadAch 0.195 0.356 0.721 0.178 1.000
Figure 43.4: Covarianzas (n = 40)
Introduzca las covarianzas en R.
Escriba la sintaxis del modelo. Utilice el operador := para definir los dos efectos indirectos de las expectativas del profesor sobre el rendimiento del alumno: (a1)(b1) y (a2)(b2).
¿Cuáles son los efectos indirectos?
Realice el análisis de path model correspondiente.
Interprete todos los resultados posibles.
Umstattd-Meyer, Janke y Beaujean (2013) midieron la salud psicosocial deficiente como un modelo de factor único utilizando tres facetas de ítems de un cuestionario de depresión y una medida de la actividad social. La matriz de covarianza se muestra en la Figura 43.5.
Figure 43.5: Covarianzas (n = 6053)
Además, considere el siguiente modelo.
Modelo 1.
marker.model <- '
PsychSocLV =~ Dep.1 + Dep.2 + Dep.3 + SocActivity
'
Realizar los siguientes incisos:
Introduzca la matriz de covarianzas en R.
Con la función cfa de lavaan (sin agregar el argumento std.lv=...) y utilizando variables latentes no estandarizadas, ajuste el modelo 1. Sugerencia: use el código habitual de cfa.
Con la función cfa de lavaan (agregando el argumento std.lv=FALSE) y utilizando variables latentes no estandarizadas, ajuste el modelo 1. Sugerencia: use el código habitual de cfa con el argumento mencionado.
Con la función cfa de lavaan y utilizando variables latentes estandarizadas, ajuste el modelo 1. Sugerencia: use el código habitual de cfa agregando el argumento std.lv=TRUE.
Verifique que los valores resultantes de \(\chi^2\) y \(df\) son idénticos para todos los métodos. Investigue la razón.
¿Y el número de parámetros del model? ¿Son iguales en todos los modelos? Identifíquelos en cada uno de ellos.
Continuación del ejercicio 4. Considere la situación del ejercicio 4 y los siguientes dos modelos (modelos 2 y 3).
Modelo 2.
Observe que, en este modelo, se utiliza Depression 1 como variable marcadora.
stdLV.model <- '
PsychSocLV =~ NA*Dep.1 + Dep.1 + Dep.2 + Dep.3 + SocActivity
PsychSocLV~~1*PsychSocLV
'
Modelo 3.
Observe que, en este modelo, se utiliza:
Como variable marcadora a Depression 1.
El método de la codificación de efectos (porque la suma de las cargas factoriales es igual al número de variables indicadoras únicas).
ec.model <- '
PsychSocLV =~ NA*Dep.1 + a*Dep.1 + b*Dep.2 + c*Dep.3 + d*SocActivity
a+b+c+d==4
'
Realizar los siguientes incisos:
Con la función cfa de lavaan (sin agregar el argumento std.lv=...), ajuste el modelo 2. Sugerencia: use el código habitual de cfa.
Con la función cfa de lavaan (sin agregar el argumento std.lv=...), ajuste el modelo 3. Sugerencia: use el código habitual de cfa.
Verifique que los valores resultantes de \(\chi^2\) y \(df\) son idénticos para todos los métodos evaluados tanto en el ejercicio 4 como en el 5. Investigue la razón.
¿Y el número de parámetros del modelo? ¿Son iguales en todos los modelos? Identifíquelos en cada uno de ellos.
El modelo del Ejercicio anterior formaba parte de un SEM más amplio, parte del cual se muestra en la Figura 43.6. La matriz de covarianza completa se muestra en la Figura 43.7.
Figure 43.6: Path model
La matriz de covarianzas es:
Figure 43.7: Covarianzas (n = 6053)
Introduzca la matriz de covarianza en R.
Ajuste el modelo SEM a los datos. ¿La salud psicosocial y la salud física predicen la movilidad personal? Sugerencia: aplique la función sem de lavaan.
Graham (2008) mostró cómo el SEM puede utilizarse para analizar una variedad de modelos lineales generales. lineales generales. Su ejemplo de análisis descriptivo discriminante (DDA) utiliza variables latentes formativas. El DDA es un procedimiento que describe las diferencias entre múltiples grupos en múltiples descriptores continuos: una regresión múltiple entre dos o más grupos. En DDA, la variable latente de interés se denomina función discriminante. Un path model del DDA se muestra en la Figura 43.8 y los datos para el modelo se dan en la Figura 43.9.
El path model es:
Figure 43.8: Path model del DDA
La matriz de covarianzas es:
Figure 43.9: Covarianzas (n = 288)
Realizar los siguientes incisos:
Importe a R la matriz de covarianzas y el vector de medias.
Escriba la sintaxis lavaan para la Figura 43.8. Sugerencia: el path a=1 se escribe como 1*DV1 + a*DV1 en la sintaxis de lavaan.
Obtenga los coeficientes de función (coeficientes estandarizados para a y b), correlación canónica (coeficiente estandarizado para c), y \(R^2\) (coeficiente normalizado para d). Sugerencia: aplique la función sem de lavaan.
Consultar el documento RPubs :: Análisis multivariado (bibliografía).
Graham, J. M. (2008). The general linear model as structural equation modeling. Journal of Educational and Behavioral Statistics, 33 , 485-506. doi: 10.3102/1076998607306151.
MacKinnon, D. P. (2008). Introduction to statistical mediation analysis. Mahwah, NJ: Erlbaum.
Page, E. B., & Keith, T. Z. (1981). Effects of U.S. private schools: A technical analysis of two recent claims. Educational Researcher, 10 , 7-17. doi: 10.2307/1174256.
Umstattd-Meyer, M. R., Janke, M. C., & Beaujean, A. A. (2013). Predictors of older adults’ personal and community mobility: Using a comprehensive theoretical mobility framework. The Gerontologist, Advance online publication. doi: 10.1093/geront/gnt054.
If you found any ERRORS or have SUGGESTIONS, please report them to my email. Thanks.