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
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
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(”======================================================“)
cat(paste(“CFI (Ideal > 0.95):”, round(indices[“cfi”], 3))) if(indices[“cfi”] > 0.90) cat(” -> ✅ ACEPTABLE“) else cat(” -> ❌ POBRE“)
cat(paste(“RMSEA (Ideal < 0.06):”, round(indices[“rmsea”], 3))) if(indices[“rmsea”] < 0.08) cat(” -> ✅ ACEPTABLE“) else cat(” -> ❌ POBRE“)
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)
cat(“— TOP 5 SUGERENCIAS DE REDUNDANCIA (~~) —”) print(head(MI[MI$op == “~~”, c(“lhs”, “rhs”, “mi”)], 5))
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)