"회전"은 요인 분석에서 개발 된 접근 방식입니다. 공분산 행렬의 고유 벡터가 아닌 부하에 회전 (예 : varimax)이 적용됩니다 . 하중은 각 고유 값의 제곱근에 의해 스케일링 된 고유 벡터입니다. 바리 맥스 회전 후, 로딩 벡터는 더 이상 직교하지 않으며 (회전이 "직교"라고하더라도) 회전 된 로딩 방향으로의 데이터의 직교 투영을 단순히 계산할 수는 없다.
@FTusell의 답변은 가변 벡터 회전이 고유 벡터에 적용되는 것으로 가정합니다 (부하가 아닌). 이것은 매우 전통적인 일이 아닙니다. 자세한 내용은 PCA + varimax에 대한 자세한 설명을 참조하십시오. PCA와 회전 (varimax 등)이 여전히 PCA입니까? 요약하면, 우리는 데이터 행렬의 SVD 보면 후 삽입 로딩 수단을 회전, R R ⊤ 일부 회전 행렬 R 로서 다음과 같다 : X = ( U R ) ( R ⊤ S V ⊤ ) .X=USV⊤RR⊤RX=(UR)(R⊤SV⊤).
회전이 하중에 적용되는 경우 (보통 그대로), R에서 varimax-rotated PC를 계산하는 쉬운 세 가지 방법이 있습니다.
그것들은 기능을 통해 쉽게 이용할 수 있습니다 psych::principal
(실제로 표준 접근 방식임을 증명합니다). 표준화 된 점수를 반환합니다 . 즉, 모든 PC에는 단위 차이가 있습니다.
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
. 수정 될 버그 인 것 같습니다.]