# Helper: extract a single fit index from a fitted model
fi <- function(fit_obj, index) fitMeasures(fit_obj, index)
comparison_table <- data.frame(
Model = c("Null: Single Factor (CMB)", "M1: Correlated Factors",
"M2: Hierarchical (Primary)", "M3: Bifactor"),
`χ² (Scaled)` = round(c(fi(fit.harman,"chisq.scaled"), fi(fit.corr,"chisq.scaled"),
fi(fit.cfa,"chisq.scaled"), fi(fit.cfa.bifactor,"chisq.scaled")), 1),
df = round(c(fi(fit.harman,"df.scaled"), fi(fit.corr,"df.scaled"),
fi(fit.cfa,"df.scaled"), fi(fit.cfa.bifactor,"df.scaled")), 0),
`CFI (Robust)` = round(c(fi(fit.harman,"cfi.robust"), fi(fit.corr,"cfi.robust"),
fi(fit.cfa,"cfi.robust"), fi(fit.cfa.bifactor,"cfi.robust")), 3),
`RMSEA (Robust)` = round(c(fi(fit.harman,"rmsea.robust"), fi(fit.corr,"rmsea.robust"),
fi(fit.cfa,"rmsea.robust"), fi(fit.cfa.bifactor,"rmsea.robust")), 3),
SRMR = round(c(fi(fit.harman,"srmr"), fi(fit.corr,"srmr"),
fi(fit.cfa,"srmr"), fi(fit.cfa.bifactor,"srmr")), 3),
`ΔCFI` = c(NA, NA,
round(fi(fit.cfa,"cfi.robust") - fi(fit.corr,"cfi.robust"), 3),
round(fi(fit.cfa.bifactor,"cfi.robust") - fi(fit.corr,"cfi.robust"), 3)),
check.names = FALSE
)
kable(
comparison_table,
align = c("l", rep("c", ncol(comparison_table) - 1)),
digits = 3,
booktabs = TRUE,
escape = FALSE
) %>%
kable_styling(
bootstrap_options = c("striped","hover","condensed"),
full_width = TRUE,
font_size = 11
) %>%
row_spec(which(comparison_table$Model == "M2: Hierarchical (Primary)"),
bold = TRUE, background = "#EBF5FB") %>%
row_spec(0, bold = TRUE)