회전의 효과 분석
- loadings에 제곱을 하면? 인자적재 값에 제곱을 한 것
- 인자적재 값들을 전부 더하면 1 - (uniqueness)와 같다는 사실을 알 수 있음.
- 1이 전체 분산임을 생각하면 됨.
열 단위 분석
r
> round(apply(loadings(d1.fa.1)^2, 2, var), 2)
Factor1 Factor2 Factor3
0.06 0.07 0.01
r
# varimax
> round(apply(loadings(d1.fa.2)^2, 2, var), 2)
Factor1 Factor2 Factor3
0.12 0.14 0.13
r
# promax
> round(apply(loadings(d1.fa.3)^2, 2, var), 2)
Factor1 Factor2 Factor3
0.20 0.24 0.14
- 결과 : varimax, promax의 치우침의 결과가 더 심하다.
행 단위 분석
r
> round(apply(loadings(d1.fa.1)^2, 1, var), 2)
X1 X2 X3 X4 X5 X6 X7 X8
0.01 0.11 0.09 0.19 0.02 0.02 0.01 0.08
> round(apply(loadings(d1.fa.2)^2, 1, var), 2)
X1 X2 X3 X4 X5 X6 X7 X8
0.27 0.30 0.18 0.17 0.14 0.01 0.00 0.21
> round(apply(loadings(d1.fa.3)^2, 1, var), 2)
X1 X2 X3 X4 X5 X6 X7 X8
0.46 0.48 0.27 0.18 0.18 0.00 0.00 0.23
결과를 해석해 보면 다음과 같다.
- x1의 경우, 회전에 따라 크기가 많이 변함 → 공통인자 중 어떤 것에 몰려 있음을 볼 수 있다.
- 반면 x3의 경우, 그렇지 않음 → 골고루 펴져 있음을 알 수 있다.
biplot 그려보기
r
par(mfrow = c(2, 3))
D1 = d1.fa.1$loadings[1:pp, 1:2]
biplot(x = D1, y = D1)
D1 = d1.fa.2$loadings[1:pp, 1:2]
biplot(x = D1, y = D1)
D1 = d1.fa.3$loadings[1:pp, 1:2
biplot(x = D1, y = D1)
plot(1, 1, type="n", bty="n", axes=F, xlab="", ylab="")
D1 = d1.fa.4$loadings[1:pp, 1:2]
biplot(x = D1, y = D1)
D1 = d1.fa.5$loadings[1:pp, 1:2]
biplot(x = D1, y = D1)
- 1번째 사진 : 각 변수들이 골고루 퍼져 있어서 공통요인이 원자료에 주는 효과를 빠르게 파악하기 힘듬
- 나머지 사진 : 각 변수들이 치우쳐져 있어서 공통요인이 원자료에 주는 효과를 빠르게 파악 가능.
공통인자 간 우선순위
공통인자 간의 우선순위가 있을까?
- 1st 공통인자의 제곱합, 2nd 공통인자의 제곱합, 3rd 공통인자의 제곱합..
- 주성분분석의 누적설명력과 비슷한 의미 → 인자의 갯수를 파악하는 도구
- 아까와 같은 코드로 하면 된다.
r
par(mfrow = c(2, 3))
D1 = d1.fa.1$loadings[1:pp, 2:3]
biplot(x = D1, y = D1)
D1 = d1.fa.2$loadings[1:pp, 2:3]
biplot(x = D1, y = D1)
D1 = d1.fa.3$loadings[1:pp, 2:3]
biplot(x = D1, y = D1)
plot(1, 1, type="n", bty="n", axes=F, xlab="", ylab="")
D1 = d1.fa.4$loadings[1:pp, 2:3]
biplot(x = D1, y = D1)
D1 = d1.fa.5$loadings[1:pp, 2:3]
biplot(x = D1, y = D1)
화살표의 의미
- 길이 : 가중치 제곱의 합
- 짧다 = 설명이 잘 되지 않다 = uniqueness가 상당히 크다.
회전의 효과 분석 (2)
varimax()라는 함수를 적용해서 회전하기.
r
> ro = varimax(loadings(d1.fa.1))
> round(ro$rotmat %*% t(ro$rotmat), 3)
[,1] [,2] [,3]
[1,] 1 0 0
[2,] 0 1 0
[3,] 0 0 1
- 분산을 극대화하는 방향으로 회전. 큰 것은 더 커지고, 작은 것은 더 작아짐
ro$rotmat %*% t(ro$rotmat)= TT^{\prime} = I
r
> loadings(d1.fa.1) %*% ro$rotmat
[,1] [,2] [,3]
X1 0.1262027 0.1085855 -0.9520737
X2 0.9819372 -0.1406711 -0.1050899
X3 -0.3940723 0.1568596 0.9029346
X4 0.2688420 0.8840960 -0.2341366
X5 0.8390019 0.1559002 -0.2834472
X6 0.4878712 0.3042655 -0.3878306
X7 -0.3523686 0.2304347 0.1799434
X8 -0.3247535 0.9257145 0.1810774
- promax도 이러한 식으로 할 수 있다.
i번째 공통인자의 설명력 보기
전체 자료의 variance 대비 i번째 공통인자의 설명력도 확인해보자.
r
ratio = function(d){
x1 = apply(loadings(d)^2, 2, sum)
x2 = sum(x1 + sum(d$uniquenesses))
x1/x2
}
ratio(d1.fa.2)
ratio(d1.fa.3)
r
> ratio(d1.fa.2)
Factor1 Factor2 Factor3
0.2096971 0.1836316 0.1643491
> ratio(d1.fa.3)
Factor1 Factor2 Factor3
0.2119661 0.1976958 0.1610337
d1.fa.3 → promax : 공통인자의 독립성이 훼손된 상태 (그렇게 해서라도 설명력을 높이기)
- 따라서 i번째 공통인자, j번째 공통인자의 공분산이 반영된 상태.
- Var(aX + bY) = a^2\cdot Var(X) + b^2\cdot Var(Y) + 2ab\cdot Cov(X, Y)
요인분석 : 시계열자료
시계열 자료의 요인분석을 생각
cor(X) =
\begin{pmatrix}
1 & \rho & \rho^2 \\
\rho & \rho & \rho \\
\rho^2 & \rho & 1
\end{pmatrix}
- 상관계수 > 0 → 인접한 변수(X1, X2) : 상관계수가 높아짐
- 상관계수 < 0 → 인접한 변수(X1, X2) : 상관계수가 낮아짐
AR(1) 공분산행렬
r
library(MASS)
library(Matrix)
pp = 10
set.seed(2022)
AR_cov = function(r, p){
rrr = (1:p)
ttt = matrix(rrr, nrow = p, ncol = p, byrow = T)
return(r^abs(ttt - rrr))
}
r
m1 = matrix(rWishart(1, pp, AR_cov(0.9, pp)), pp)
bdiag(m1)
m2 = matrix(rWishart(1, pp, AR_cov(0.1, pp)), pp)
bdiag(m1, m2)
일반 자료 + 시계열 자료
r
> bdiag(diag(3), AR_cov(0.1, 3))
6 x 6 sparse Matrix of class "dsCMatrix"
[1,] 1 . . . . .
[2,] . 1 . . . .
[3,] . . 1 . . .
[4,] . . . 1.00 0.1 0.01
[5,] . . . 0.10 1.0 0.10
[6,] . . . 0.01 0.1 1.00