In a [related question](https://stackoverflow.com/questions/32350891/why-are-there-differences-between-gparotationvarimax-and-statsvarimax), 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?