19/06/24
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)
library(psych) #Para realizar un EFA
library(aplore3) #Base de datos para los ejemplos
library(lsm) #Base de datos para ejemplos y estimaciones del Log-verosimilitud
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
lavaan
Utilizando 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
Vamos a utilizar un conjunto de datos llamado HolzingerSwineford1939
para llevar a cabo un SEM el cual proviene del paquete lavaan
.
El conjunto de datos clásico de Holzinger y Swineford (1939) consiste en puntuaciones de pruebas de capacidad mental de niños de séptimo y octavo curso de dos grupos de colegios diferentes (Pasteur y Grant-White).
En el conjunto de datos original (disponible en el paquete MBESS
), hay puntuaciones para 26 pruebas.
Sin embargo, en la bibliografía se utiliza más un subconjunto más pequeño con 9 variables (por ejemplo, en el trabajo de Joreskog de 1969, que también utiliza sólo los 145 sujetos de la escuela Grant-White).
Nosotros utilizaremos un data frame con 301 observaciones (Pasteur=156, Grant-White=145) y 15 variables:
id
: Identificador.
sex
: Género.
ageyr
: Edad (parte en años).
agemo
: Edad (parte en meses).
school
: Escuela (Pasteur or Grant-White).
grade
: Grado.
x1
: Visual perception (percepción visual).
x2
: Cubes (cubos).
x3
: Lozenges (pastillas).
x4
: Paragraph comprehension (comprensión de parágrafos).
x5
: Sentence completion (completar oraciones).
x6
: Word meaning (significado de palabras).
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
Letras con trazos curvos: B, C, D, G, J, O, P, Q, R, S, U
Aquí x1, x2, …, x9 fueron calculadas a través de funciones de pruebas cognitivas.
datosCompleto <- lavaan::HolzingerSwineford1939
attach(datosCompleto)
names(datosCompleto)
## [1] "id" "sex" "ageyr" "agemo" "school" "grade" "x1" "x2"
## [9] "x3" "x4" "x5" "x6" "x7" "x8" "x9"
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.cases
No 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 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.
\[\alpha_1, \quad \alpha_2, \quad \alpha_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
lavaan::cfa
cfa
: ejecuciónPodemos ajustar el modelo como sigue:
CFA <- lavaan::cfa(modelo, data=dat)
CFA
## lavaan 0.6.17 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 = "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 = "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 = "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, #Se muestran o no los interceptos de variables latentes
residuals=FALSE, #Así no aparecen flechas de var. observadas
exoCov=FALSE, #Así no aparecen flechas de covarianzas de var. latentes
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 8.1 se resalta la primera parte del output de `lavaan.
Figure 8.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.17 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.001176 seconds
## Chain 1: 1000 transitions using 10 leapfrog steps per transition would take 11.76 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.363 seconds (Warm-up)
## Chain 1: 3.793 seconds (Sampling)
## Chain 1: 4.156 seconds (Total)
## Chain 1:
##
## SAMPLING FOR MODEL 'stanmarg' NOW (CHAIN 2).
## Chain 2:
## Chain 2: Gradient evaluation took 0.000389 seconds
## Chain 2: 1000 transitions using 10 leapfrog steps per transition would take 3.89 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.418 seconds (Warm-up)
## Chain 2: 3.835 seconds (Sampling)
## Chain 2: 4.253 seconds (Total)
## Chain 2:
##
## SAMPLING FOR MODEL 'stanmarg' NOW (CHAIN 3).
## Chain 3:
## Chain 3: Gradient evaluation took 0.00046 seconds
## Chain 3: 1000 transitions using 10 leapfrog steps per transition would take 4.6 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.409 seconds (Warm-up)
## Chain 3: 3.713 seconds (Sampling)
## Chain 3: 4.122 seconds (Total)
## Chain 3:
## Computing post-estimation metrics (including lvs if requested)...
## blavaan 0.5.4 ended normally after 1000 iterations
##
## Estimator BAYES
## Optimization method MCMC
## Number of model parameters 21
##
## Number of observations 301
##
## Statistic MargLogLik PPP
## Value -3805.472 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ónNLMINB
1. 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.17 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
## lavaan 0.6.17 did not run (perhaps do.fit = FALSE)?
## ** WARNING ** Estimates below are simply the starting values
##
## Estimator ML
## Optimization method SOLNP
## Number of model parameters 21
##
## Number of observations 301
cfa
: interceptoslavaan
El 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 11.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 11.1 se visualiza lo anterior.
Figure 11.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 11.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 11.3 se visualiza lo anterior.
Figure 11.3: Número de parámetros según lavaan
cfa
: segunda partelavaan
En la Figura 11.3 se resalta la segunda parte del output de lavaan
.
Figure 12.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 lavaan
summary
: 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.17 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 15.1 se puede visualizar la parte No. 1 del output de lavaan::summary
(es la misma que aparece en la Figura 8.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 15.1 se puede visualizar la parte No. 2 del output de lavaan::summary
(es la misma que aparece en la Figura 12.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.17 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 = "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 15.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 summary
lavaan::summary
.
Figure 16.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 17.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 18.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 19.1 se resalta la parte No. 6 del output de lavaan::summary
.
Figure 19.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 20.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 22.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 23.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 24.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.
inspect
inspect
: 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 uno de ellos.
inspect
: ejecuciónEl 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 output de inspect.
## $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
El output de inspect: cargas factoriales.
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
El output de inspect: varianzas residuales.
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
El output de inspect: covarianzas entre los factores.
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 what
Para 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
## 2 0.778 NA
## 3 1.107 NA
## 4 1.000 0
## 5 1.133 NA
## 6 0.924 NA
## 7 1.000 0
## 8 1.225 NA
## 9 0.854 NA
## 10 0.679 NA
## 11 0.691 NA
## 12 0.637 NA
## 13 0.675 NA
## 14 0.830 NA
## 15 0.598 NA
## 16 0.592 NA
## 17 0.511 NA
## 18 0.508 NA
## 19 0.050 NA
## 20 0.050 NA
## 21 0.050 NA
## 22 0.000 NA
## 23 0.000 NA
## 24 0.000 NA
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
lavInspect
: 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
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.
El código.
lavInspect(fit, "est")
El output.
## $lambda
## visual textul speed
## x1 1.000 0.000 0.000
## x2 0.778 0.000 0.000
## x3 1.107 0.000 0.000
## x4 0.000 1.000 0.000
## x5 0.000 1.133 0.000
## x6 0.000 0.924 0.000
## x7 0.000 0.000 1.000
## x8 0.000 0.000 1.225
## x9 0.000 0.000 0.854
##
## $theta
## x1 x2 x3 x4 x5 x6 x7 x8 x9
## x1 0.679
## x2 0.000 0.691
## x3 0.000 0.000 0.637
## x4 0.000 0.000 0.000 0.675
## x5 0.000 0.000 0.000 0.000 0.830
## x6 0.000 0.000 0.000 0.000 0.000 0.598
## x7 0.000 0.000 0.000 0.000 0.000 0.000 0.592
## x8 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.511
## x9 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.508
##
## $psi
## visual textul speed
## visual 0.05
## textual 0.00 0.05
## speed 0.00 0.00 0.05
lavInspect
: ejemplo 4Estimar la matriz de covarianzas implicada.
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
parTable
La 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.
parTable(CFA)
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
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
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 | *** |
inspect
Estos 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
La matriz de covarianzas observadas es una matriz que muestra las covarianzas entre las variables observadas en tus 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.
cov
El código.
# Calcular la matriz de covarianzas observadas
cov_matrix_observed <- round(cov(dat),3)
# Mostrar la matriz de covarianzas observadas
print(cov_matrix_observed)
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
lavTech
El código.
obs <- lavTech(CFA, "sampstat")[[1]]$cov
obs
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
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.
1. Recordar teoría
Recordemos que
\[\widehat{\Sigma} \;=\; \Lambda \;\Psi\; \Lambda^{\top} \;+\; \Theta\]
Donde:
\(\widehat{\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.
1. Cálculo en R
Sigma.hat <- lambda %*% psi %*% t(lambda) + theta
round(Sigma.hat, 3)
fitted
(primera forma)El código.
# Obtener la matriz de covarianzas implicadas
fitted_values <- fitted(CFA)
# Extraer la matriz de covarianzas implicadas
implied_cov_matrix <- fitted_values$cov
# Mostrar la matriz de covarianzas implicadas
print(implied_cov_matrix)
Explicación del código.
Se usa la función fitted(CFA)
para obtener las matrices implicadas del modelo ajustado.
Se extrae la matriz de covarianzas implicada con ...$cov
.
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
fitted
(segunda forma)implied_cov_matrix <- round(unclass(fitted(CFA)$cov),3)
implied_cov_matrix
## 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
implied_cov_matrix <- lavInspect(CFA, "sigma")
implied_cov_matrix
## 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
La matriz de covarianzas residuales muestra las diferencias entre las covarianzas observadas en los datos y las covarianzas implicadas por el modelo ajustado.
El código.
cov_table <- residuals(CFA, type = "cor")$cov #Extraer matriz de covarianzas residuales
cov_table
Explicación.
El código usa la función residuals
del paquete lavaan
para calcular las covarianzas residuales del modelo ajustado (CFA).
La opción type = "cor"
indica que se desea obtener las residuales basadas en correlaciones (covarianzas estandarizadas).
La opción ...$cov
extrae la matriz de covarianzas de estas residuales.
El output.
## 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
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
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:
\[\text{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
meanstructure
meanstructure
: 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.17 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.
## lavaan 0.6.17 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
vcov
La función vcov
retorna la matriz de covarianzas estimada de los parámetros estimados.
El 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
AIC
y BIC
El código.
cbind(AIC(CFA), BIC(CFA))
El output.
## [,1] [,2]
## [1,] 7517.49 7595.339
parameterEstimates
El código.
parameterEstimates(CFA)
El output.
## 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
standardizedSolution
La función standardizedSolution
es similar a la función parameterEstimates
pero sólo muestra las estimaciones de parámetros estandarizadas y no estandarizadas.
El código.
standardizedSolution(CFA)
El output.
## 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
fitted.values
Las funciones fitted
y fitted.values
devuelven la matriz de covarianza implícita en el modelo (ajustado) y el vector de medias de un modelo ajustado:
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
resid
Las funciones resid
o residuals
devuelven los residuos (no estandarizados) de un modelo ajustado.
Este es simplemente la diferencia entre la matriz de covarianza y el vector de media observados e implícitos.
Si el estimador es de máxima verosimilitud, también es posible obtener los residuos normalizados y estandarizados (nota: es posible que observe varios valores de NA, pero no son los mismos):
El código.
resid(CFA, type="standardized")
El output.
## $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 la Figura 38.1 se muestra una lista de funciones para inspeccionar modelos ajustados.
Figure 38.1: Funciones de extracción para inspeccionar modelos ajustados
En la Figura 38.2 se muestra una lista de funciones para inspeccionar modelos ajustados.
Figure 38.2: Otras funciones especiales
No hacer click aquí: Pendiente
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 40.1 en forma de matriz de correlaciones. En la Figura 40.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 40.1: Correlaciones (n = 18,058)
El path model es:
Figure 40.2: Path model
Crear el modelo de trayectorias utilizando lavaan
. Asegúrese de etiquetar los mismos parámetros que en la Figura 40.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 40.3 y las covarianzas del modelo se indican en la Figura 40.4.
El path model es:
Figure 40.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 40.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 40.5.
Figure 40.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 40.6. La matriz de covarianza completa se muestra en la Figura 40.7.
Figure 40.6: Path model
La matriz de covarianzas es:
Figure 40.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 40.8 y los datos para el modelo se dan en la Figura 40.9.
El path model es:
Figure 40.8: Path model del DDA
La matriz de covarianzas es:
Figure 40.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 40.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.