1 instalar la libreria PsyMetricTools

Es necesario instalar la libreria PsyMetricTools desde github.

if (!require("devtools")) {
  install.packages("devtools")
}
devtools::install_github("jventural/PsyMetricTools")

2 Cargando las librerias a utilizarse

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)

3 Carga de datos

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) 

4 Pasos para la validación desde redes

4.1 Análisis de variables únicas y redundancia

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

4.2 Validación de la estructura interna

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

4.3 Consistencia estructural

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

4.4 Cargas de red

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)`

4.5 Evaluación de la validez externa

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")

4.6 Invarianza

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)

4.7 Modelo Jerarquico

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 experimental. 
## 
## 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 experimental. 
## 
## The underlying function and/or output may change until the results have been appropriately vetted and validated.

5 Referencias

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.