Es necesario instalar la libreria PsyMetricTools desde github.
if (!require("devtools")) {
install.packages("devtools")
}
devtools::install_github("jventural/PsyMetricTools")
Instalar la libreria “pacman”
install.packages("pacman")
La biblioteca “pacman” es una herramienta que, al utilizar la función
p_load
, permite instalar automáticamente una biblioteca si
no está previamente instalada, y simplemente cargarla si ya está
presente en el entorno. La función que se utiliza en la libreria
PsyMetricTools se basa en los codigos de la libreria careless
pacman::p_load(psych,EGAnet,tidyverse,dplyr,gridExtra,ggplot2,PsyMetricTools,psychonetrics,qgraph)
El conjunto de datos psych::bfi
(que contiene datos de
personalidad del Big Five Inventory) se carga y se convierte en un
tibble (as_tibble()
), luego se eliminan las filas que
contienen valores faltantes (na.omit()
). Finalmente, se
selecciona la variable género, que será la variable de comparación.
# data
big5 <- psych::bfi %>%
as_tibble() %>%
na.omit() %>%
dplyr::select(A1:gender)
El código aplica un Análisis de Variables Únicas (UVA) al conjunto de
datos big5
, con el objetivo de identificar y eliminar ítems
redundantes y evaluar la dimensionalidad de la estructura de los datos.
Primero, ejecuta la función UVA
sobre los datos
big5
, generando un objeto que contiene varios elementos,
incluyendo los datos reducidos. Luego, extrae estos datos reducidos y
los convierte en un tibble mediante as_tibble
para
facilitar su manipulación y análisis posterior. Este proceso es crucial
en la validación y optimización de cuestionarios de personalidad
utilizando modelos de redes psicométricas, como se detalla en la
literatura sobre validación estructural y dimensionalidad de
cuestionarios de personalidad.
bfi_uva <- UVA(big5)
bfi_reduced <- bfi_uva$reduced_data %>% as_tibble
Primero, se crea un nuevo dataset bfi_reduced_2
que
contiene únicamente los ítems del cuestionario seleccionados desde A1
hasta O5, extraídos de bfi_reduced
. Luego, se ejecuta el
modelo EGA (Análisis Exploratorio de Grafos) utilizando la función
EGA
. En esta ejecución, se especifica que los datos
provienen de bfi_reduced_2
, se usa la correlación de
Spearman (corr = "spearman"
), el modelo gráfico es “glasso”
(Graphical Least Absolute Shrinkage and Selection Operator), y el
algoritmo de detección de comunidades es “louvain”. Además, se habilita
la opción de generar un gráfico del análisis
(plot.EGA = TRUE
). Finalmente, se imprime el resultado del
análisis ega.bfi
, que proporciona una visualización y
resumen de la estructura dimensional de los ítems del cuestionario de
personalidad, ayudando a identificar cómo se agrupan los ítems en
diferentes dimensiones o factores.
#Un data con solo los items
bfi_reduced_2 <- bfi_reduced %>% dplyr::select(A1:O5)
# Correr el modelo EGA
ega.bfi <- EGA(
data = bfi_reduced_2,
corr = "spearman",
model = "glasso",
algorithm = "louvain",
plot.EGA = TRUE
)
ega.bfi
## Model: GLASSO (EBIC with gamma = 0.5)
## Correlations: spearman
## Lambda: 0.0545134327168727 (n = 100, ratio = 0.1)
##
## Number of nodes: 24
## Number of edges: 128
## Edge density: 0.464
##
## Non-zero edge weights:
## M SD Min Max
## 0.035 0.107 -0.246 0.365
##
## ----
##
## Consensus Method: Most Common (1000 iterations)
## Algorithm: Louvain
## Order: Higher
##
## Number of communities: 5
##
## A1 A2 A3 A4 A5 C1 C2 C3 C4 C5 E1 E2 E3 E4 E5 N2 N3 N4 N5 O1 O2 O3 O4 O5
## 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 5 5 5 5 5
##
## ----
##
## Unidimensional Method: Louvain
## Unidimensional: No
##
## ----
##
## TEFI: -25.124
Primero, se ejecuta el Análisis Exploratorio de Grafos con bootstrap
(bootEGA) sobre el conjunto de datos bfi_reduced_2
, que
contiene únicamente los ítems seleccionados del cuestionario. Se
especifica que la correlación a utilizar es de Spearman
(corr = "spearman"
), el modelo gráfico es “glasso”
(Graphical Least Absolute Shrinkage and Selection Operator), y el
algoritmo de detección de comunidades es “louvain”. El análisis se
repite 1000 veces (iter = 1000
) para asegurar la
estabilidad de los resultados, se establece una semilla para la
reproducibilidad (seed = 2024
), y se especifica que se
utilizará el tipo de muestreo “resampling” y 12 núcleos de procesamiento
para la computación paralela (ncores = 12
). Después de
ejecutar el análisis, se extrae la información relacionada con la
consistencia estructural del modelo, específicamente la consistencia
estructural de las dimensiones identificadas
(boot.bfi$stability$dimension.stability$structural.consistency
).
Este proceso permite evaluar la robustez y estabilidad de la estructura
dimensional obtenida a través del EGA, proporcionando una medida
cuantitativa de cuán consistentemente se identifican las dimensiones en
los datos a través de múltiples iteraciones de muestreo.
# Correr el bootEGA primero
boot.bfi <- bootEGA(
data = bfi_reduced_2,
corr = "spearman",
model = "glasso",
algorithm = "louvain",
iter = 1000,
seed = 2024,
type = "resampling",
ncores = 12
)
# Extraer la información de la consistencia estructural
boot.bfi$stability$dimension.stability$structural.consistency
## 1 2 3 4 5
## 0.998 1.000 0.873 1.000 1.000
Después de ejecutar el Análisis Exploratorio de Grafos (EGA) y
obtener el objeto ega.bfi
, se utilizan las cargas de red
para evaluar la contribución de cada ítem a las dimensiones
identificadas en el modelo. La función net.loads(ega.bfi)
calcula estas cargas de red, proporcionando una medida de la importancia
de cada ítem dentro de su respectiva dimensión. Las cargas de red son
equivalentes a las cargas factoriales en un análisis factorial, pero en
el contexto de un modelo de red, representan la influencia de cada ítem
en la estructura general de la red. Este paso es crucial para
interpretar la estructura dimensional en términos de la relevancia de
cada ítem, ayudando a entender mejor cómo cada ítem contribuye a las
dimensiones psicológicas identificadas en el análisis de red.
# Network loadings
net.loads(ega.bfi)
## Loading Method: BRM
##
## 1 2 3 4 5
## A3 0.378
## A2 0.363
## A5 0.22 0.179
## A4 0.162
## A1 -0.17
## C2 0.299
## C1 0.258
## C3 0.256
## C5 -0.248 0.108
## C4 -0.361
## E4 0.193 0.253
## E3 0.139 0.189 0.157
## E5 0.126 0.176
## E1 -0.238
## E2 -0.319 0.102
## N3 0.443
## N2 0.289
## N4 -0.105 0.273
## N5 0.232
## O3 0.139 0.304
## O1 0.104 0.247
## O4 0.173
## O2 -0.216
## O5 -0.303
## Standardized loadings >= |0.10| are displayed. To change this 'minimum', use `print(net.loads_object, minimum = 0.10)`
Primero, se define una función para crear la matriz de carga de
factores Lambda
con 24 ítems y 5 factores, utilizando la
función Matrix_lambda
. Los nombres de los factores y sus
respectivos tamaños se definen en los vectores names
y
values
, y se agrupan usando la función
create_groups
. Luego, se crea una matriz diagonal
Sigma_epsilon
con varianzas iguales a 1 para 25 variables.
Las variables observadas se obtienen de bfi_reduced_2
y las
latentes se especifican manualmente. Se ajusta un modelo de gráficos
gaussianos (GGM) utilizando la función lvm
, con la matriz
de carga Lambda
, las variables observadas
obsvars
, y las latentes latents
, junto con la
matriz de varianzas residuales Sigma_epsilon
. Las
estimaciones de los parámetros y las medidas de ajuste del modelo se
obtienen y se muestran usando las funciones parameters
y
fit
. Luego, se extraen y muestran las métricas del modelo
CFA usando la función extraer_metricas
. Se calculan los
índices de modificación con MIs
. Posteriormente, se ajusta
un modelo modificado liberando parámetros específicos en
sigma_epsilon
y se compara con el modelo original.
Finalmente, se visualizan los resultados mediante gráficos de cargas y
redes latentes utilizando la función plot_lvm
, mostrando la
estructura de las cargas y las relaciones latentes en los gráficos
resultantes.
# Función para crear la matriz de carga de factores
Lambda <- Matrix_lambda(n_items = 24,
factores = 5,
n_tamanos = c(5, 5, 5, 4, 5))
print(Lambda)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 0 0 0 0
## [2,] 1 0 0 0 0
## [3,] 1 0 0 0 0
## [4,] 1 0 0 0 0
## [5,] 1 0 0 0 0
## [6,] 0 1 0 0 0
## [7,] 0 1 0 0 0
## [8,] 0 1 0 0 0
## [9,] 0 1 0 0 0
## [10,] 0 1 0 0 0
## [11,] 0 0 1 0 0
## [12,] 0 0 1 0 0
## [13,] 0 0 1 0 0
## [14,] 0 0 1 0 0
## [15,] 0 0 1 0 0
## [16,] 0 0 0 1 0
## [17,] 0 0 0 1 0
## [18,] 0 0 0 1 0
## [19,] 0 0 0 1 0
## [20,] 0 0 0 0 1
## [21,] 0 0 0 0 1
## [22,] 0 0 0 0 1
## [23,] 0 0 0 0 1
## [24,] 0 0 0 0 1
# Ejemplo de uso de la función con nombres y valores específicos
names <- c("agree", "conscientious", "extraversion", "neuroticism", "openness")
values <- c(5, 5, 5, 4, 5)
groups <- create_groups(names, values)
# Crear la matriz diagonal con varianzas iguales a 1
n_vars <- 25
Sigma_epsilon <- diag(1, n_vars, n_vars)
print(Sigma_epsilon)
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
## [1,] 1 0 0 0 0 0 0 0 0 0 0 0 0
## [2,] 0 1 0 0 0 0 0 0 0 0 0 0 0
## [3,] 0 0 1 0 0 0 0 0 0 0 0 0 0
## [4,] 0 0 0 1 0 0 0 0 0 0 0 0 0
## [5,] 0 0 0 0 1 0 0 0 0 0 0 0 0
## [6,] 0 0 0 0 0 1 0 0 0 0 0 0 0
## [7,] 0 0 0 0 0 0 1 0 0 0 0 0 0
## [8,] 0 0 0 0 0 0 0 1 0 0 0 0 0
## [9,] 0 0 0 0 0 0 0 0 1 0 0 0 0
## [10,] 0 0 0 0 0 0 0 0 0 1 0 0 0
## [11,] 0 0 0 0 0 0 0 0 0 0 1 0 0
## [12,] 0 0 0 0 0 0 0 0 0 0 0 1 0
## [13,] 0 0 0 0 0 0 0 0 0 0 0 0 1
## [14,] 0 0 0 0 0 0 0 0 0 0 0 0 0
## [15,] 0 0 0 0 0 0 0 0 0 0 0 0 0
## [16,] 0 0 0 0 0 0 0 0 0 0 0 0 0
## [17,] 0 0 0 0 0 0 0 0 0 0 0 0 0
## [18,] 0 0 0 0 0 0 0 0 0 0 0 0 0
## [19,] 0 0 0 0 0 0 0 0 0 0 0 0 0
## [20,] 0 0 0 0 0 0 0 0 0 0 0 0 0
## [21,] 0 0 0 0 0 0 0 0 0 0 0 0 0
## [22,] 0 0 0 0 0 0 0 0 0 0 0 0 0
## [23,] 0 0 0 0 0 0 0 0 0 0 0 0 0
## [24,] 0 0 0 0 0 0 0 0 0 0 0 0 0
## [25,] 0 0 0 0 0 0 0 0 0 0 0 0 0
## [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25]
## [1,] 0 0 0 0 0 0 0 0 0 0 0 0
## [2,] 0 0 0 0 0 0 0 0 0 0 0 0
## [3,] 0 0 0 0 0 0 0 0 0 0 0 0
## [4,] 0 0 0 0 0 0 0 0 0 0 0 0
## [5,] 0 0 0 0 0 0 0 0 0 0 0 0
## [6,] 0 0 0 0 0 0 0 0 0 0 0 0
## [7,] 0 0 0 0 0 0 0 0 0 0 0 0
## [8,] 0 0 0 0 0 0 0 0 0 0 0 0
## [9,] 0 0 0 0 0 0 0 0 0 0 0 0
## [10,] 0 0 0 0 0 0 0 0 0 0 0 0
## [11,] 0 0 0 0 0 0 0 0 0 0 0 0
## [12,] 0 0 0 0 0 0 0 0 0 0 0 0
## [13,] 0 0 0 0 0 0 0 0 0 0 0 0
## [14,] 1 0 0 0 0 0 0 0 0 0 0 0
## [15,] 0 1 0 0 0 0 0 0 0 0 0 0
## [16,] 0 0 1 0 0 0 0 0 0 0 0 0
## [17,] 0 0 0 1 0 0 0 0 0 0 0 0
## [18,] 0 0 0 0 1 0 0 0 0 0 0 0
## [19,] 0 0 0 0 0 1 0 0 0 0 0 0
## [20,] 0 0 0 0 0 0 1 0 0 0 0 0
## [21,] 0 0 0 0 0 0 0 1 0 0 0 0
## [22,] 0 0 0 0 0 0 0 0 1 0 0 0
## [23,] 0 0 0 0 0 0 0 0 0 1 0 0
## [24,] 0 0 0 0 0 0 0 0 0 0 1 0
## [25,] 0 0 0 0 0 0 0 0 0 0 0 1
# Definir variables observadas y latentes
obsvars <- colnames(bfi_reduced_2)
latents <- c("agree", "conscientious", "extraversion", "neuroticism", "openness")
# Crear y ajustar el modelo GGM
mod <- lvm(bfi_reduced_2,
lambda = Lambda,
vars = obsvars,
identification = "variance",
latent = "ggm", residual = "ggm",
latents = latents,
sigma_epsilon = Sigma_epsilon) %>% runmodel()
# Estimaciones de los parámetros
mod %>% parameters
##
## Parameters for group fullsample
## - nu
## var1 op var2 est se p row col par
## A1 ~1 2.37 0.029 < 0.0001 1 1 1
## A2 ~1 4.83 0.024 < 0.0001 2 1 2
## A3 ~1 4.63 0.027 < 0.0001 3 1 3
## A4 ~1 4.75 0.031 < 0.0001 4 1 4
## A5 ~1 4.58 0.027 < 0.0001 5 1 5
## C1 ~1 4.57 0.026 < 0.0001 6 1 6
## C2 ~1 4.40 0.028 < 0.0001 7 1 7
## C3 ~1 4.32 0.027 < 0.0001 8 1 8
## C4 ~1 2.50 0.029 < 0.0001 9 1 9
## C5 ~1 3.26 0.034 < 0.0001 10 1 10
## E1 ~1 2.97 0.034 < 0.0001 11 1 11
## E2 ~1 3.12 0.034 < 0.0001 12 1 12
## E3 ~1 4.01 0.028 < 0.0001 13 1 13
## E4 ~1 4.43 0.031 < 0.0001 14 1 14
## E5 ~1 4.42 0.028 < 0.0001 15 1 15
## N2 ~1 3.49 0.032 < 0.0001 16 1 16
## N3 ~1 3.20 0.034 < 0.0001 17 1 17
## N4 ~1 3.18 0.033 < 0.0001 18 1 18
## N5 ~1 2.95 0.034 < 0.0001 19 1 19
## O1 ~1 4.82 0.024 < 0.0001 20 1 20
## O2 ~1 2.69 0.033 < 0.0001 21 1 21
## O3 ~1 4.48 0.025 < 0.0001 22 1 22
## O4 ~1 4.95 0.025 < 0.0001 23 1 23
## O5 ~1 2.46 0.028 < 0.0001 24 1 24
##
## - lambda
## var1 op var2 est se p row col par
## A1 ~= agree -0.33 0.024 < 0.0001 1 1 25
## A2 ~= agree 0.53 0.021 < 0.0001 2 1 26
## A3 ~= agree 0.69 0.024 < 0.0001 3 1 27
## A4 ~= agree 0.52 0.025 < 0.0001 4 1 28
## A5 ~= agree 0.60 0.023 < 0.0001 5 1 29
## C1 ~= conscientious 0.57 0.025 < 0.0001 6 2 30
## C2 ~= conscientious 0.67 0.027 < 0.0001 7 2 31
## C3 ~= conscientious 0.63 0.026 < 0.0001 8 2 32
## C4 ~= conscientious -0.85 0.028 < 0.0001 9 2 33
## C5 ~= conscientious -0.91 0.033 < 0.0001 10 2 34
## E1 ~= extraversion -0.59 0.026 < 0.0001 11 3 35
## E2 ~= extraversion -0.73 0.027 < 0.0001 12 3 36
## E3 ~= extraversion 0.55 0.022 < 0.0001 13 3 37
## E4 ~= extraversion 0.67 0.025 < 0.0001 14 3 38
## E5 ~= extraversion 0.48 0.022 < 0.0001 15 3 39
## N2 ~= neuroticism 0.91 0.031 < 0.0001 16 4 40
## N3 ~= neuroticism 1.14 0.032 < 0.0001 17 4 41
## N4 ~= neuroticism 0.98 0.032 < 0.0001 18 4 42
## N5 ~= neuroticism 0.84 0.033 < 0.0001 19 4 43
## O1 ~= openness -0.55 0.025 < 0.0001 20 5 44
## O2 ~= openness 0.58 0.034 < 0.0001 21 5 45
## O3 ~= openness -0.76 0.028 < 0.0001 22 5 46
## O4 ~= openness -0.23 0.026 < 0.0001 23 5 47
## O5 ~= openness 0.56 0.029 < 0.0001 24 5 48
##
## - omega_zeta (symmetric)
## var1 op var2 est se p row col par
## conscientious -- agree 0.14 0.035 < 0.0001 2 1 49
## extraversion -- agree 0.63 0.022 < 0.0001 3 1 50
## neuroticism -- agree 0.073 0.034 0.033 4 1 51
## openness -- agree 0.083 0.038 0.027 5 1 52
## extraversion -- conscientious 0.067 0.037 0.068 3 2 53
## neuroticism -- conscientious -0.24 0.028 < 0.0001 4 2 54
## openness -- conscientious -0.17 0.033 < 0.0001 5 2 55
## neuroticism -- extraversion -0.23 0.033 < 0.0001 4 3 56
## openness -- extraversion -0.35 0.033 < 0.0001 5 3 57
## openness -- neuroticism -0.068 0.032 0.035 5 4 58
##
## - delta_zeta (diagonal)
## var1 op var2 est se p row col par
## agree ~/~ agree 1 1 1 0
## conscientious ~/~ conscientious 1 2 2 0
## extraversion ~/~ extraversion 1 3 3 0
## neuroticism ~/~ neuroticism 1 4 4 0
## openness ~/~ openness 1 5 5 0
##
## - delta_epsilon (diagonal)
## var1 op var2 est se p row col par
## A1 ~/~ A1 1.31 0.020 < 0.0001 1 1 59
## A2 ~/~ A2 0.89 0.016 < 0.0001 2 2 60
## A3 ~/~ A3 0.86 0.019 < 0.0001 3 3 61
## A4 ~/~ A4 1.25 0.021 < 0.0001 4 4 62
## A5 ~/~ A5 0.93 0.018 < 0.0001 5 5 63
## C1 ~/~ C1 1.03 0.018 < 0.0001 6 6 64
## C2 ~/~ C2 1.07 0.019 < 0.0001 7 7 65
## C3 ~/~ C3 1.08 0.019 < 0.0001 8 8 66
## C4 ~/~ C4 0.97 0.021 < 0.0001 9 9 67
## C5 ~/~ C5 1.27 0.024 < 0.0001 10 10 68
## E1 ~/~ E1 1.34 0.022 < 0.0001 11 11 69
## E2 ~/~ E2 1.15 0.022 < 0.0001 12 12 70
## E3 ~/~ E3 1.03 0.018 < 0.0001 13 13 71
## E4 ~/~ E4 1.04 0.020 < 0.0001 14 14 72
## E5 ~/~ E5 1.10 0.018 < 0.0001 15 15 73
## N2 ~/~ N2 1.17 0.022 < 0.0001 16 16 74
## N3 ~/~ N3 1.00 0.027 < 0.0001 17 17 75
## N4 ~/~ N4 1.14 0.023 < 0.0001 18 18 76
## N5 ~/~ N5 1.34 0.023 < 0.0001 19 19 77
## O1 ~/~ O1 0.93 0.018 < 0.0001 20 20 78
## O2 ~/~ O2 1.40 0.023 < 0.0001 21 21 79
## O3 ~/~ O3 0.82 0.024 < 0.0001 22 22 80
## O4 ~/~ O4 1.15 0.018 < 0.0001 23 23 81
## O5 ~/~ O5 1.17 0.020 < 0.0001 24 24 82
# Medidas de ajuste
mod %>% fit
## Measure Value
## logl -87873.47
## unrestricted.logl -86172.91
## baseline.logl -93474.73
## nvar 24
## nobs 324
## npar 82
## df 242
## objective 34.49
## chisq 3401.13
## pvalue ~ 0
## baseline.chisq 14603.63
## baseline.npar 48
## baseline.df 276
## baseline.pvalue ~ 0
## nfi 0.77
## pnfi 0.67
## tli 0.75
## nnfi 0.75
## rfi 0.73
## ifi 0.78
## rni 0.78
## cfi 0.78
## rmsea 0.076
## rmsea.ci.lower 0.074
## rmsea.ci.upper 0.079
## rmsea.pvalue ~ 0
## aic.ll 175910.95
## aic.ll2 175917.27
## aic.x 2917.13
## aic.x2 3565.13
## bic 176379.37
## bic2 176118.84
## ebic.25 176639.97
## ebic.5 176900.57
## ebic.75 177109.05
## ebic1 177421.77
# Extraer y mostrar las métricas del modelo CFA
extraer_metricas(mod %>% fit)
## Measure Value
## logl -87873.47
## unrestricted.logl -86172.91
## baseline.logl -93474.73
## nvar 24
## nobs 324
## npar 82
## df 242
## objective 34.49
## chisq 3401.13
## pvalue ~ 0
## baseline.chisq 14603.63
## baseline.npar 48
## baseline.df 276
## baseline.pvalue ~ 0
## nfi 0.77
## pnfi 0.67
## tli 0.75
## nnfi 0.75
## rfi 0.73
## ifi 0.78
## rni 0.78
## cfi 0.78
## rmsea 0.076
## rmsea.ci.lower 0.074
## rmsea.ci.upper 0.079
## rmsea.pvalue ~ 0
## aic.ll 175910.95
## aic.ll2 175917.27
## aic.x 2917.13
## aic.x2 3565.13
## bic 176379.37
## bic2 176118.84
## ebic.25 176639.97
## ebic.5 176900.57
## ebic.75 177109.05
## ebic1 177421.77
## # A tibble: 1 × 8
## Model df chisq BIC EBIC RMSEA TLI CFI
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 mod %>% fit 242 3401. 176379. 177422. 0.0764 0.749 0.780
# Indices de modificación
mod %>% MIs
##
## Top 10 modification indices:
##
## var1 op var2 est mi pmi epc matrix row col
## N4 ~= extraversion 0 154.23 < 0.0001 -0.27 lambda 18 3
## O4 ~= neuroticism 0 153.06 < 0.0001 0.32 lambda 23 4
## E3 ~= openness 0 138.86 < 0.0001 -0.36 lambda 13 5
## C5 ~= neuroticism 0 125.98 < 0.0001 0.39 lambda 10 4
## E4 ~= openness 0 125.63 < 0.0001 0.37 lambda 14 5
## C2 ~= neuroticism 0 121.92 < 0.0001 0.31 lambda 7 4
## E5 ~= conscientious 0 112.80 < 0.0001 0.30 lambda 15 2
## O4 ~= extraversion 0 111.50 < 0.0001 -0.22 lambda 23 3
## C2 -- C1 0 104.45 < 0.0001 0.27 omega_epsilon 7 6
## O3 ~= extraversion 0 103.34 < 0.0001 0.24 lambda 22 3
## group group_id
## fullsample 1
## fullsample 1
## fullsample 1
## fullsample 1
## fullsample 1
## fullsample 1
## fullsample 1
## fullsample 1
## fullsample 1
## fullsample 1
# Ajustar un modelo modificado con parámetros libres en 'sigma_epsilon'
mod2 <- mod %>%
freepar("omega_epsilon", "C2", "C1") %>%
runmodel()
# Extraer y comparar las métricas del modelo original y el modificado
mod2 %>% fit
## Measure Value
## logl -87820.72
## unrestricted.logl -86172.91
## baseline.logl -93474.73
## nvar 24
## nobs 324
## npar 83
## df 241
## objective 34.44
## chisq 3295.63
## pvalue ~ 0
## baseline.chisq 14603.63
## baseline.npar 48
## baseline.df 276
## baseline.pvalue ~ 0
## nfi 0.77
## pnfi 0.68
## tli 0.76
## nnfi 0.76
## rfi 0.74
## ifi 0.79
## rni 0.79
## cfi 0.79
## rmsea 0.075
## rmsea.ci.lower 0.073
## rmsea.ci.upper 0.078
## rmsea.pvalue ~ 0
## aic.ll 175807.45
## aic.ll2 175813.93
## aic.x 2813.63
## aic.x2 3461.63
## bic 176281.58
## bic2 176017.88
## ebic.25 176545.36
## ebic.5 176809.14
## ebic.75 177020.16
## ebic1 177336.70
extraer_metricas(mod2 %>% fit)
## Measure Value
## logl -87820.72
## unrestricted.logl -86172.91
## baseline.logl -93474.73
## nvar 24
## nobs 324
## npar 83
## df 241
## objective 34.44
## chisq 3295.63
## pvalue ~ 0
## baseline.chisq 14603.63
## baseline.npar 48
## baseline.df 276
## baseline.pvalue ~ 0
## nfi 0.77
## pnfi 0.68
## tli 0.76
## nnfi 0.76
## rfi 0.74
## ifi 0.79
## rni 0.79
## cfi 0.79
## rmsea 0.075
## rmsea.ci.lower 0.073
## rmsea.ci.upper 0.078
## rmsea.pvalue ~ 0
## aic.ll 175807.45
## aic.ll2 175813.93
## aic.x 2813.63
## aic.x2 3461.63
## bic 176281.58
## bic2 176017.88
## ebic.25 176545.36
## ebic.5 176809.14
## ebic.75 177020.16
## ebic1 177336.70
## # A tibble: 1 × 8
## Model df chisq BIC EBIC RMSEA TLI CFI
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 mod2 %>% fit 241 3296. 176282. 177337. 0.0753 0.756 0.787
# Indices de modificación
mod2 %>% MIs
##
## Top 10 modification indices:
##
## var1 op var2 est mi pmi epc matrix row col
## O4 ~= neuroticism 0 154.67 < 0.0001 0.32 lambda 23 4
## N4 ~= extraversion 0 153.26 < 0.0001 -0.27 lambda 18 3
## E3 ~= openness 0 139.60 < 0.0001 -0.37 lambda 13 5
## E4 ~= openness 0 124.99 < 0.0001 0.37 lambda 14 5
## O4 ~= extraversion 0 112.21 < 0.0001 -0.22 lambda 23 3
## N2 -- E5 0 104.52 < 0.0001 0.25 omega_epsilon 16 15
## O3 ~= extraversion 0 102.38 < 0.0001 0.24 lambda 22 3
## N3 -- N2 0 99.85 < 0.0001 0.44 omega_epsilon 17 16
## A5 ~= extraversion 0 96.52 < 0.0001 0.29 lambda 5 3
## E5 ~= conscientious 0 94.20 < 0.0001 0.28 lambda 15 2
## group group_id
## fullsample 1
## fullsample 1
## fullsample 1
## fullsample 1
## fullsample 1
## fullsample 1
## fullsample 1
## fullsample 1
## fullsample 1
## fullsample 1
# Indices de bondad de ajuste
modelo_fit1 <- mod %>% fit
## Measure Value
## logl -87873.47
## unrestricted.logl -86172.91
## baseline.logl -93474.73
## nvar 24
## nobs 324
## npar 82
## df 242
## objective 34.49
## chisq 3401.13
## pvalue ~ 0
## baseline.chisq 14603.63
## baseline.npar 48
## baseline.df 276
## baseline.pvalue ~ 0
## nfi 0.77
## pnfi 0.67
## tli 0.75
## nnfi 0.75
## rfi 0.73
## ifi 0.78
## rni 0.78
## cfi 0.78
## rmsea 0.076
## rmsea.ci.lower 0.074
## rmsea.ci.upper 0.079
## rmsea.pvalue ~ 0
## aic.ll 175910.95
## aic.ll2 175917.27
## aic.x 2917.13
## aic.x2 3565.13
## bic 176379.37
## bic2 176118.84
## ebic.25 176639.97
## ebic.5 176900.57
## ebic.75 177109.05
## ebic1 177421.77
modelo_fit2 <- mod2 %>% fit
## Measure Value
## logl -87820.72
## unrestricted.logl -86172.91
## baseline.logl -93474.73
## nvar 24
## nobs 324
## npar 83
## df 241
## objective 34.44
## chisq 3295.63
## pvalue ~ 0
## baseline.chisq 14603.63
## baseline.npar 48
## baseline.df 276
## baseline.pvalue ~ 0
## nfi 0.77
## pnfi 0.68
## tli 0.76
## nnfi 0.76
## rfi 0.74
## ifi 0.79
## rni 0.79
## cfi 0.79
## rmsea 0.075
## rmsea.ci.lower 0.073
## rmsea.ci.upper 0.078
## rmsea.pvalue ~ 0
## aic.ll 175807.45
## aic.ll2 175813.93
## aic.x 2813.63
## aic.x2 3461.63
## bic 176281.58
## bic2 176017.88
## ebic.25 176545.36
## ebic.5 176809.14
## ebic.75 177020.16
## ebic1 177336.70
# Llamada a la función comparation_metric con nombres de modelos
res_fits <- comparation_metric(Model1 = modelo_fit1, Model2 = modelo_fit2)
res_fits
## # A tibble: 2 × 7
## Model df chisq BIC RMSEA TLI CFI
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Model1 242 3401. 176379. 0.0764 0.749 0.780
## 2 Model2 241 3296. 176282. 0.0753 0.756 0.787
# Plots
plot_lvm(mod2, "loadings", groups = groups, palette = "Dark2", vsize = c(3, 12), edge.width = 2)
plot_lvm(mod2, "latents", groups = groups, vsize = 8, vsize2 = 8, edge.labels = TRUE, palette = "Dark2")
Este bloque de código evalúa la invariancia métrica en un conjunto de
datos de personalidad mediante el análisis de redes exploratorio (EGA).
Primero, se elimina la variable gender
del conjunto de
datos bfi_reduced
para crear bfi_reduced1
.
Luego, se ejecuta el análisis de invariancia con la función
invariance
, utilizando bfi_reduced1
y la
variable gender
como grupo de comparación, con una semilla
de 2024 para asegurar la reproducibilidad de los resultados. Los
resultados del análisis de invariancia se almacenan en
results
, y se extraen y muestran con
results$results
. Finalmente, se grafican los resultados del
análisis de invariancia utilizando la función plot
con dos
tipos de gráficos: p
para los valores p crudos y
p_BH
para los valores p ajustados mediante el procedimiento
de Benjamini-Hochberg, ambos con un nivel de significancia de 0.05. Este
procedimiento permite evaluar si las dimensiones latentes de los ítems
de personalidad son equivalentes entre los géneros.
bif_reduced1 <- bfi_reduced %>% dplyr::select(-gender)
results <- invariance(bif_reduced1, bfi_reduced$gender, seed = 2024)
## Testing configural invariance...
##
## Configural invariance was found with 24 variables
## Testing metric invariance...
results$results
## Membership Difference p p_BH sig Direction
## A1 1 -0.010 0.690 0.790
## A2 1 0.010 0.788 0.790
## A3 1 -0.035 0.390 0.730
## A4 1 -0.016 0.558 0.790
## A5 1 -0.077 0.020 0.288 * 2 < 1
## C1 2 -0.018 0.612 0.790
## C2 2 0.011 0.748 0.790
## C3 2 0.033 0.306 0.730
## C4 2 -0.032 0.404 0.730
## C5 2 -0.025 0.426 0.730
## E1 3 0.478 0.190 0.730
## E2 3 0.670 0.232 0.730
## E3 3 -0.372 0.128 0.730
## E4 3 -0.032 0.360 0.730
## E5 3 -0.049 0.170 0.730
## N2 4 0.011 0.690 0.790
## N3 4 -0.011 0.754 0.790
## N4 4 -0.073 0.024 0.288 * 2 < 1
## N5 4 0.015 0.588 0.790
## O1 5 -0.055 0.114 0.730
## O2 5 -0.030 0.334 0.730
## O3 5 0.013 0.744 0.790
## O4 5 -0.027 0.362 0.730
## O5 5 0.010 0.790 0.790
# Graficar los resultados del análisis de invariancia
plot(results, p_type = "p", p_value = 0.05)
plot(results, p_type = "p_BH", p_value = 0.05)
El siguiente bloque de código aplica el Análisis Exploratorio de
Grafos Jerárquico (hierEGA) a un conjunto de datos reducido y realiza un
análisis bootstrap para evaluar la estabilidad de la estructura
jerárquica identificada. Primero, se ejecuta el Análisis Exploratorio de
Grafos Jerárquico (hierEGA) sobre el conjunto de datos
bfi_reduced1
, que contiene ítems del cuestionario de
personalidad sin la variable de género. La función hierEGA
se aplica con el método de carga “BRM” y se calculan las puntuaciones de
la red (scores = "network"
). Este análisis permite
identificar las estructuras jerárquicas subyacentes en los datos,
proporcionando una visión detallada de cómo se agrupan los ítems en
dimensiones y subdimensiones. Luego, se ejecuta un análisis bootstrap
para evaluar la estabilidad de estas estructuras jerárquicas utilizando
la función bootEGA
con los mismos datos y parámetros de
hierEGA
. Se especifica que el tipo de EGA es “hierEGA”, el
método de carga es “BRM”, y las puntuaciones de la red se calculan
nuevamente. El análisis bootstrap se realiza con 20 núcleos de
procesamiento (ncores = 20
) y una semilla de 2024 para
asegurar la reproducibilidad. Este procedimiento de bootstrap implica
realizar múltiples iteraciones para evaluar la consistencia y robustez
de la estructura jerárquica identificada en el análisis inicial.
# Aplicar EGA jerárquico
BIF_hier <- hierEGA(
data = bif_reduced1,
loading.method = "BRM",
scores = "network")
## Warning: This implementation of `hierEGA` is [3;mexperimental[0m.
##
## The underlying function and/or output may change until the results have been appropriately vetted and validated.
# Aplicar EGA jerárquico con bootstrap
BIF_hier_boot <- bootEGA(
data = bif_reduced1, EGA.type = "hierEGA",
loading.method = "BRM",
scores = "network",
ncores = 20, seed = 2024
)
## Warning: This implementation of `hierEGA` is [3;mexperimental[0m.
##
## The underlying function and/or output may change until the results have been appropriately vetted and validated.
Auguie, B. (2017). gridExtra: Miscellaneous Functions for “Grid” Graphics. R package version 2.3, https://CRAN.R-project.org/package=gridExtra.
Christensen, A. P., Garrido, L. E., & Golino, H. (2023). Unique variable analysis: A network psychometrics method to detect local dependence. Multivariate Behavioral Research, 58(6), 1165-1182. https://doi.org/10.1080/00273171.2023.2194606
Epskamp, S. (2024). psychonetrics: Structural Equation Modeling and Confirmatory Network Analysis. R package version 0.12, https://CRAN.R-project.org/package=psychonetrics.
Epskamp, S., Cramer, A. O. J., Waldorp, L. J., Schmittmann, V. D., & Borsboom, D. (2012). qgraph: Network visualizations of relationships in psychometric data. Journal of Statistical Software, 48(4), 1-18.
Epskamp, S., Kruis, J., & Marsman, M. (2020). A psychometric network perspective on the validity and validation of personality. European Journal of Personality, 34(5), 645-662. https://doi.org/10.1002/per.2255
Golino, H., Jiménez, M., Garrido, L. E., & Christensen, A. P. (2024, March 19). Generalized Total Entropy Fit Index: A new fit index to compare bifactor and correlated factor structures in SEM and network psychometrics. https://doi.org/10.31234/osf.io/5g3hb
Golino, H., & Christensen, A. P. (2024). EGAnet: Exploratory Graph Analysis – A framework for estimating the number of dimensions in multivariate data using network psychometrics. R package version 2.0.5, https://r-ega.net.
Revelle, W. (2024). psych: Procedures for Psychological, Psychometric, and Personality Research. Northwestern University, Evanston, Illinois. R package version 2.4.3, https://CRAN.R-project.org/package=psych.
Ventura-León, J. (2024). PsyMetricTools [Software]. GitHub. https://github.com/jventural/PsyMetricTools
Wickham, H. (2016). ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York. ISBN 978-3-319-24277-4, https://ggplot2.tidyverse.org.
Wickham, H., Averick, M., Bryan, J., Chang, W., McGowan, L. D., François, R., Grolemund, G., Hayes, A., Henry, L., Hester, J., Kuhn, M., Pedersen, T. L., Miller, E., Bache, S. M., Müller, K., Ooms, J., Robinson, D., Seidel, D. P., Spinu, V., Takahashi, K., Vaughan, D., Wilke, C., Woo, K., & Yutani, H. (2019). Welcome to the tidyverse. Journal of Open Source Software, 4(43), 1686. https://doi.org/10.21105/joss.01686.
Wickham, H., François, R., Henry, L., & Müller, K., & Vaughan, D. (2023). dplyr: A Grammar of Data Manipulation. R package version 1.1.4, https://CRAN.R-project.org/package=dplyr.