"Ротації" - це підхід, розроблений при факторному аналізі; там обертання (наприклад, варімакс) застосовуються до навантажень , а не до власних векторів коваріаційної матриці. Навантаження - це власні вектори, масштабовані квадратними коренями відповідних власних значень. Після обертання varimax вектори навантаження вже не є ортогональними (навіть якщо обертання називається "ортогональне"), тому не можна просто обчислити ортогональні проекції даних на повернутий напрямок навантаження.
@ Відповідь FTusell передбачає, що обертання varimax застосовується до власних векторів (не для навантажень). Це було б досить нетрадиційно. Будь ласка, дивіться детальну інформацію про PCA + varimax для деталей: Чи PCA супроводжується обертанням (наприклад, varimax), як і раніше PCA? Коротко, якщо ми подивимось на SVD матриці даних , то повернути навантаження означає вставити R R ⊤ для деякої матриці обертання R таким чином: X = ( U R ) ( R ⊤ S V ⊤ ) .Х= USV⊤R R⊤RХ= ( 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
толерантність та подбати про нормалізацію Kaiser), порівнюючи результати з іншим програмним забезпеченням, таким як SPSS. Я дякую @GottfriedHelms за те, що донесли це до моєї уваги. [Примітка: ці параметри працюють при передачі varimax
функції, але не працюють при передачі psych::principal
функції. Здається, це помилка, яку виправлять.]