В связанном вопросе я спросил, почему существуют различия между stats::varimax
и GPArotation::Varimax
, оба из которых вызываются psych::principal
, в зависимости от параметра, установленного для rotate =
.
Различия между этими двумя (см. Другой вопрос) объясняют некоторые, но не все отличия от psych::principal
. Похоже, что эти различия каким-то образом усугубляются psych::principal
. (У меня есть простая теория, почему, и я хотел бы получить ее подтверждение).
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
Это кажется слишком большим для артефакта с плавающей запятой или чего-то в этом роде.
Моя гипотеза заключается в том, что (дополнительная) разница связана с тем фактом, что GPArotation::Varimax
по умолчанию имеет значение (Kaiser) normalize == FALSE
, тогда как **stats::varimax
по умолчанию имеет значение (Kaiser) normalize == TRUE
, что не может быть установлен иначе, чем внутри `principal::psych``.
stats::varimax
инструкция:
## varimax with normalize = TRUE is the default
GPArotation::Varimax
/ GPArotation::GPForth
руководство:
Аргумент normalize дает указание на то, должна ли и как должна быть выполнена какая-либо нормализация перед поворотом, а затем отменена после поворота. Если normalize имеет значение FALSE (по умолчанию), нормализация не выполняется. Если normalize имеет значение TRUE, выполняется нормализация по Кайзеру. (Поэтому квадраты строк нормализованной суммы A составляют 1,0. Иногда это называют нормализацией Хорста.)
Кроме того, они psych::Kaiser
руководство предупреждает:
Пакет GPArotation не нормализует (по умолчанию) и не работает fa. Затем, чтобы еще больше запутать, варимакс в статистике работает, а варимакс в GPArotation — нет.
Может ли кто-нибудь подтвердить, что разница на самом деле объясняется параметрами нормализации?