In a related question, I have asked why there are differences between stats::varimax
and GPArotation::Varimax
, both of which psych::principal
calls, depending on the option set for rotate =
.
The differences between these two (see other question) account for some, but not all of the differences from psych::principal
.
It appears that these differences somehow get exacerbated by psych::principal
.
(I have a simple theory why, and I'd like to get that confirmed).
library(GPArotation)
library(psych)
data("Thurstone")
principal.unrotated <- principal(r = Thurstone, nfactors = 4, rotate = "none") # find unrotated PCs first
loa <- unclass(principal.unrotated$loadings)
# just to compare that the rot.mat is correct
varimax.stats <- stats::varimax(x = loa, normalize = TRUE)
varimax.GPA <- GPArotation::Varimax(L = loa, normalize = TRUE)
# notice we're here NOT interested in the difference between stats and GPA, that's the other question
diff.from.rot.meth <- unclass(varimax.stats$loadings - varimax.GPA$loadings) # very small differences, see this question: https://stackoverflow.com/questions/32350891/why-are-there-differences-between-gparotationvarimax-and-statsvarimax
mean(abs(diff.from.rot.meth))
#> [1] 8.036863e-05
principal.varimax.stats <- principal(r = Thurstone, nfactors = 4, rotate = "varimax")
principal.Varimax.GPA <- principal(r = Thurstone, nfactors = 4, rotate = "Varimax")
diff.from.princ <- principal.Varimax.GPA$rot.mat - principal.varimax.stats$rot.mat # quite a substantial change, because Theta is NOT a rotmat, that makes sense
mean(abs(diff.from.princ))
#> [1] 0.021233
mean(abs(diff.from.rot.meth)) - mean(abs(diff.from.princ)) # principal has MUCH bigger differences
#> [1] -0.02115263
This seems way too big for just a floating point artefact or something.
My hypothesis would be that the (additional) difference stems from the fact that GPArotation::Varimax
defaults to (Kaiser) normalize == FALSE
, whereas **stats::varimax
defaults to (Kaiser) normalize == TRUE
, which cannot be set differently from within `principal::psych``.
stats::varimax
manual:
## varimax with normalize = TRUE is the default
GPArotation::Varimax
/ GPArotation::GPForth
manual:
The argument normalize gives an indication of if and how any normalization should be done before rotation, and then undone after rotation. If normalize is FALSE (the default) no normalization is done. If normalize is TRUE then Kaiser normalization is done. (So squared row entries of normalized A sum to 1.0. This is sometimes called Horst normalization.)
Also, they psych::Kaiser
manual warns:
The GPArotation package does not (by default) normalize, nor does the fa function. Then, to make it more confusing, varimax in stats does,Varimax in GPArotation does not.
Can anyone confirm that the difference is, in fact, accounted for by the normalization options?