«Повороты» - это подход, разработанный в факторном анализе; там вращения (такие как, например, varimax) применяются к нагрузкам , а не к собственным векторам ковариационной матрицы. Нагрузки являются собственными векторами, масштабированными по квадратным корням соответствующих собственных значений. После вращения варимакса векторы нагрузки больше не являются ортогональными (даже если вращение называется «ортогональным»), поэтому нельзя просто вычислить ортогональные проекции данных на повернутые направления загрузки.
Ответ @ FTusell предполагает, что поворот варимакса применяется к собственным векторам (не к нагрузкам). Это было бы довольно нетрадиционно. Пожалуйста, ознакомьтесь с подробным отчетом о моем PCA + varimax: после PCA все еще происходит ротация (например, varimax)? Вкратце, если мы посмотрим на SVD матрицы данных , то вращение нагрузок означает вставку R R ⊤ для некоторой матрицы вращения R следующим образом: X = ( U R ) ( R ⊤ S V ⊤ ) ,X=USV⊤RR⊤RX=(UR)(R⊤SV⊤).
Если вращение применяется к нагрузкам (как это обычно бывает), то существует как минимум три простых способа вычисления ПК с переменным поворотом в R:
Они легко доступны через функцию psych::principal
(демонстрируя, что это действительно стандартный подход). Обратите внимание, что он возвращает стандартизированные оценки , т. Е. Все компьютеры имеют дисперсию единиц.
Можно вручную использовать varimax
функцию для поворота нагрузок, а затем использовать новые повернутые нагрузки для получения баллов; необходимо умножить данные на транспонированные псевдообратные повернутые нагрузки (см. формулы в этом ответе @ttnphns ). Это также даст стандартизированные оценки.
Можно использовать varimax
функцию, чтобы вращать нагрузки, а затем использовать $rotmat
матрицу вращения, чтобы вращать стандартизированные оценки, полученные с prcomp
.
Все три метода дают одинаковый результат:
irisX <- iris[,1:4] # Iris data
ncomp <- 2
pca_iris_rotated <- psych::principal(irisX, rotate="varimax", nfactors=ncomp, scores=TRUE)
print(pca_iris_rotated$scores[1:5,]) # Scores returned by principal()
pca_iris <- prcomp(irisX, center=T, scale=T)
rawLoadings <- pca_iris$rotation[,1:ncomp] %*% diag(pca_iris$sdev, ncomp, ncomp)
rotatedLoadings <- varimax(rawLoadings)$loadings
invLoadings <- t(pracma::pinv(rotatedLoadings))
scores <- scale(irisX) %*% invLoadings
print(scores[1:5,]) # Scores computed via rotated loadings
scores <- scale(pca_iris$x[,1:2]) %*% varimax(rawLoadings)$rotmat
print(scores[1:5,]) # Scores computed via rotating the scores
Это дает три идентичных выхода:
1 -1.083475 0.9067262
2 -1.377536 -0.2648876
3 -1.419832 0.1165198
4 -1.471607 -0.1474634
5 -1.095296 1.0949536
Примечание . varimax
Функция в R normalize = TRUE, eps = 1e-5
по умолчанию использует параметры ( см. Документацию ). Можно хотеть изменить эти параметры (уменьшить eps
допуск и позаботиться о нормализации Кайзера) при сравнении результатов с другим программным обеспечением, таким как SPSS. Я благодарю @GottfriedHelms за то, что обратили на это мое внимание. [Примечание: эти параметры работают при передаче в varimax
функцию, но не работают при передаче в psych::principal
функцию. Похоже, это ошибка, которая будет исправлена.]