# 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("M1: Single Factor (CMB)", "M2: Correlated Factors",
"M3: Hierarchical (Primary)", "M4: 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),
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 = FALSE, font_size = 13) %>%
row_spec(which(comparison_table$Model == "M3: Hierarchical (Primary)"),
bold = TRUE, background = "#EBF5FB") %>%
row_spec(0, bold = TRUE)