if (!require("devtools")) {
install.packages("devtools")
}
devtools::install_github("jventural/ThesiStats")
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.
pacman::p_load(tidyverse,ggplot2,psych,PsyMetricTools,ThesiStats,readxl)
En esta sección del código, estamos cargando la base de datos para la tesis desde un archivo de Excel. El archivo, llamado df_tesis.xlsx, contiene los datos que necesitamos para realizar nuestro análisis. Utilizamos la función read_excel() del paquete readxl para leer el archivo de Excel. Esta función es muy útil porque maneja eficientemente la lectura de datos de Excel y convierte las hojas de cálculo en data frames de R, que son estructuras de datos que facilitan el análisis posterior.
df <- read_excel("df_tesis.xlsx")
Primero, utilizamos la función labels() para ver las etiquetas actuales de las columnas en el dataframe df. Esto es útil para entender cómo están estructurados los datos y qué nombres de columnas necesitan ser cambiados.
A continuación, usamos la función rename_columns() de la libreria ThesiStats para renombrar las primeras cinco columnas del dataframe. Esta función no es estándar en R y puede ser parte de un paquete personalizado o definido previamente en el script (asegúrate de que la función esté correctamente definida o que el paquete necesario esté cargado).
df %>% labels()
## [[1]]
## [1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12"
## [13] "13" "14" "15" "16" "17" "18" "19" "20" "21" "22" "23" "24"
## [25] "25" "26" "27" "28" "29" "30" "31" "32" "33" "34" "35" "36"
## [37] "37" "38" "39" "40" "41" "42" "43" "44" "45" "46" "47" "48"
## [49] "49" "50" "51" "52" "53" "54" "55" "56" "57" "58" "59" "60"
## [61] "61" "62" "63" "64" "65" "66" "67" "68" "69" "70" "71" "72"
## [73] "73" "74" "75" "76" "77" "78" "79" "80" "81" "82" "83" "84"
## [85] "85" "86" "87" "88" "89" "90" "91" "92" "93" "94" "95" "96"
## [97] "97" "98" "99" "100"
##
## [[2]]
## [1] "Carrera:"
## [2] "Ciclo actual:"
## [3] "Ciclo en el que ingresaste:"
## [4] "Edad:"
## [5] "Sexo"
## [6] "Durante la pandemia, ¿con qué frecuencia se ha sentido nervioso/a, ansioso/a, o con los nervios de punta?"
## [7] "Durante la pandemia, ¿con qué frecuencia no pudo dejar de preocuparse o no poder controlar la preocupación?"
## [8] "Durante la pandemia, ¿con qué frecuencia se sintió desanimado/a, deprimido/a o sin esperanzas?"
## [9] "Durante la pandemia, ¿con qué frecuencia ha sentido poco interés o placer en hacer las cosas?"
## [10] "Durante la pandemia, ¿con qué frecuencia se ha sentido estresado?"
## [11] "Durante la pandemia, ¿con qué frecuencia sintió que no tenía la capacidad para afrontar o controlar los problemas importantes de su vida?"
df_new <- rename_columns(
df,
new_names = c("Carrera", "Ciclo_Actual", "Ciclo_Ingreso", "Edad", "Sexo"),
columns = 1:5
)
Antes de realizar cambios adicionales, es útil verificar las etiquetas de las columnas después de la primera ronda de renombrado para asegurarse de que los cambios se aplicaron correctamente.
Utilizamos la función rename_items3() de la libreria ThesiStats para cambiar los nombres de elementos específicos dentro de df_new, basados en criterios detallados y prefijos específicos. Esta función parece ser personalizada y no estándar en R, lo que sugiere que maneja casos más complejos de renombramiento que involucran múltiples columnas o condiciones específicas.
df_new %>% labels()
## [[1]]
## [1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12"
## [13] "13" "14" "15" "16" "17" "18" "19" "20" "21" "22" "23" "24"
## [25] "25" "26" "27" "28" "29" "30" "31" "32" "33" "34" "35" "36"
## [37] "37" "38" "39" "40" "41" "42" "43" "44" "45" "46" "47" "48"
## [49] "49" "50" "51" "52" "53" "54" "55" "56" "57" "58" "59" "60"
## [61] "61" "62" "63" "64" "65" "66" "67" "68" "69" "70" "71" "72"
## [73] "73" "74" "75" "76" "77" "78" "79" "80" "81" "82" "83" "84"
## [85] "85" "86" "87" "88" "89" "90" "91" "92" "93" "94" "95" "96"
## [97] "97" "98" "99" "100"
##
## [[2]]
## [1] "Carrera"
## [2] "Ciclo_Actual"
## [3] "Ciclo_Ingreso"
## [4] "Edad"
## [5] "Sexo"
## [6] "Durante la pandemia, ¿con qué frecuencia se ha sentido nervioso/a, ansioso/a, o con los nervios de punta?"
## [7] "Durante la pandemia, ¿con qué frecuencia no pudo dejar de preocuparse o no poder controlar la preocupación?"
## [8] "Durante la pandemia, ¿con qué frecuencia se sintió desanimado/a, deprimido/a o sin esperanzas?"
## [9] "Durante la pandemia, ¿con qué frecuencia ha sentido poco interés o placer en hacer las cosas?"
## [10] "Durante la pandemia, ¿con qué frecuencia se ha sentido estresado?"
## [11] "Durante la pandemia, ¿con qué frecuencia sintió que no tenía la capacidad para afrontar o controlar los problemas importantes de su vida?"
df_new_renombrado <-rename_items3(df_new,
prefix1 = "GAD",
prefix2 = "PHQ",
prefix3 = "ES",
inicio = "Durante la pandemia, ¿con qué frecuencia se ha sentido nervioso/a, ansioso/a, o con los nervios de punta?",
final = "Durante la pandemia, ¿con qué frecuencia sintió que no tenía la capacidad para afrontar o controlar los problemas importantes de su vida?",
n_items1 = 2,
n_items2 = 2,
n_items3 = 2)
Este paso utiliza la función detect_Likert para identificar y extraer expresiones de Likert de las columnas especificadas del dataframe df_new_renombrado. La función select(ES1:ES2) limita el análisis a esas columnas en particular, facilitando el enfoque en un subconjunto relevante de datos. El resultado, expresiones_ordenadas_df, contiene las expresiones de Likert detectadas en estas columnas.
Tras detectar las expresiones de Likert, el siguiente paso convierte estas expresiones ordenadas en una cadena de texto única. La función convert_expresions toma el dataframe expresiones_ordenadas_df y lo transforma en un formato de cadena que facilita la visualización o el uso posterior en documentos y reportes.
# detectar las expresiones Likert de la data
expresiones_ordenadas_df <- detect_Likert(df_new_renombrado %>% select(ES1:ES2))
print(expresiones_ordenadas_df)
## # A tibble: 4 × 1
## Alternativas
## <chr>
## 1 Para nada
## 2 Casi todos los días
## 3 Más de la mitad los días
## 4 Varios días
# convertir la expresion detecta en un cadena de texto para la siguiente función
convert_expresions(expresiones_ordenadas_df)
## [1] "1. Para nada; 2. Casi todos los días; 3. Más de la mitad los días; 4. Varios días"
El objetivo de este paso es preparar una estructura de mapeo que facilitará la conversión de respuestas textuales a códigos numéricos. Esta estructura se define en column_mappings, donde cada lista contiene un rango de columnas y la correspondiente cadena de mapeo que especifica cómo las respuestas textuales deben ser convertidas en valores numéricos. Este mapeo es crucial para análisis estadísticos subsiguientes y para la integración de datos en sistemas que requieren formatos numéricos.
Finalmente, usando la función remplace_alternative_response, aplicamos los mapeos definidos para transformar las respuestas textuales en valores numéricos en el dataframe df_new_renombrado. Este paso es esencial para preparar los datos para análisis estadísticos, facilitando operaciones como la modelación, la comparación y la visualización que dependen de datos numéricos.
# Generar la estructura para convertir expresiones en numeros
column_mappings <- list(
list(c("GAD1", "GAD2"), "1. Para nada; 2. Casi todos los días; 3. Más de la mitad los días; 4. Varios días"),
list(c("PHQ1", "PHQ2"), "1. Para nada; 2. Casi todos los días; 3. Más de la mitad los días; 4. Varios días"),
list(c("ES1", "ES2"), "1. Para nada; 2. Casi todos los días; 3. Más de la mitad los días; 4. Varios días")
)
df_new_renombrado <- remplace_alternative_response(df_new_renombrado, column_mappings)
Este paso se enfoca en analizar las variables sociodemográficas en el dataframe df_new_renombrado. Las columnas relacionadas con características sociodemográficas, como la “Carrera” y el “Ciclo de Ingreso” del estudiante, son seleccionadas para un análisis más detallado.
Aquí, utilizamos la función select() del paquete dplyr para extraer las columnas desde “Carrera” hasta “Ciclo_Ingreso”. Luego, colnames() extrae los nombres de estas columnas seleccionadas y los guarda en la variable columnas. Este bloque de código realiza un análisis estadístico de la variable “Edad” en el dataframe.
# Porcentajes de variables sociodemograficas
columnas <- df_new_renombrado %>% select(Carrera:Ciclo_Ingreso, Sexo) %>% colnames()
resultados_lista <- calcular_porcentajes(df_new_renombrado, columnas)
resultados_lista
## $Carrera
## # A tibble: 13 × 3
## Carrera n Porcentaje
## <chr> <int> <dbl>
## 1 Administración 6 6
## 2 Administración y Marketing 3 3
## 3 Administración y Negocios Internacionales 5 5
## 4 Arquitectura y Diseño de Interiores 3 3
## 5 Arquitectura y Urbanismo 3 3
## 6 Contabilidad y Finanzas 6 6
## 7 Derecho 13 13
## 8 Economía y Negocios internacionales 3 3
## 9 Ingeniería Ambiental 2 2
## 10 Ingeniería Civil 19 19
## 11 Ingeniería Industrial 19 19
## 12 Ingeniería de Sistemas Computacionales 15 15
## 13 Psicología 3 3
##
## $Ciclo_Actual
## # A tibble: 11 × 3
## Ciclo_Actual n Porcentaje
## <dbl> <int> <dbl>
## 1 1 11 11
## 2 2 19 19
## 3 3 7 7
## 4 4 14 14
## 5 5 8 8
## 6 6 15 15
## 7 7 5 5
## 8 8 4 4
## 9 9 6 6
## 10 10 8 8
## 11 11 3 3
##
## $Ciclo_Ingreso
## # A tibble: 10 × 3
## Ciclo_Ingreso n Porcentaje
## <chr> <int> <dbl>
## 1 2016-2 3 3
## 2 2017-1 2 2
## 3 2017-2 3 3
## 4 2018-1 4 4
## 5 2018-2 6 6
## 6 2019-1 6 6
## 7 2019-2 17 17
## 8 2020-1 24 24
## 9 2021-1 20 20
## 10 2021-2 15 15
##
## $Sexo
## # A tibble: 2 × 3
## Sexo n Porcentaje
## <chr> <int> <dbl>
## 1 Mujer 52 52
## 2 Varón 48 48
# Calculo de la edad
edad_stat(df_new_renombrado, Edad)
## # A tibble: 1 × 4
## Media DesviacionEstandar Minimo Maximo
## <dbl> <dbl> <dbl> <dbl>
## 1 26.0 9.09 16 47
El fragmento comienza leyendo líneas de texto desde un archivo externo Texto.txt, especificando la codificación UTF-8 para asegurar que los caracteres especiales se manejen correctamente.
Posteriormente, se genera código dinámicamente basado en el texto leído, orientado al dataframe df_new_renombrado. Este código podría ser usado para configurar o transformar datos de manera específica.
Finalmente, el dataframe df_new_renombrado se procesa para calcular sumas de ciertos valores que representan niveles de ansiedad, depresión y estrés, agrupando los resultados por fila. Las funciones rowwise() y c_across() permiten operaciones fila por fila y sobre columnas específicas, respectivamente.
texto <- readLines("Texto.txt", encoding = "UTF-8")
## Warning in readLines("Texto.txt", encoding = "UTF-8"): incomplete final line
## found on 'Texto.txt'
code <- generate_code(texto, "df_new_renombrado")
cat(code)
## df_new_renombrado %>%
## rowwise() %>%
## mutate(Ansiedad = sum(c_across(c(GAD1,GAD2))),
## Depresión = sum(c_across(c(PHQ1,PHQ2))),
## Estrés = sum(c_across(c(ES1,ES2)))) %>%
## ungroup()
df_new_renombrado <- df_new_renombrado %>%
rowwise() %>%
mutate(Ansiedad = sum(c_across(c(GAD1,GAD2))),
Depresión = sum(c_across(c(PHQ1,PHQ2))),
Estrés = sum(c_across(c(ES1,ES2)))) %>%
ungroup()
El bloque de código que presentas es un flujo de trabajo completo para realizar análisis de poder estadístico en modelos de grafos gaussianos (GGM) utilizando el paquete powerly en R.
Cargar powerly: Se carga el paquete necesario para el análisis de poder estadístico. Establecer semilla: Configurar una semilla asegura que los resultados sean reproducibles, lo cual es crucial para la validez de cualquier análisis estadístico.
Modelo GGM: Se genera un modelo de grafos gaussianos, donde nodes y density pueden ser ajustados para simular diferentes estructuras de red complejas.
Análisis de poder: Se ejecuta powerly para determinar el tamaño de muestra necesario para alcanzar un determinado nivel de poder estadístico, basándose en el modelo GGM generado.
Gráfico de resultados: Se visualizan los resultados del análisis para evaluar cómo el poder estadístico varía con diferentes tamaños de muestra.
Validación: Se realiza una validación del análisis de poder para confirmar la robustez de los resultados, utilizando un número elevado de replicaciones. Gráfico de validación y recomendación: Se muestra un gráfico de la validación y se obtiene una recomendación basada en los resultados validados.
library(powerly)
# Set a seed.
set.seed(2024)
# Generate a `GGM` model.
true_model <- generate_model(
type = "ggm",
nodes = 10, #Cambiar
density = .4 #Cambiar
)
# Run the method.
results <- powerly(
range_lower = 300, #Cambiar
range_upper = 500, #Cambiar
samples = 30,
replications = 40,
measure = "sen",
statistic = "power",
measure_value = .6,
statistic_value = .8,
model = "ggm",
model_matrix = true_model,
cores = 12, #Cambiar
verbose = TRUE
)
##
## Method run completed (14.6686 sec):
## - converged: yes
## - iterations: 1
## - recommendation: 300
# Plot method run.
plot(results)
## Warning in ggplot2::geom_segment(ggplot2::aes(x = .env$object$samples["50%"], : All aesthetics have length 1, but the data has 402 rows.
## ℹ Please consider using `annotate()` or provide this layer with data containing
## a single row.
# Run validation.
validation <- validate(
method = results,
replications = 3000,
cores = 12
)
## Running the validation...
##
## Validation completed (14.6726 sec):
## - sample: 300
## - statistic: 0.923
## - measure at 20th pert.: 0.846
# Plot validation.
plot(validation)
validation$recommendation
## 50%
## 300
Este comando utiliza la función select() para extraer un subconjunto de df_new_renombrado, específicamente las columnas desde “Ansiedad” hasta “Estrés”. El resultado se almacena en df_red, que ahora contiene solo las columnas relevantes para el análisis de estas tres variables.
Este fragmento de código crea una estructura groups que asigna un identificador numérico a cada condición psicológica (Ansiedad, Depresión, Estrés), lo que puede facilitar su manejo y referencia en análisis subsiguientes. Se utiliza la función structure() para definir una lista con las asignaciones y los nombres correspondientes a cada grupo.
# Seleccione una parte de la data
df_red <- df_new_renombrado %>% select(Ansiedad:Estrés)
# Organizar por comunidades
groups <- structure(list(`Ansiedad` = c(1),
`Depresión` = c(2),
`Estrés` = c(3)),
Names = c("Ansiedad",
"Depresión",
"Estres"))
Este comando carga el paquete bootnet, que es utilizado para la estimación de redes en datos psicológicos y sociales, facilitando el análisis de redes de síntomas, entre otros.
Este fragmento de código utiliza la función estimateNetwork() para estimar una red basada en el dataframe df_red. Los parámetros especificados incluyen:
default = ‘ggmModSelect’: Selecciona el método de modelado de red ‘ggmModSelect’, que implica una selección de modelo en la estimación de redes de modelos gráficos gaussianos (GGM). Este método es particularmente útil para seleccionar el mejor modelo basado en los datos. stepwise = TRUE: Habilita un procedimiento paso a paso en la selección del modelo, lo que puede mejorar la precisión del modelo final al añadir o eliminar conexiones basadas en criterios estadísticos. corMethod = “spearman”: Especifica que el método de correlación de Spearman se debe usar para calcular las correlaciones entre las variables.
Este comando accede a la propiedad graph del objeto network que contiene la representación gráfica de la red estimada. Esto permite una inspección visual de la red, mostrando cómo las variables están interconectadas basándose en las correlaciones de Spearman.
library(bootnet)
## This is bootnet 1.6
## For questions and issues, please see github.com/SachaEpskamp/bootnet.
#1. Estimar la red
network <-
estimateNetwork(df_red,
default = 'ggmModSelect',
stepwise = TRUE,
corMethod = "spearman")
## Estimating Network. Using package::function:
## - qgraph::ggmModSelect for model selection
## - using glasso::glasso
## Running glasso to obtain starting model...
## Testing all edges...
network$graph
## Ansiedad Depresión Estrés
## Ansiedad 0.0000000 0.4843171 0.0000000
## Depresión 0.4843171 0.0000000 0.6215601
## Estrés 0.0000000 0.6215601 0.0000000
Este bloque de código utiliza la función netSimulator() del paquete bootnet para simular redes a partir del modelo estimado. La simulación se realiza bajo los siguientes parámetros:
network$graph: Se usa el gráfico de la red estimada previamente como la estructura de base para la simulación. dataGenerator = ggmGenerator(ordinal = TRUE, nLevels = 4): Se especifica un generador de datos para modelos gráficos gaussianos que simula datos ordinales con 4 niveles. Esto es relevante cuando las variables de la red son categóricas y ordenadas. default = ‘ggmModSelect’: Indica que la simulación debe usar el mismo método de selección de modelo que se utilizó para la estimación de la red original. nCases = c(100,250,500,1000,2500): Define diferentes tamaños de muestra para la simulación, lo que permite evaluar cómo el tamaño de la muestra influye en la estabilidad y precisión de la red estimada. nReps = 100: Establece que cada configuración de tamaño de muestra debe repetirse 100 veces para garantizar la robustez de los resultados. nCores = 12: Utiliza 12 núcleos del procesador para paralelizar la simulación, mejorando la eficiencia y velocidad del proceso.
simRes <- netSimulator(network$graph,
dataGenerator = ggmGenerator(ordinal = TRUE, nLevels = 4),
default = 'ggmModSelect',
nCases = c(100,250,500,1000,2500),
nReps = 100,
nCores = 12)
plot(simRes)
## Warning: Removed 1 row containing non-finite outside the scale range
## (`stat_boxplot()`).
El código utiliza la función qgraph() del paquete qgraph para crear una visualización gráfica detallada de la red generada previamente. Este tipo de visualización es especialmente útil para entender las relaciones y la estructura dentro de modelos complejos como los grafos gaussianos (GGM).
network$graph: Usa el gráfico de la red estimada como la entrada para la visualización. groups: Define cómo los nodos deben ser agrupados en la visualización, utilizando una estructura que categoriza los nodos en grupos como ‘Ansiedad’, ‘Depresión’, y ‘Estrés’. curveAll = 2: Ajusta la curvatura de todas las aristas en la red para mejorar la claridad visual y evitar la superposición de líneas. palette = “pastel”: Elige una paleta de colores “pastel” para los nodos y las aristas, proporcionando una visualización suave y fácilmente distinguible que es adecuada para usuarios con dificultades para ver ciertos colores. layout = ‘spring’: Utiliza un algoritmo de disposición “spring” para posicionar los nodos de la red, intentando que las conexiones sean tan cortas como posible sin superponer los nodos. edge.labels = T: Activa la visualización de etiquetas en las aristas, lo cual es crucial para entender la magnitud y la dirección de las relaciones en la red. legend.cex = 0.4: Ajusta el tamaño de la leyenda a un 40% del tamaño predeterminado para mantener el gráfico despejado y legible. layoutScale = c(0.7, 0.7): Escala la disposición de la red para asegurar que todo el gráfico se ajuste bien dentro del espacio visual disponible. legend = T: Incluye una leyenda en el gráfico para ayudar a interpretar los colores y las formas utilizados para diferentes grupos de nodos. node.width = 1.2 y node.height = 1.2: Establece el ancho y la altura de los nodos para asegurar que sean lo suficientemente grandes para ser visualmente impactantes y fáciles de identificar. edge.label.cex = 1: Configura el tamaño de las etiquetas de las aristas a un tamaño estándar para garantizar la legibilidad.
library(qgraph)
g1 <- qgraph(network$graph,
groups = groups,
curveAll = 2,
palette = "pastel", #colorblind #ggplot2 #pastel #rainbow
layout = 'spring',
edge.labels = T,
legend.cex = 0.4,
layoutScale = c(0.7, 0.7),
legend = T,
node.width = 1.2,
node.height = 1.2,
edge.label.cex = 1)
## Warning in abbreviate(colnames(input), 3): abreviatura utilizada con caracteres
## no ASCII
El código proporcionado inicia con la configuración para guardar una visualización gráfica en formato JPEG y luego crea la gráfica utilizando qgraph.
jpeg("Figura 1 - Izquierda.jpg",
width=8.5, height=6.5,
units='in',res=1500)
g1 <- qgraph(network$graph,
groups = groups,
curveAll = 2,
palette = "ggplot2", #colorblind #ggplot2 #pastel #rainbow
layout = 'spring',
edge.labels = T,
# nodeNames = namesItems,
legend.cex = 0.4,
layoutScale = c(0.8, 0.8),
legend.cex = 0.6,
legend = T,
node.width = 1.2,
node.height = 1.2,
edge.label.cex = 1)
## Warning in abbreviate(colnames(input), 3): abreviatura utilizada con caracteres
## no ASCII
dev.off()
## png
## 2
El código que proporcionaste realiza una visualización de las medidas de centralidad para una red, utilizando la función centralityPlot del paquete qgraph y personalizando el gráfico con la librería ggplot2.
network$graph: Utiliza el gráfico de la red obtenido de la estimación previa. scale = “z-score”: Normaliza las medidas de centralidad a puntajes Z para permitir comparaciones estandarizadas. include = c(“Strength”, “ExpectedInfluence”): Especifica las medidas de centralidad a incluir en el gráfico; en este caso, la fuerza (Strength) y la influencia esperada (Expected Influence). orderBy = “ExpectedInfluence”: Ordena los nodos en el gráfico según sus valores de influencia esperada, ayudando a visualizar claramente cuáles nodos son más centrales según esta métrica.
ggplot2::theme(axis.text = element_text(size = 14)): Ajusta el tamaño del texto de los ejes a 14, lo que mejora la legibilidad de las etiquetas de los ejes. ggplot2::theme(strip.text = element_text(size = 20, margin = margin())): Configura el tamaño del texto de los títulos de los paneles (strip text) a 20 y ajusta los márgenes, lo que no solo aumenta la legibilidad sino que también mejora la estética general del gráfico.
centralityPlot(network$graph, scale = "z-score", include = c("Strength", "ExpectedInfluence"),
orderBy = "ExpectedInfluence") +
ggplot2::theme(axis.text = element_text(size = 14)) +
ggplot2::theme(strip.text = element_text(size = 20, margin = margin()))
## Note: z-scores are shown on x-axis rather than raw centrality indices.
El código proporcionado inicia con la configuración para guardar una visualización gráfica en formato JPEG y luego crea la gráfica utilizando qgraph.
jpeg("Figura 1 Derecha.jpg",
width=3.8, height=6.5,
units='in',res=1500)
centralityPlot(network$graph, scale = "z-score", include =
c("Strength","ExpectedInfluence"),
orderBy ="ExpectedInfluence") +
ggplot2::theme(axis.text=element_text(size=10),
axis.title=element_text(size=14,face="bold"))+
ggplot2::theme(strip.text = element_text(size = 12, margin = margin()))
## Note: z-scores are shown on x-axis rather than raw centrality indices.
dev.off()
## png
## 2
El código que has proporcionado se centra en obtener y analizar los pesos de las aristas de una red modelada, proporcionando un enfoque detallado para entender la fuerza y la densidad de las conexiones dentro de la red.
getWmat(network$graph): Esta función extrae la matriz de pesos de aristas del objeto de red. getWmat se utiliza dos veces por error en el código original, por lo que aquí se corrige para usarla una sola vez. round(…, digits = 2): Redondea los valores de la matriz a dos decimales para facilitar la visualización y el análisis posterior, haciendo que los datos sean más manejables y legibles. mean(edge.matrix): Calcula y devuelve el promedio de los pesos de las aristas en la matriz, ofreciendo una medida de la fuerza de conexión promedio en la red. min(edge.matrix) y max(edge.matrix): Estos comandos determinan y devuelven el peso mínimo y máximo de las aristas en la matriz, respectivamente, proporcionando una visión de los límites de las interacciones entre los nodos. PsyMetricTools::Density_report(edge.matrix): Utiliza la función Density_report del paquete PsyMetricTools para generar un informe sobre la densidad de la red. La densidad, en este contexto, refleja qué tan conectada está la red en términos de la proporción de las conexiones posibles que son efectivamente conexiones reales, proporcionando una medida clave de la compactibilidad y cohesividad de la red.
### get edge weights
edge.matrix <- round(getWmat(getWmat(network$graph)), digits = 2)
edge.matrix
## Ansiedad Depresión Estrés
## Ansiedad 0.00 0.48 0.00
## Depresión 0.48 0.00 0.62
## Estrés 0.00 0.62 0.00
#Descriptivos de la matriz
mean(edge.matrix)
## [1] 0.2444444
min(edge.matrix)
## [1] 0
max(edge.matrix)
## [1] 0.62
PsyMetricTools::Density_report(edge.matrix)
## [1] "2 of 3 edges were distinct from zero (66.67% of density)."
El código proporcionado implementa un proceso de bootstrap para una red estimada con el fin de evaluar la estabilidad y la significancia de las estadísticas de la red.
set.seed(2024): Fija una semilla para la generación de números aleatorios. Este paso es crucial para asegurar que los resultados del bootstrap sean reproducibles, permitiendo que el mismo conjunto de datos simulados se genere cada vez que se ejecute el código. bootnet: Esta función del paquete bootnet realiza el bootstrap de las estadísticas de red. network: El objeto de red sobre el cual se realiza el bootstrap. nBoots = 1000: Especifica que se realizarán 1000 réplicas de bootstrap, proporcionando una buena estimación de la variabilidad y estabilidad de las estadísticas de la red. caseN = 10: Define el número de casos (observaciones) que se simularán en cada réplica de bootstrap. Este valor es críticamente bajo para cualquier análisis serio y probablemente se usa aquí solo para demostración o pruebas. nCores = 12: Utiliza 12 núcleos del procesador para paralelizar el proceso de bootstrap, lo que puede acelerar significativamente la computación. type = “case”: Indica que el bootstrap debe realizarse mediante muestreo de casos (observaciones), lo que es típico en estudios donde las observaciones son independientes. communities = groups: Usa una estructura predefinida para agrupar nodos, lo cual puede influir en cómo se calculan ciertas estadísticas de red, especialmente aquellas relacionadas con puentes entre comunidades. statistics = c(‘edge’, ‘strength’, ‘expectedInfluence’, ‘bridgeExpectedInfluence’): Determina las estadísticas que serán estimadas durante el bootstrap, incluyendo pesos de aristas, fuerza de nodos, influencia esperada y la influencia esperada de puentes.
set.seed(2024)
boot.combined.1 <-
bootnet(network,
nBoots = 1000,
caseN = 10,
nCores = 12,
type = "case",
communities = groups,
statistics = c('edge', 'strength','expectedInfluence', 'bridgeExpectedInfluence'))
## Note: bootnet will store only the following statistics: edge, strength, expectedInfluence, bridgeExpectedInfluence
## Bootstrapping...
## Computing statistics...
plot(boot.combined.1, statistics = c('expectedInfluence', 'strength', 'bridgeExpectedInfluence'))
El código ejecuta una evaluación de la estabilidad de correlación usando los resultados obtenidos de un proceso de bootstrap en análisis de redes. corStability: Esta función es parte del paquete bootnet y se utiliza para calcular la estabilidad de correlación de las estimaciones obtenidas de los bootstraps de la red. La estabilidad de correlación mide cuán consistentes son las estimaciones de las estadísticas de la red (como las fuerzas de los nodos y las influencias esperadas) a través de diferentes submuestras del conjunto de datos. boot.combined.1: Es el objeto resultante del proceso de bootstrap realizado anteriormente, que contiene múltiples replicaciones de las estadísticas de la red calculadas a partir de submuestras de datos. Esta línea de código imprime los resultados de la estabilidad de correlación. Generalmente, se espera que valores más altos indiquen una mayor estabilidad en las estimaciones, lo que sugiere que los resultados son confiables y robustos a cambios en la muestra de datos.
cs.combined <- corStability(boot.combined.1)
## === Correlation Stability Analysis ===
##
## Sampling levels tested:
## nPerson Drop% n
## 1 25 75 93
## 2 33 67 111
## 3 41 59 94
## 4 48 52 104
## 5 56 44 100
## 6 64 36 116
## 7 72 28 88
## 8 79 21 90
## 9 87 13 112
## 10 95 5 92
##
## Maximum drop proportions to retain correlation of 0.7 in at least 95% of the samples:
##
## bridgeExpectedInfluence: 0.44
## - For more accuracy, run bootnet(..., caseMin = 0.36, caseMax = 0.52)
##
## edge: 0.44
## - For more accuracy, run bootnet(..., caseMin = 0.36, caseMax = 0.52)
##
## expectedInfluence: 0.44
## - For more accuracy, run bootnet(..., caseMin = 0.36, caseMax = 0.52)
##
## strength: 0.44
## - For more accuracy, run bootnet(..., caseMin = 0.36, caseMax = 0.52)
##
## Accuracy can also be increased by increasing both 'nBoots' and 'caseN'.
cs.combined
## bridgeExpectedInfluence edge expectedInfluence
## 0.44 0.44 0.44
## strength
## 0.44
El código proporcionado configura y ejecuta un proceso de bootstrap no paramétrico en un modelo de red estimado. bootnet: Función del paquete bootnet usada para realizar el bootstrap de estadísticas de redes. network: Especifica el modelo de red que se ha estimado previamente y sobre el cual se realizará el bootstrap. nBoots = 1000: Indica que se realizarán 1000 réplicas de bootstrap. Este número elevado permite una evaluación robusta de la variabilidad y estabilidad de las estimaciones de la red. nCores = 12: Utiliza 12 núcleos del procesador para la computación paralela, optimizando el tiempo necesario para completar el proceso de bootstrap. type=“nonparametric”: Selecciona el tipo de bootstrap a realizar. El método “nonparametric” es usado generalmente para datos que no se asumen distribuidos normalmente, haciendo resamples directos de los datos observados sin asumir una distribución paramétrica subyacente. communities=groups: Define cómo los nodos están agrupados en la red, lo cual puede influir en cómo se calculan las estadísticas de puentes (bridge statistics) y otras medidas. statistics = c(‘expectedInfluence’, ‘edge’, ‘strength’, ‘bridgeExpectedInfluence’): Enumera las estadísticas específicas que serán recalculadas en cada réplica de bootstrap. Estas incluyen: ‘expectedInfluence’: La influencia esperada de cada nodo, que mide el efecto potencial de un nodo sobre otros nodos en la red. ‘edge’: Los pesos de las aristas entre nodos, que representan la fuerza y la dirección de las relaciones. ‘strength’: La fuerza total de las conexiones de cada nodo, que es una suma de las magnitudes de todas las aristas conectadas a ese nodo. ‘bridgeExpectedInfluence’: Una medida de cómo los nodos funcionan como puentes entre diferentes comunidades o grupos dentro de la red.
boot.combined.2 <-
bootnet(network,
nBoots = 1000,
nCores = 12,
type="nonparametric",
communities=groups,
statistics = c('expectedInfluence', 'edge', 'strength', 'bridgeExpectedInfluence')
)
## Note: bootnet will store only the following statistics: expectedInfluence, edge, strength, bridgeExpectedInfluence
## Bootstrapping...
## Computing statistics...
# Plot bootstrapped edge CIs:
plot(boot.combined.2 , labels = T, order = 'sample',statistics = 'edge')
El código que has proporcionado se centra en la visualización de los resultados del bootstrap de dos diferentes análisis de red y luego combina estas visualizaciones en un único archivo gráfico de alta calidad. plot(boot.combined.1, …): Genera un gráfico de los resultados del primer bootstrap (boot.combined.1), enfocándose en las estadísticas de ‘expectedInfluence’ y ‘strength’. Este gráfico proporcionará insights sobre la influencia esperada y la fuerza de las conexiones dentro de la red. plot(boot.combined.2, …): Crea un gráfico para el segundo bootstrap (boot.combined.2), mostrando los pesos de las aristas (‘edge’). Aquí, se activan las etiquetas (labels = T) y se ordenan los nodos según su aparición en las muestras (order = ‘sample’). ggarrange(): Función del paquete ggpubr que permite combinar múltiples gráficos en un layout específico. Aquí, p1 y p2 se colocan lado a lado en una fila (ncol = 2, nrow = 1) y se les asignan las etiquetas “A” y “B”, respectivamente. ggsave(): Función para guardar gráficos en archivos. Especifica el nombre del archivo (“Figura 2.jpg”), el objeto de gráfico a guardar (plot = p12), las dimensiones del archivo (height = 5, width = 8.5) y la resolución en DPI (dpi = 600), garantizando que el gráfico se guarde en alta calidad para su uso en presentaciones o publicaciones.
p1 <-plot(boot.combined.1, statistics = c('expectedInfluence', 'strength'))
p2 <-plot(boot.combined.2 , labels = T, order = 'sample',statistics = 'edge')
library(ggpubr)
# Combinar los plots
p12 = ggarrange(p1,p2,labels = c("A","B"),ncol = 2, nrow = 1)
p12
# Guardar en alta calidad
ggsave(filename = "Figura 2.jpg", plot = p12,
height = 5, width = 8.5, dpi = 600)
Este código realiza la creación de subconjuntos de datos específicos basados en el género y posteriormente estima redes psicológicas para cada subgrupo. filter(Sexo == “Mujer”/“Varón”): Filtra el dataframe df_new_renombrado para incluir solo filas donde el campo ‘Sexo’ coincide con “Mujer” o “Varón”. select(Ansiedad és): Selecciona las columnas de interés que abarcan las variables de Ansiedad a Estrés. na.omit(): Elimina cualquier fila que contenga valores NA, asegurando que solo se incluyan datos completos en el análisis. as.data.frame(): Convierte el resultado en un dataframe para su uso en análisis posteriores. estimateNetwork(): Función usada para estimar una red de modelos gráficos gaussianos (GGM). Se ajusta usando el método de selección de modelo con un procedimiento paso a paso. default = ‘ggmModSelect’: Configura el método de estimación para seleccionar el modelo más adecuado basado en los datos. stepwise = TRUE: Habilita la selección paso a paso de variables en el modelo, mejorando la selección final del modelo. corMethod = “spearman”: Utiliza el método de correlación de Spearman, adecuado para datos que no necesariamente cumplen con la suposición de normalidad. averageLayout(): Esta función calcula un layout promedio basado en múltiples redes, en este caso, las redes de mujeres y varones. Este layout promedio es útil para comparar visualmente las estructuras de red entre diferentes grupos, manteniendo una consistencia en la ubicación de los nodos entre las visualizaciones.
#generación de un dato específico
Mujer = df_new_renombrado %>%
filter(Sexo == "Mujer") %>%
select(Ansiedad:Estrés) %>%
na.omit() %>%
as.data.frame()
Varon = df_new_renombrado %>%
filter(Sexo == "Varón") %>%
select(Ansiedad:Estrés) %>%
na.omit() %>%
as.data.frame()
#Estimación de los subgrupos (yes and no)
network_Mujer <- estimateNetwork(Mujer,
default = 'ggmModSelect',
stepwise = TRUE,
corMethod = "spearman"
)
## Estimating Network. Using package::function:
## - qgraph::ggmModSelect for model selection
## - using glasso::glasso
## Running glasso to obtain starting model...
## Testing all edges...
network_Varon <- estimateNetwork(Varon,
default = 'ggmModSelect',
stepwise = TRUE,
corMethod = "spearman")
## Estimating Network. Using package::function:
## - qgraph::ggmModSelect for model selection
## - using glasso::glasso
## Running glasso to obtain starting model...
## Testing all edges...
L <- averageLayout(network_Mujer,network_Varon)
## Warning in abbreviate(colnames(input), 3): abreviatura utilizada con caracteres
## no ASCII
jpeg("Figura 3 - Comparacion.jpg",
width=8.5, height=6.5,
units='in',res=1000)
layout(t(1:2))
g3 <- qgraph(network_Mujer$graph,
layout = L,
vsize = 10, #tamaño de los nodos
groups = groups,
palette = "ggplot2",
legend = F,
edge.labels = T, #Cambien aquí
edge.label.cex = 1.2,
cut = 0.00,
curveAll = 2,
title = "Mujer")
## Warning in abbreviate(colnames(input), 3): abreviatura utilizada con caracteres
## no ASCII
g4 <- qgraph(network_Varon$graph,
layout = L,
vsize = 10, #tamaño de los nodos
palette = "ggplot2",
groups = groups,
legend = F, #Cambien aquí
edge.labels = T,
edge.label.cex = 1.2,
curveAll = 2,
cut = 0.00,
title = "Varón")
## Warning in abbreviate(colnames(input), 3): abreviatura utilizada con caracteres
## no ASCII
dev.off()
## png
## 2
El código descrito tiene como objetivo visualizar y comparar medidas de centralidad entre dos redes, específicamente para los subgrupos basados en género (Mujer y Varón), y posteriormente guardar esta visualización en un archivo de alta calidad. centralityPlot(): Utiliza la función centralityPlot del paquete qgraph para generar gráficos de centralidad que visualizan métricas como la Influencia Esperada y la Fuerza de los nodos de las redes. list(network_Mujer = g3, network_Varon = g4): Define las redes a comparar. Aquí, g3 y g4 deben ser los objetos gráficos generados previamente que representan las redes de Mujeres y Varones respectivamente. include = c(“ExpectedInfluence”, “Strength”): Especifica las métricas de centralidad a visualizar. orderBy = “ExpectedInfluence”: Ordena los nodos en el gráfico según la Influencia Esperada para cada red. ggplot2::labs(color = “Condition”): Añade una etiqueta a la leyenda de color en el gráfico para indicar que los colores diferencian condiciones o grupos, en este caso, ‘Mujer’ y ‘Varón’.
Comparative <- centralityPlot(list(network_Mujer = g3, network_Varon = g4),
include = c("ExpectedInfluence", "Strength"),
orderBy = "ExpectedInfluence") +
ggplot2::labs(color = "Condition")
Comparative
#guardar en alta calidad
ggsave(filename = "Comparative.jpg", plot = Comparative,
height = 6.5, width = 4.5, dpi = 600)
Estas pruebas están diseñadas para determinar si existen diferencias significativas en las conexiones y las medidas de centralidad entre las dos redes. set.seed(234): Establece la semilla para la generación de números aleatorios, asegurando la reproducibilidad de los resultados de las simulaciones y pruebas. library(NetworkComparisonTest): Carga el paquete NetworkComparisonTest, que proporciona funciones para comparar redes de manera estadística. NCT(): Función para realizar la prueba de comparación de redes (Network Comparison Test). network_Mujer, network_Varon: Los dos objetos de red que representan las redes estimadas para los subgrupos Mujer y Varón, respectivamente. binary.data=F: Indica que los datos no son binarios; es decir, que las aristas pueden tener diferentes pesos y no solo valores de 0 o 1. test.edges=TRUE: Activa la prueba de diferencias en las aristas entre las dos redes. edges=“all”: Especifica que todas las aristas serán incluidas en el análisis. it = 100: Establece el número de iteraciones para el procedimiento de permutación utilizado en la prueba. test.centrality = TRUE: Activa la prueba de diferencias en las medidas de centralidad entre las dos redes. res\(nwinv.real: Muestra la estadística de prueba real (M) para la invariancia de la red, que mide las diferencias globales en la estructura de la red. res\)nwinv.pval: Proporciona el valor p asociado con la estadística de prueba, indicando si las diferencias observadas son estadísticamente significativas. res\(glstrinv.real: Muestra la estadística de prueba real (S) para la invariancia de la fuerza global, que evalúa si la suma total de las fuerzas de las aristas difiere significativamente entre las dos redes. res\)glstrinv.pval: Proporciona el valor p para la prueba de fuerza global, indicando la significancia estadística de las diferencias en la fuerza global entre las dos redes.
set.seed(234)
library(NetworkComparisonTest)
res <-NCT(network_Mujer, network_Varon, binary.data=F,test.edges=TRUE, edges="all", it = 100, test.centrality = TRUE)
## Note: Input is a bootnetResult object, argument 'binary.data' is ignored.
## Note: estimateNetwork object used - estimation method has possibly not been validated.
## Note: Both 'estimator' and 'binary.data' arguments used: only the 'estimator' will be used ('binary.data' will be ignored)
## | | | 0% | |= | 1% | |= | 2%
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## | |== | 3% | |=== | 4% | |==== | 5% | |==== | 6% | |===== | 7% | |====== | 8% | |====== | 9% | |======= | 10% | |======== | 11% | |======== | 12%
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## | |========= | 13% | |========== | 14% | |========== | 15%
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## | |=========== | 16% | |============ | 17% | |============= | 18% | |============= | 19% | |============== | 20% | |=============== | 21% | |=============== | 22%
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## | |================ | 23%
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## | |================= | 24% | |================== | 25% | |================== | 26% | |=================== | 27% | |==================== | 28%
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## | |==================== | 29% | |===================== | 30%
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## | |====================== | 31% | |====================== | 32% | |======================= | 33% | |======================== | 34% | |======================== | 35% | |========================= | 36%
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## | |========================== | 37%
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## | |=========================== | 38% | |=========================== | 39% | |============================ | 40% | |============================= | 41% | |============================= | 42% | |============================== | 43% | |=============================== | 44% | |================================ | 45% | |================================ | 46%
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## | |================================= | 47% | |================================== | 48%
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## | |================================== | 49%
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## | |=================================== | 50%
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## | |==================================== | 51%
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## | |==================================== | 52% | |===================================== | 53% | |====================================== | 54% | |====================================== | 55% | |======================================= | 56% | |======================================== | 57% | |========================================= | 58% | |========================================= | 59%
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## | |========================================== | 60%
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## | |=========================================== | 61%
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## | |=========================================== | 62% | |============================================ | 63% | |============================================= | 64%
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## | |============================================== | 65% | |============================================== | 66% | |=============================================== | 67% | |================================================ | 68%
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## | |================================================ | 69% | |================================================= | 70%
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## | |================================================== | 71% | |================================================== | 72%
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## | |=================================================== | 73% | |==================================================== | 74% | |==================================================== | 75% | |===================================================== | 76% | |====================================================== | 77% | |======================================================= | 78%
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## | |======================================================= | 79%
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## | |======================================================== | 80%
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## | |========================================================= | 81% | |========================================================= | 82% | |========================================================== | 83% | |=========================================================== | 84%
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## | |============================================================ | 85% | |============================================================ | 86% | |============================================================= | 87% | |============================================================== | 88% | |============================================================== | 89%
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## | |=============================================================== | 90% | |================================================================ | 91% | |================================================================ | 92% | |================================================================= | 93% | |================================================================== | 94% | |================================================================== | 95% | |=================================================================== | 96%
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## | |==================================================================== | 97% | |===================================================================== | 98%
## Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
## | |===================================================================== | 99% | |======================================================================| 100%
#NETWORK INVARIANCE TEST
res$nwinv.real # Test statistic M:
## [1] 0.2409966
res$nwinv.pval #p-value
## [1] 0.4257426
#GLOBAL STRENGTH INVARIANCE TEST
res$glstrinv.real #Test statistic S
## [1] 0.0004442041
res$glstrinv.pval #p-value
## [1] 0.990099
Tamaño del efecto de las matrices
Este bloque de código se centra en calcular el tamaño del efecto para comparar las diferencias entre dos redes mediante la correlación de Spearman de sus matrices de adyacencia. getWmat(): Esta función extrae la matriz de adyacencia del objeto de red especificado. La matriz de adyacencia contiene los pesos de las conexiones entre todos los pares de nodos en la red. network_Mujer, network_Varon: Objetos de red que representan las redes estimadas para los grupos Mujer y Varón, respectivamente. lower.tri(): Esta función selecciona los elementos del triángulo inferior de la matriz de adyacencia, excluyendo la diagonal. Se utiliza para evitar la redundancia en los datos y concentrarse solo en los elementos únicos, ya que las matrices de adyacencia son simétricas en redes no dirigidas. cor(…, method = “spearman”): Calcula la correlación de Spearman entre los elementos seleccionados de las dos matrices de adyacencia. La correlación de Spearman es una medida no paramétrica que evalúa cómo el rango de los valores de una variable predice el rango de los valores en otra.
#Calculation of effect size - Comparing adjacent matrices
network1_adjacency <- getWmat(network_Mujer)
network2_adjacency <- getWmat(network_Varon)
cor(network1_adjacency[lower.tri(network1_adjacency)], network2_adjacency[lower.tri(network2_adjacency)], method = "spearman")
## [1] 0.5
Información de la librerias de R
sessionInfo()
## R version 4.4.0 (2024-04-24 ucrt)
## Platform: x86_64-w64-mingw32/x64
## Running under: Windows 11 x64 (build 22000)
##
## Matrix products: default
##
##
## locale:
## [1] LC_COLLATE=Spanish_Peru.utf8 LC_CTYPE=Spanish_Peru.utf8
## [3] LC_MONETARY=Spanish_Peru.utf8 LC_NUMERIC=C
## [5] LC_TIME=Spanish_Peru.utf8
##
## time zone: America/Lima
## tzcode source: internal
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] NetworkComparisonTest_2.2.2 ggpubr_0.6.0
## [3] qgraph_1.9.8 bootnet_1.6
## [5] powerly_1.8.6 readxl_1.4.3
## [7] ThesiStats_1.0.0 PsyMetricTools_1.0.0
## [9] psych_2.4.3 lubridate_1.9.3
## [11] forcats_1.0.0 stringr_1.5.1
## [13] dplyr_1.1.4 purrr_1.0.2
## [15] readr_2.1.5 tidyr_1.3.1
## [17] tibble_3.2.1 ggplot2_3.5.1
## [19] tidyverse_2.0.0 bookdown_0.39
##
## loaded via a namespace (and not attached):
## [1] splines_4.4.0 R.oo_1.26.0 cellranger_1.1.0
## [4] rpart_4.1.23 lifecycle_1.0.4 rstatix_0.7.2
## [7] doParallel_1.0.17 lattice_0.22-6 MASS_7.3-60.2
## [10] backports_1.5.0 magrittr_2.0.3 Hmisc_5.1-3
## [13] sass_0.4.9 rmarkdown_2.27 jquerylib_0.1.4
## [16] yaml_2.3.8 plotrix_3.8-4 IsingFit_0.4
## [19] cowplot_1.1.3 pbapply_1.7-2 minqa_1.2.7
## [22] RColorBrewer_1.1-3 abind_1.4-5 quadprog_1.5-8
## [25] R.utils_2.12.3 rgl_1.3.1 nnet_7.3-19
## [28] gdata_3.0.0 mgm_1.2-14 ellipse_0.5.0
## [31] codetools_0.2-20 tidyselect_1.2.1 shape_1.4.6.1
## [34] farver_2.1.2 lme4_1.1-35.3 IsingSampler_0.2.3
## [37] stats4_4.4.0 base64enc_0.1-3 splines2_0.5.2
## [40] eigenmodel_1.11 jsonlite_1.8.8 e1071_1.7-14
## [43] mitml_0.4-5 Formula_1.2-5 survival_3.5-8
## [46] iterators_1.0.14 systemfonts_1.1.0 foreach_1.5.2
## [49] tools_4.4.0 progress_1.2.3 ragg_1.3.2
## [52] snow_0.4-4 Rcpp_1.0.12 NetworkToolbox_1.4.2
## [55] glue_1.7.0 mnormt_2.1.1 gridExtra_2.3
## [58] pan_1.9 Rttf2pt1_1.3.12 xfun_0.44
## [61] withr_3.0.0 fastmap_1.2.0 boot_1.3-30
## [64] fansi_1.0.6 digest_0.6.35 timechange_0.3.0
## [67] R6_2.5.1 textshaping_0.4.0 mice_3.16.0
## [70] colorspace_2.1-0 gtools_3.9.5 jpeg_0.1-10
## [73] weights_1.0.4 R.methodsS3_1.8.2 utf8_1.2.4
## [76] generics_0.1.3 candisc_0.9.0 data.table_1.15.4
## [79] corpcor_1.6.10 class_7.3-22 prettyunits_1.2.0
## [82] htmlwidgets_1.6.4 pkgconfig_2.0.3 gtable_0.3.5
## [85] htmltools_0.5.8.1 lavaan_0.6-18 carData_3.0-5
## [88] scales_1.3.0 heplots_1.7.0 png_0.1-8
## [91] wordcloud_2.6 knitr_1.47 rstudioapi_0.16.0
## [94] tzdb_0.4.0 reshape2_1.4.4 checkmate_2.3.1
## [97] nlme_3.1-164 nloptr_2.0.3 proxy_0.4-27
## [100] cachem_1.1.0 parallel_4.4.0 osqp_0.6.3.2
## [103] extrafont_0.19 foreign_0.8-86 pillar_1.9.0
## [106] grid_4.4.0 vctrs_0.6.5 car_3.1-2
## [109] jomo_2.7-6 cluster_2.1.6 extrafontdb_1.0
## [112] htmlTable_2.4.2 evaluate_0.23 pbivnorm_0.6.0
## [115] mvtnorm_1.2-5 cli_3.6.2 compiler_4.4.0
## [118] rlang_1.1.3 crayon_1.5.2 smacof_2.1-6
## [121] ggsignif_0.6.4 labeling_0.4.3 fdrtool_1.2.17
## [124] plyr_1.8.9 stringi_1.8.4 nnls_1.5
## [127] networktools_1.5.2 munsell_0.5.1 glmnet_4.1-8
## [130] pacman_0.5.1 Matrix_1.7-0 hms_1.1.3
## [133] glasso_1.11 patchwork_1.2.0 highr_0.11
## [136] igraph_2.0.3 broom_1.0.6 bslib_0.7.0
## [139] polynom_1.4-1