"Xoay vòng" là một cách tiếp cận được phát triển trong phân tích nhân tố; có các phép quay (chẳng hạn như varimax) được áp dụng cho tải , không hàm riêng của ma trận hiệp phương sai. Tải trọng là các hàm riêng được chia tỷ lệ theo căn bậc hai của các giá trị riêng tương ứng. Sau khi xoay varimax, các vectơ tải không còn trực giao nữa (mặc dù phép quay được gọi là "trực giao"), do đó, người ta không thể đơn giản tính toán các phép chiếu trực giao của dữ liệu lên các hướng tải được xoay.
Câu trả lời của @ FTusell giả định rằng xoay varimax được áp dụng cho các hàm riêng (không cho tải). Điều này sẽ là khá độc đáo. Vui lòng xem tài khoản chi tiết của tôi về PCA + varimax để biết chi tiết: PCA có được theo sau bởi một vòng quay (chẳng hạn như varimax) vẫn là PCA không? Tóm lại, nếu chúng ta nhìn vào SVD của ma trận dữ liệu , sau đó để xoay loadings phương tiện chèn R R ⊤ đối với một số vòng quay ma trận R như sau: X = ( U R ) ( R ⊤ S V ⊤ ) .X=USV⊤RR⊤RX=(UR)(R⊤SV⊤).
Nếu xoay được áp dụng cho tải (như thường lệ), thì có ít nhất ba cách dễ dàng để tính toán các máy tính xoay vòng varimax trong R:
Chúng có sẵn thông qua chức năng psych::principal
(chứng minh rằng đây thực sự là phương pháp tiêu chuẩn). Lưu ý rằng nó trả về điểm số được tiêu chuẩn hóa , tức là tất cả các PC có phương sai đơn vị.
Người ta có thể sử dụng varimax
chức năng thủ công để xoay các tải trọng, và sau đó sử dụng các tải trọng xoay mới để đạt được điểm số; người ta cần phải nhân nhiều dữ liệu với giả nghịch đảo của các tải được xoay (xem công thức trong câu trả lời này của @ttnphns ). Điều này cũng sẽ mang lại điểm số tiêu chuẩn.
Người ta có thể sử dụng varimax
chức năng để xoay các tải, và sau đó sử dụng $rotmat
ma trận xoay để xoay các điểm số tiêu chuẩn thu được với prcomp
.
Tất cả ba phương pháp đều cho kết quả như nhau:
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
Điều này mang lại ba đầu ra giống hệt nhau:
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
Lưu ý: Các varimax
hàm trong R sử dụng normalize = TRUE, eps = 1e-5
các thông số mặc định ( xem tài liệu ). Người ta có thể muốn thay đổi các tham số này (giảm eps
dung sai và quan tâm đến việc chuẩn hóa Kaiser) khi so sánh kết quả với các phần mềm khác như SPSS. Tôi cảm ơn @GottfriedHelms vì đã chú ý đến điều này. [Lưu ý: các tham số này hoạt động khi được truyền cho varimax
hàm, nhưng không hoạt động khi được truyền cho psych::principal
hàm. Đây có vẻ là một lỗi sẽ được sửa.]