data(GriffithMulaik, package = "GPArotation")
## Scree plot comparing raw versus reduced correlation matrix
## (Mulaik, 2018, recommends reduced matrix for ML factor analysis)
fa.un <- factanal(factors = 6, covmat = GriffithMulaik,
n.obs = 523, rotation = "none")
res.un <- quartimax(fa.un)
## Six factor oblimin rotation
res.ob <- oblimin(fa.un, randomStarts = 100)
summary(res.ob)
## Compare simple structure across rotation methods
res.vm <- Varimax(fa.un)
res.gm <- geominQ(fa.un, randomStarts = 100)
cat(sprintf("%-12s AUC = %.3f Hyperplane = %.1f pct\n",
"Varimax", GPArotation:::calc_AUC(res.vm)$AUC_mean,
GPArotation:::calc_hyperplane(res.vm)$HP_pct))
cat(sprintf("%-12s AUC = %.3f Hyperplane = %.1f pct\n",
"Oblimin", GPArotation:::calc_AUC(res.ob)$AUC_mean,
GPArotation:::calc_hyperplane(res.ob)$HP_pct))
cat(sprintf("%-12s AUC = %.3f Hyperplane = %.1f pct\n",
"GeominQ", GPArotation:::calc_AUC(res.gm)$AUC_mean,
GPArotation:::calc_hyperplane(res.gm)$HP_pct))
# \donttest{
## --- Theory-guided rotation via partially specified target ---
## Mulaik (2018) Table 8.7 specifies a CFA hypothesis matrix:
## * = free parameter (NA), o = constrained to zero (0)
GM_target <- matrix(c(
## F1 F2 F3 F4 F5 F6
NA, 0, 0, 0, NA, 0, ## ALLOW
NA, NA, 0, 0, NA, 0, ## OUTGO
0, NA, 0, 0, NA, 0, ## NONTALK
NA, 0, 0, 0, 0, 0, ## PERMISS
0, 0, NA, NA, 0, 0, ## FAIR
NA, NA, NA, NA, 0, 0, ## UNFRIEND
NA, NA, 0, NA, NA, 0, ## FORCELSS
NA, NA, 0, 0, NA, 0, ## RESTRAIN
NA, NA, 0, NA, NA, 0, ## NONDOMIN
0, 0, 0, NA, 0, 0, ## UNLOVING
0, 0, 0, 0, 0, NA, ## NONCNFRM
NA, 0, 0, 0, 0, NA, ## COMPLINT
0, NA, NA, 0, NA, 0, ## IMPARTL
0, 0, 0, 0, NA, 0, ## LEADER
0, NA, NA, NA, 0, 0, ## UNKIND
0, 0, 0, 0, 0, NA, ## UNCNVENT
0, 0, 0, NA, NA, 0, ## DIRECTNG
NA, 0, 0, 0, NA, NA, ## PROHIBTV
0, NA, 0, 0, 0, 0, ## UNGREGAR
0, 0, NA, NA, 0, 0, ## JUST
NA, NA, NA, NA, NA, 0, ## NEUTRAL
NA, NA, 0, NA, NA, NA, ## SOCIABLE
0, NA, 0, NA, 0, 0, ## UNAFFECT
0, NA, 0, NA, 0, NA ## REBELLOS
), nrow = 24, ncol = 6, byrow = TRUE)
rownames(GM_target) <- rownames(GriffithMulaik)
colnames(GM_target) <- paste0("F", 1:6)
## W: 1 = constrained to zero, 0 = free
GM_target_pst <- ifelse(is.na(GM_target), 0, GM_target)
GM_W <- ifelse(is.na(GM_target), 0, 1)
## Oblique PST closely replicates Mulaik (2018) Table 8.8 CFA solution
res.pstQ <- pstQ(fa.un, Target = GM_target_pst, W = GM_W)
print(res.pstQ)
## Compare data-driven vs theory-guided rotation
cat(sprintf("%-10s AUC = %.3f Hyperplane = %.1f pct\n",
"PST-Q", GPArotation:::calc_AUC(res.pstQ)$AUC_mean,
GPArotation:::calc_hyperplane(res.pstQ)$HP_pct))
cat(sprintf("%-10s AUC = %.3f Hyperplane = %.1f pct\n",
"Oblimin", GPArotation:::calc_AUC(res.ob)$AUC_mean,
GPArotation:::calc_hyperplane(res.ob)$HP_pct))
# }
Run the code above in your browser using DataLab