CONFIGURACIÓN Y LIBRERÍAS Para el AFC, utilizamos el estándar mundial en R: lavaan.

Fragmento de código

if(!require(lavaan)) install.packages(“lavaan”) if(!require(semPlot)) install.packages(“semPlot”) if(!require(dplyr)) install.packages(“dplyr”)

library(lavaan) library(semPlot) library(dplyr) DEFINICIÓN DEL MODELO TEÓRICO En este bloque especificamos qué ítems miden cada constructo (usando el operador =~). Solo incluimos los ítems que sobrevivieron a la limpieza del Capítulo III.

Fragmento de código

Sintaxis lavaan: ‘Factor =~ item1 + item2 + …’

modelo_afc <- ’ QUAL =~ qual_3 + qual_4 + qual_5 + qual_6 + qual_8 PERF =~ perf_2 + perf_3 + perf_4 CSOR =~ csor_1 + csor_2 + csor_3 + csor_4 + csor_5 # Agregue aquí el resto de sus constructos ’ EJECUCIÓN ROBUSTA DEL MODELO Ejecutamos el modelo con “Blindaje Estadístico”:

MLR: Estimador robusto para datos no normales.

FIML: Manejo inteligente de datos perdidos.

Fragmento de código

fit_afc <- cfa(modelo_afc, data = corp_rep_data, std.lv = TRUE, # Estabilidad: Fija varianza del factor a 1 missing = “fiml”, # Manejo de vacíos estimator = “MLR”) # Ajuste por no normalidad

Visualización del Diagrama de Senderos

semPaths(fit_afc, whatLabels = “std”, layout = “tree”, edge.label.cex = 0.8, style = “lisrel”, rotation = 2, title = FALSE) REPORTE DE AJUSTE GLOBAL (SEMÁFORO) Evaluamos si el modelo coincide con la realidad de los datos.

Fragmento de código

indices <- fitMeasures(fit_afc, c(“cfi”, “tli”, “rmsea”, “srmr”))

cat(“======================================================”) cat(” DIAGNÓSTICO DE AJUSTE DEL MODELO“) cat(”======================================================“)

CFI: Comparative Fit Index

cat(paste(“CFI (Ideal > 0.95):”, round(indices[“cfi”], 3))) if(indices[“cfi”] > 0.90) cat(” -> ✅ ACEPTABLE“) else cat(” -> ❌ POBRE“)

RMSEA: Error de Aproximación

cat(paste(“RMSEA (Ideal < 0.06):”, round(indices[“rmsea”], 3))) if(indices[“rmsea”] < 0.08) cat(” -> ✅ ACEPTABLE“) else cat(” -> ❌ POBRE“)

SRMR: Residuos Estandarizados

cat(paste(“SRMR (Ideal < 0.08):”, round(indices[“srmr”], 3))) if(indices[“srmr”] < 0.08) cat(” -> ✅ ACEPTABLE“) else cat(” -> ❌ POBRE“) ÍNDICES DE MODIFICACIÓN (CIRUGÍA DEL MODELO) Si el semáforo marcó rojo, buscamos dónde están los problemas de redundancia o confusión.

Fragmento de código

MI <- modificationIndices(fit_afc, sort = TRUE, minimum.value = 10)

Sugerencias de Redundancia (Correlación de Errores)

cat(“— TOP 5 SUGERENCIAS DE REDUNDANCIA (~~) —”) print(head(MI[MI$op == “~~”, c(“lhs”, “rhs”, “mi”)], 5))

Sugerencias de Cargas Cruzadas (=~)

cat(“— TOP 5 ÍTEMS CONFUSOS (=~) —”) print(head(MI[MI$op == “=~”, c(“lhs”, “rhs”, “mi”)], 5)) CARGAS FACTORIALES ESTANDARIZADAS Cada ítem debe cargar con fuerza (> 0.70 ideal) en su factor.

Fragmento de código

parameterEstimates(fit_afc, standardized = TRUE) %>% filter(op == “=~”) %>% select(lhs, rhs, std.all, pvalue) %>% rename(Constructo = lhs, Item = rhs, Carga_Std = std.all, P_Valor = pvalue)