factor_analysis
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionLast revisionBoth sides next revision | ||
factor_analysis [2018/12/05 12:27] – [Factor solution among many . . .] hkimscil | factor_analysis [2023/11/06 02:51] – [Communality (공통성)] hkimscil | ||
---|---|---|---|
Line 2: | Line 2: | ||
{{: | {{: | ||
{{: | {{: | ||
+ | {{: | ||
In order to understand factor analysis, <fc # | In order to understand factor analysis, <fc # | ||
Line 11: | Line 12: | ||
* **변수의 숫자를 요인으로 줄이는 기법**으로 변수가 독립변수/ | * **변수의 숫자를 요인으로 줄이는 기법**으로 변수가 독립변수/ | ||
* See [[# | * See [[# | ||
+ | * '' | ||
+ | |||
+ | {{: | ||
+ | * 컴퓨터 사용에 대한 태도 | ||
+ | * 통계에 (statistics) 태도 | ||
+ | * 수학에 대한 태도 | ||
+ | * 통계페키지 프로그램에 (SPSS) 대한 태도 | ||
+ | |||
+ | 얼뜻 눈으로 이 4개의 요인을 (혹은 단면, 측면, dimensions) 뽑아냈지만 응답자들의 응답에 섞인 상관관계에 기초하여 이런 요인들을 추출해 낼 수 있다면 좋겠는데 이것이 요인분석이 (factor analysis) 하는 일이다. 어떤 응답자가 수학이 싫은면 수학과 관련된 어떤 질문들에 대해서 비슷한 (상관관계가 높게) 답변을 할 것이니 가능한 것이다. | ||
+ | |||
<WRAP box> | <WRAP box> | ||
Questionnaire: | Questionnaire: | ||
Line 41: | Line 52: | ||
* **자료의 요약**: 여러 개의 변인들을 몇 개의 공통된 집단으로 묶음으로써 자료의 복잡성 줄이고 정보를 요약하는데 이용 | * **자료의 요약**: 여러 개의 변인들을 몇 개의 공통된 집단으로 묶음으로써 자료의 복잡성 줄이고 정보를 요약하는데 이용 | ||
- | * 아이디어, | + | * 아이디어, |
* 불필요한 **변인의 제거**: 변인군으로 묶이지 않은 변인을 제거함으로써 중요하지 않은 변인 선별가능 | * 불필요한 **변인의 제거**: 변인군으로 묶이지 않은 변인을 제거함으로써 중요하지 않은 변인 선별가능 | ||
* 측정도구의 **타당성 검증**: 동일한 개념을 측정한 변인들이 동일한 요인으로 묶이는지 여부 확인함으로써 측정도구 타당성을 검증하는데 이용 | * 측정도구의 **타당성 검증**: 동일한 개념을 측정한 변인들이 동일한 요인으로 묶이는지 여부 확인함으로써 측정도구 타당성을 검증하는데 이용 | ||
Line 74: | Line 85: | ||
\end{equation} | \end{equation} | ||
- | 위 식 [1]에서 | + | 위 식 $(1)$에서 |
- | 한편, $\beta_{ij}$ 는 표준화된 correlation coefficient 값을 말한다 (regression에서 beta값) -- factor analysis에서는 흔히 factor loading이라고 부른다. beta를 해석하는 방법과 마찬가지로 factor loading 값은 F1이나 F2의 인자가 finance (혹은 다른 변인 점수) 점수에 얼마나 기여하는지를 나타내 주는 지표라고 하겠다. | + | 한편, $\beta_{ij}$ 는 표준화된 correlation coefficient 값을 말한다 (regression에서 beta값) -- factor analysis에서는 흔히 factor loading이라고 부른다. beta를 해석하는 방법과 마찬가지로 factor loading 값은 F1이나 F2의 인자가 finance (혹은 다른 변인 점수, $Y_{i}$) 점수에 얼마나 기여하는지를 나타내 주는 지표라고 하겠다. |
- | 상식을 이용해서 문제를 살펴보면, | + | 상식을 이용해서 문제를 살펴보면, |
< | < | ||
Line 91: | Line 102: | ||
위의 요인이 포함된 regression공식이 갖는 가정은 다음과 같다. | 위의 요인이 포함된 regression공식이 갖는 가정은 다음과 같다. | ||
- $E(e_{i}) = 0, \quad Var(e_{i}) = \sigma^2_{i}$ | - $E(e_{i}) = 0, \quad Var(e_{i}) = \sigma^2_{i}$ | ||
+ | * error의 분포에 관한 내용이다. | ||
* expected value = mean of error terms = 0, with standard deviation = $\sigma_{i}$ | * expected value = mean of error terms = 0, with standard deviation = $\sigma_{i}$ | ||
* 에러는 평균 0을 중심으로 무작위로 펼쳐져 있는 상태가 가정되므로 위와 같은 성격을 갖는다. | * 에러는 평균 0을 중심으로 무작위로 펼쳐져 있는 상태가 가정되므로 위와 같은 성격을 갖는다. | ||
- $E(F_{j}) = 0, \quad Var(F_{j}) = 1 $ | - $E(F_{j}) = 0, \quad Var(F_{j}) = 1 $ | ||
+ | * F는 표준화된 coefficient로 | ||
* Factors are standardized with mean =0, standard deviation = 1. Hence, Var(F) = 1. | * Factors are standardized with mean =0, standard deviation = 1. Hence, Var(F) = 1. | ||
* factors의 계수를 내기 전의 data는 표준점수 처리가 된 것을 가정한다. 따라서, F의 mean과 standard deviation값은 각각 0과 1이어야 하고, 따라서 F의 variance값 또한 1이 된다. | * factors의 계수를 내기 전의 data는 표준점수 처리가 된 것을 가정한다. 따라서, F의 mean과 standard deviation값은 각각 0과 1이어야 하고, 따라서 F의 variance값 또한 1이 된다. | ||
Line 101: | Line 114: | ||
$$Y_{i} = \beta_{i0} + \beta_{i1}F_{1} + \beta_{i2}F_{2} + (1) e_{i} $$ | $$Y_{i} = \beta_{i0} + \beta_{i1}F_{1} + \beta_{i2}F_{2} + (1) e_{i} $$ | ||
- | \begin{eqnarray*} | + | \begin{align*} |
- | Var(Y_i) &=& \beta^2_{i1}Var(F1) + \beta^2_{i2}Var(F2) + (1)^2Var(e_i) \\ | + | Var(Y_i) & = \beta^2_{i1}Var(F1) + \beta^2_{i2}Var(F2) + (1)^2Var(e_i) \\ |
- | &=& \underbrace{ \beta^2_{i1} + \beta^2_{i2} }_\text{communality} \: + \: \underbrace{ \sigma^2_{i} }_\text{specific variance} | + | & = \underbrace{ |
- | \end{eqnarray*} | + | \end{align*} |
Variance 성질에 따라서 우리는 다음을 도출할 수 있다. | Variance 성질에 따라서 우리는 다음을 도출할 수 있다. | ||
* $\beta_{i0}$는 상수(constant)이므로 0, | * $\beta_{i0}$는 상수(constant)이므로 0, | ||
- | * F1, F2 의 분산값은 1이고, coefficient값은 F1 요인에 곱한 상수이므로 분산을 구하기 위해서는 제곱을 해야 한다. 따라서, F1 F2에 해당하는 분산값은 각각 $\beta^2_{i1} + \beta^2_{i2}$ | + | * $F1$, $F2$ 의 분산값은 1이고, coefficient값은 |
* error term의 분산값은 위 가정에서 언급된 것처럼 $\sigma^2_{i}$ | * error term의 분산값은 위 가정에서 언급된 것처럼 $\sigma^2_{i}$ | ||
* 이를 해석하자면, | * 이를 해석하자면, | ||
- | * fiance (혹은 다른 시험) 점수의 총 분산값은 F1과 F2의 coefficient(loading)값을 각각 제곱해서 더한 것에 | + | * fiance (혹은 다른 시험) 점수의 총 분산값은 |
* 에러의 분산값을 더한 것과 같다. | * 에러의 분산값을 더한 것과 같다. | ||
* 여기서 loading 제곱의 합은 regression으로 설명되는 부분이고 | * 여기서 loading 제곱의 합은 regression으로 설명되는 부분이고 | ||
* 에러의 분산값은 어느 factor에도 기여를 하지 못하는 나머지 부분이다. | * 에러의 분산값은 어느 factor에도 기여를 하지 못하는 나머지 부분이다. | ||
- | * 즉, fiance의 분산값은 F1, F2가 기여하는 부분과 이 둘에 포함되지 않는 나머지로 나눌 수 있다. 이는 regression에서 explained(regression) variance와 unexplained variance를 이야기 하는 것과 같은 이치이다. | + | * 즉, fiance의 분산값은 |
- | * 앞의 두 coefficient(계수 혹은 factor loading)을 communality라고 부른다. 이 이름이 자연스러운 것은 Y의 총분산 중 두 요인(F1, F2)이 __공통적으로__ 기여하는 부분의 분산이기 때문이다. | + | * 앞의 두 coefficient(계수 혹은 factor loading)을 |
- | * 따라서, 마지막 에러텀에 해당하는 분산은 specific variance라고 이름을 붙히는 것이 자연스럽다. 즉, Y의 총 분산 중 어느 요인에게도 영향을 받지 않는 나머지 즉, 공통적(communality)인 것에서 specific한 분산의 부분이다. | + | * 따라서, 마지막 에러텀에 해당하는 분산은 specific variance라고 이름을 붙히는 것이 자연스럽다. 즉, Y의 총 분산 중 어느 요인에게도 영향을 받지 않는 나머지 즉, 공통적(communality)인 것에서 |
이를 covariance matrix에 정리하자면 아래와 같다. | 이를 covariance matrix에 정리하자면 아래와 같다. | ||
Line 131: | Line 144: | ||
한편, 두 변인 (가령, fiance점수와 marketing점수) 간의 covariance를 구하는 것과 관련해서는: | 한편, 두 변인 (가령, fiance점수와 marketing점수) 간의 covariance를 구하는 것과 관련해서는: | ||
- | \begin{eqnarray*} | + | \begin{align*} |
- | Y_{i} =& \beta_{i0} + \beta_{i1}F1 + \beta_{i2}F2 + (1)e_{i} + (0)e_{j} \\ | + | Y_{i} |
- | Y_{j} =& \beta_{j0} + \beta_{j1}F1 + \beta_{j2}F2 + (0)e_{i} + (1)e_{j} | + | Y_{j} |
- | \end{eqnarray*} | + | Cov(Y_{i}, Y_{j}) & = \beta_{i1}\beta_{j1}Var(F1) + \beta_{i2}\beta_{j2}Var(F2) + (1)(0)Var(e_{i}) + (0)(1)Var(e_{i}) \\ |
- | + | & = \beta_{i1} \beta_{j1} + \beta_{i2} \beta_{j2} | |
- | \begin{eqnarray*} | + | \end{align*} |
- | Cov(Y_{i}, Y_{j}) &=& \beta_{i1}\beta_{j1}Var(F1) + \beta_{i2}\beta_{j2}Var(F2) + (1)(0)Var(e_{i}) + (0)(1)Var(e_{i}) \\ | + | |
- | &=& \beta_{i1}\beta_{j1} + \beta_{i2}\beta_{j2} | + | |
- | \end{eqnarray*} | + | |
위에서 | 위에서 | ||
Line 175: | Line 185: | ||
| Y3 | $S_{31}$ | | Y3 | $S_{31}$ | ||
- | 실제 데이터에서 구한 variance covariance table은 아래와 같다. | + | 실제 데이터에서 구한 variance covariance table은 아래와 같다((편의상 여기 분산값은 n으로 (n-1이 아닌) 나눠 준 것)). |
| Variable | | Variable | ||
Line 181: | Line 191: | ||
| Y2 | -0.36 | 5.04 | 3.84 | | | Y2 | -0.36 | 5.04 | 3.84 | | ||
| Y3 | 0.44 | 3.84 | 3.04 | | | Y3 | 0.44 | 3.84 | 3.04 | | ||
+ | |||
+ | |||
+ | 실제 데이터로 구한 covariance matrix (가). | ||
+ | < | ||
+ | ## 예를 들어 | ||
+ | fd <- read.csv(" | ||
+ | fd <- fd[, -1] # 처음 id 컬럼 지우기 | ||
+ | cov(fd) | ||
+ | |||
+ | </ | ||
$$ | $$ | ||
Line 190: | Line 210: | ||
$$ | $$ | ||
+ | 아래는 설명한 것과 같이 이론적으로 구한 covariance matrix 이다 (나). | ||
$$ | $$ | ||
\begin{pmatrix} | \begin{pmatrix} | ||
Line 198: | Line 219: | ||
$$ | $$ | ||
+ | 실제 데이터에서 구한 variance covariance 값과 (위에서 가) factor 분석에 기반한 이론 적인 variance covariance 테이블을 (위에서 나) 비교해 볼 수 있다. 이를 통해서 각 Factor의 $\beta_{ij}$ laoding 값을 유추해 볼 수 있을 것이다. Regression방법은 F1과 F2가 observed된 변인이 아니기에 할 수가 없었고, 위의 방법으로 Beta값들을 구한다면 각 **요인(factor)**에 대한 beta값을 바탕으로 변인들에 대한 regression공식을 완성할 수 있게 된다. | ||
+ | ====== Interpretation of factor loading and the rotation method ====== | ||
- | 실제 데이터에서 구한 variance covariance 값과 factor | + | 위의 |
- | + | ||
- | ====== Interpretation of factor | + | |
- | 위의 분석작업을 통해서 아래와 같은 regression 공식을 얻었다고 | + | 좀 더 설명하자면 우리가 regression에서 배운 것에 의하면 |
Model A | Model A | ||
Line 214: | Line 235: | ||
위의 공식을 토대로 아래와 같은 variance covariance matrix를 구해 볼 수 있다. 이는 | 위의 공식을 토대로 아래와 같은 variance covariance matrix를 구해 볼 수 있다. 이는 | ||
- | | + | \begin{align*} |
- | * Covariance(Y1, Y2) = (0.5)(0.3) + (0.5)(0.3) = 0.3 | + | \text{Var}_\text{(Y1)} & = (0.5)^2 + (0.5)^2 + \sigma^2_{1} |
+ | & = 0.5 + \sigma^2_{1} | ||
+ | \text{Cov}_\text{(Y1, Y2)} & = (0.5)(0.3) + (0.5)(0.3) | ||
+ | & = 0.3 | ||
+ | \end{align*} | ||
과 같은 방법으로 구한 것이다. | 과 같은 방법으로 구한 것이다. | ||
Line 221: | Line 246: | ||
< | < | ||
| Variable | | Variable | ||
- | | Y1 | 0.5 + $\sigma^2_{1}$ | + | | Y1 | 0.5 + $\sigma^2_{1}$ |
- | | Y2 | 0.3 | 0.18 + $\sigma^2_{2}$ | + | | Y2 | 0.3 | 0.18 + $\sigma^2_{2}$ |
- | | Y3 | 0 | 0 | 0.5 + $\sigma^2_{3}$ | + | | Y3 | 0.5 | 0.3 | 0.5 + $\sigma^2_{3}$ |
</ | </ | ||
한편 아래의 공식에서 또한 이론적인 variance covariance matrix를 구해볼 수 있는데, 이는 위의 theoretical variance covariance 매트릭스와 동일한 것이다. | 한편 아래의 공식에서 또한 이론적인 variance covariance matrix를 구해볼 수 있는데, 이는 위의 theoretical variance covariance 매트릭스와 동일한 것이다. | ||
Model B | Model B | ||
- | \begin{eqnarray*} | + | \begin{align*} |
- | Y_{1} =& (\sqrt2/2) F1 + 0 F2 + e_{1} \\ | + | Y_{1} & = (\sqrt{2}/{2}) F1 + 0 F2 + e_{1} \\ |
- | Y_{2} =& (0.3\sqrt2) F1 + 0 F2 + e_{2} \\ | + | Y_{2} & = (0.3\sqrt{2}) F1 + 0 F2 + e_{2} \\ |
- | Y_{3} =& 0 F1 - (\sqrt2/2) F2 + e_{3} \\ | + | Y_{3} & = 0 F1 - (\sqrt{2}/2) F2 + e_{3} \\ |
- | \end{eqnarray*} | + | \end{align*} |
즉, | 즉, | ||
- | | + | \begin{align*} |
- | * $Cov(Y_{1}, Y_{2}) = (\sqrt2/2) * (0.3\sqrt2) = 0.3 $ | + | Var(Y_{1}) & = ({\sqrt2}/ |
+ | Cov(Y_{1}, Y_{2}) | ||
+ | \end{align*} | ||
등을 통해서 구한 matrix는 위의 theoretical variance covariance 매트릭스와 동일한 내용을 같는다. | 등을 통해서 구한 matrix는 위의 theoretical variance covariance 매트릭스와 동일한 내용을 같는다. | ||
Line 246: | Line 273: | ||
====== Factor solution among many . . . ====== | ====== Factor solution among many . . . ====== | ||
- | Principal component factor analysis | ||
| Variable, \\ Y< | | Variable, \\ Y< | ||
Line 255: | Line 281: | ||
각 변인의 Observed Variance는 df (즉, n-1)을 사용하는 대신 n을 사용하여 구함. | 각 변인의 Observed Variance는 df (즉, n-1)을 사용하는 대신 n을 사용하여 구함. | ||
+ | |||
+ | < | ||
+ | fd <- read.csv(" | ||
+ | m.fin <- mean(fd$finance) | ||
+ | m.mar <- mean(fd$marketing) | ||
+ | m.pol <- mean(fd$policy) | ||
+ | fin <- fd$finance | ||
+ | mar <- fd$marketing | ||
+ | pol <- fd$policy | ||
+ | n.fin <- length(fin) | ||
+ | n.mar <- length(mar) | ||
+ | n.pol <- length(pol) | ||
+ | |||
+ | sum((fin-m.fin)^2)/ | ||
+ | sum((mar-m.mar)^2)/ | ||
+ | sum((pol-m.pol)^2)/ | ||
+ | |||
+ | </ | ||
< | < | ||
> fd <- read.csv(" | > fd <- read.csv(" | ||
- | > attach(fd) | + | > m.fin <- mean(fd$finance) |
- | > m.fin <- mean(finance) | + | > m.mar <- mean(fd$marketing) |
- | > m.mar <- mean(marketing) | + | > m.pol <- mean(fd$policy) |
- | > m.pol <- mean(policy) | + | > fin <- fd$finance |
- | > fin <- finance | + | > mar <- fd$marketing |
- | > mar <- marketing | + | > pol <- fd$policy |
- | > pol <- policy | + | |
> n.fin <- length(fin) | > n.fin <- length(fin) | ||
> n.mar <- length(mar) | > n.mar <- length(mar) | ||
Line 280: | Line 323: | ||
| Variable, \\ Y< | | Variable, \\ Y< | ||
| (1) | (2) | $F_{1}, b_{i1}$ \\ (3) | $F_{2}, b_{i2}$ \\ (4) | (5) | (6) = 100 x (5)/ | | (1) | (2) | $F_{1}, b_{i1}$ \\ (3) | $F_{2}, b_{i2}$ \\ (4) | (5) | (6) = 100 x (5)/ | ||
- | | Finance, $Y_{1}$ | + | | Finance, $Y_{1}$ |
| Marketing, $Y_{2}$ | | Marketing, $Y_{2}$ | ||
| policy, $Y_{3}$ | | policy, $Y_{3}$ | ||
- | | Overall \\ SS loadings | + | | Overall \\ SS loadings |
| | | 55.1% \\ (10) / (9) = | 44.7% \\ (11) / (9) = | | | | | | | | 55.1% \\ (10) / (9) = | 44.7% \\ (11) / (9) = | | | | | ||
+ | |||
+ | 12) F1 F2가 공히 (commune) y분산에 기여하는 부분 = communality | ||
각주 1) -> finance = 수학능력 = F1 | 각주 1) -> finance = 수학능력 = F1 | ||
각주 2), 3) -> marketing, policy = 언어능력 = F2 | 각주 2), 3) -> marketing, policy = 언어능력 = F2 | ||
- | 각주 | + | 각주 |
< | < | ||
> l.f <- 3.136773 | > l.f <- 3.136773 | ||
Line 298: | Line 344: | ||
> </ | > </ | ||
+ | |||
+ | |||
+ | < | ||
+ | > fd | ||
+ | finance marketing policy | ||
+ | 1 | ||
+ | 2 | ||
+ | 3 10 | ||
+ | 4 | ||
+ | 5 10 | ||
+ | |||
+ | 아래는 population variance, sd를 구하기 위한 function | ||
+ | < | ||
+ | + | ||
+ | + } | ||
+ | > psd <- function(x) { | ||
+ | + sqrt (sum((x - mean(x))**2) / length(x)) | ||
+ | + }</ | ||
+ | |||
+ | < | ||
+ | > tapply(fds$values, | ||
+ | finance marketing | ||
+ | 6.6 | ||
+ | > tapply(fds$values, | ||
+ | finance marketing | ||
+ | | ||
+ | > options(digits=5) | ||
+ | > tapply(fds$values, | ||
+ | finance marketing | ||
+ | | ||
+ | > | ||
+ | </ | ||
| Standardized \\ Variable, \\ Y< | | Standardized \\ Variable, \\ Y< | ||
Line 336: | Line 414: | ||
===== Eigenvalue (고유값) ===== | ===== Eigenvalue (고유값) ===== | ||
- | 특정요인의 모든 요인적재량(factor loadings)을 제곱하여 합한 값이다. 특정요인이 설명하는 총분산을 의미한다. | + | 특정요인의 모든 요인적재량(factor loadings)을 제곱하여 합한 값이다. 특정요인이 |
| | | | ||
| Variable | | Variable | ||
Line 355: | Line 433: | ||
===== Communality (공통성) ===== | ===== Communality (공통성) ===== | ||
특정변수의 모든 요인적재량을 제곱하여 합한 값이다. 아래에서 변인 climate의 변량에 대해서 추출된 세 요인이 기여하는 분산량의 정도를 의미한다. 이는 $ \hat{h_1} = 0.286^2 + 0.076^2 + 0.841^2 = 0.795 $ 와 같이 표현할 수 있다. 만약 세 요인(factor)을 이용해서 변인 Climate에 multiple regression을 한다면 구할 수 있는 R< | 특정변수의 모든 요인적재량을 제곱하여 합한 값이다. 아래에서 변인 climate의 변량에 대해서 추출된 세 요인이 기여하는 분산량의 정도를 의미한다. 이는 $ \hat{h_1} = 0.286^2 + 0.076^2 + 0.841^2 = 0.795 $ 와 같이 표현할 수 있다. 만약 세 요인(factor)을 이용해서 변인 Climate에 multiple regression을 한다면 구할 수 있는 R< | ||
- | | | + | | |
| Variable | | Variable | ||
| Climate | | Climate | ||
Line 368: | Line 446: | ||
이렇게 각 변인의 communality값을 구해보면 아래와 같은 테이블을 구할 수 있는데, 요인분석 모델은 Climate, Health, Arts, 그리고 economics의 변량을 가장 잘 설명한다고 하겠다. | 이렇게 각 변인의 communality값을 구해보면 아래와 같은 테이블을 구할 수 있는데, 요인분석 모델은 Climate, Health, Arts, 그리고 economics의 변량을 가장 잘 설명한다고 하겠다. | ||
- | |< 300px 30% - >| | + | |
| Variable | | Variable | ||
| Climate | | Climate | ||
Line 378: | Line 456: | ||
| Arts | @lightgreen: | | Arts | @lightgreen: | ||
| Recreation | | Recreation | ||
- | | Economics | + | | Economics |
| Total | | Total | ||
+ | ===== Specificity ===== | ||
+ | | Variable | ||
+ | | Climate | ||
+ | | Housing | ||
+ | | Health | ||
+ | | Crime | ||
+ | | Transportation | ||
+ | | Education | ||
+ | | Arts | 0.754 | | | ||
+ | | Recreation | ||
+ | | Economics | ||
+ | | Total | ||
====== Methods (functions) in R ====== | ====== Methods (functions) in R ====== | ||
Line 387: | Line 477: | ||
* see [[https:// | * see [[https:// | ||
- | ====== E.g. 2 ====== | + | ===== E.g. 2 ====== |
{{: | {{: | ||
+ | < | ||
+ | mydata <- read.csv(" | ||
+ | # if data as NAs, it is better to omit them: | ||
+ | my.data <- na.omit(my.data) | ||
+ | head(my.data) | ||
+ | </ | ||
+ | < | ||
+ | > mydata <- read.csv(" | ||
+ | > # if data as NAs, it is better to omit them: | ||
+ | > my.data <- na.omit(my.data) | ||
+ | > head(my.data) | ||
+ | BIO GEO CHEM ALG CALC STAT | ||
+ | 1 | ||
+ | 2 | ||
+ | 3 | ||
+ | 4 | ||
+ | 5 | ||
+ | 6 | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | n.factors <- 2 | ||
+ | |||
+ | fit <- factanal(my.data, | ||
+ | n.factors, | ||
+ | scores=c(" | ||
+ | rotation=" | ||
+ | |||
+ | print(fit, digits=2, cutoff=.3, sort=TRUE) | ||
+ | </ | ||
+ | < | ||
+ | > n.factors <- 2 | ||
+ | > | ||
+ | > fit <- factanal(my.data, | ||
+ | + | ||
+ | + | ||
+ | + | ||
+ | > | ||
+ | > print(fit, digits=2, cutoff=.3, sort=TRUE) | ||
+ | |||
+ | Call: | ||
+ | factanal(x = my.data, factors = n.factors, scores = c(" | ||
+ | |||
+ | # 각 변인이 2개의 (분석에서 2개의 factor를 추출하라고 | ||
+ | # 하였기때문에 2개) 팩터에 의해서 설명된 부분을 제외한 | ||
+ | # 나머지. 즉, 팩터로딩에 탑재되지 못한 부분을 | ||
+ | # Uniqueness라고 한다. | ||
+ | Uniquenesses: | ||
+ | | ||
+ | 0.25 0.37 0.25 0.37 0.05 0.71 | ||
+ | |||
+ | # 팩터로딩. print (fit)의 옵션으로 0.3 밑으로는 | ||
+ | # cutoff하고 sorting을 하라고 한 결과 | ||
+ | Loadings: | ||
+ | | ||
+ | ALG | ||
+ | CALC 0.97 | ||
+ | STAT 0.53 | ||
+ | BIO | ||
+ | GEO | ||
+ | CHEM 0.84 | ||
+ | |||
+ | | ||
+ | SS loadings | ||
+ | Proportion Var 0.34 0.32 | ||
+ | Cumulative Var 0.34 0.66 | ||
+ | |||
+ | # SS Loadings은 각 팩터에 탑재된 로딩값을 | ||
+ | # 제곱하여 모두 더한 것을 말한다. 전체 SS | ||
+ | # 값에 비례하여 본 것으로 .34와 .32 (합쳐 | ||
+ | # 서 .66)이 두 팩터에 의해서 설명된다고 | ||
+ | # 할 수 있음 | ||
+ | |||
+ | |||
+ | Test of the hypothesis that 2 factors are sufficient. | ||
+ | The chi square statistic is 2.94 on 4 degrees of freedom. | ||
+ | The p-value is 0.568 | ||
+ | > | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | > head(fit$scores) | ||
+ | | ||
+ | 1 -1.9089514 -0.52366961 | ||
+ | 2 0.9564370 | ||
+ | 3 -1.5797564 | ||
+ | 4 0.7909078 -0.28205710 | ||
+ | 5 -0.1127541 -0.03603192 | ||
+ | 6 0.6901869 -1.31361815 | ||
+ | > | ||
+ | </ | ||
+ | |||
+ | Factor scores는 각 팩터에 대한 표준화된 b값을 (베타값) 말한다. 두 개의 팩터를 각각 수학과 과학영역으로 정의하면 첫 번째 subject는 -1.9089514*수학 + -0.52366961*과학으로 구성되어 있다고 하겠다. 그러나, 위의 solution은 두 팩터를 독립화(무상관관계, | ||
+ | |||
+ | |||
+ | < | ||
+ | load <- fit$loadings[, | ||
+ | plot(load, | ||
+ | text(load, | ||
+ | </ | ||
+ | {{: | ||
+ | |||
+ | < | ||
+ | n.factors, | ||
+ | rotation=" | ||
+ | |||
+ | load <- fit$loadings[, | ||
+ | load | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | + | ||
+ | + | ||
+ | > | ||
+ | > load <- fit$loadings[, | ||
+ | > load | ||
+ | Factor1 | ||
+ | BIO 0.85456336 0.13257053 | ||
+ | GEO 0.77932854 0.13455074 | ||
+ | CHEM 0.86460737 0.05545425 | ||
+ | ALG 0.03133486 0.79070534 | ||
+ | CALC 0.09671653 0.97107765 | ||
+ | STAT 0.16998499 0.50612151 | ||
+ | > | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | text(load, | ||
+ | </ | ||
+ | |||
+ | {{: | ||
+ | |||
+ | < | ||
+ | # install.packages(" | ||
+ | # install.packages(" | ||
+ | library(psych) | ||
+ | library(GPArotation) | ||
+ | solution <- fa(r = cor(my.data), | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | plot(solution, | ||
+ | </ | ||
+ | |||
+ | {{: | ||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
+ | Factor Analysis using method = pa | ||
+ | Call: fa(r = cor(my.data), | ||
+ | fm = " | ||
+ | Standardized loadings (pattern matrix) based upon correlation matrix | ||
+ | | ||
+ | BIO | ||
+ | GEO | ||
+ | CHEM 0.87 -0.05 0.75 0.253 1.0 | ||
+ | ALG -0.04 0.81 0.65 0.354 1.0 | ||
+ | CALC 0.01 0.96 0.92 0.081 1.0 | ||
+ | STAT 0.13 0.50 0.29 0.709 1.1 | ||
+ | |||
+ | | ||
+ | SS loadings | ||
+ | Proportion Var 0.36 0.31 | ||
+ | Cumulative Var 0.36 0.66 | ||
+ | Proportion Explained | ||
+ | Cumulative Proportion 0.54 1.00 | ||
+ | |||
+ | With factor correlations of | ||
+ | | ||
+ | PA1 1.00 0.21 | ||
+ | PA2 0.21 1.00 | ||
+ | |||
+ | Mean item complexity = 1 | ||
+ | Test of the hypothesis that 2 factors are sufficient. | ||
+ | |||
+ | The degrees of freedom for the null model are 15 and the objective function was 2.87 | ||
+ | The degrees of freedom for the model are 4 and the objective function was 0.01 | ||
+ | |||
+ | The root mean square of the residuals (RMSR) is 0.01 | ||
+ | The df corrected root mean square of the residuals is 0.02 | ||
+ | |||
+ | Fit based upon off diagonal values = 1 | ||
+ | Measures of factor score adequacy | ||
+ | | ||
+ | Correlation of (regression) scores with factors | ||
+ | Multiple R square of scores with factors | ||
+ | Minimum correlation of possible factor scores | ||
+ | > | ||
+ | </ | ||
+ | ===== another solution ===== | ||
< | < | ||
// | // | ||
Line 399: | Line 683: | ||
> data <- read.csv(" | > data <- read.csv(" | ||
> data <- read.csv(" | > data <- read.csv(" | ||
+ | > data <- read.csv(" | ||
> #display the data (warning: large output - only the first 10 rows are shown here) | > #display the data (warning: large output - only the first 10 rows are shown here) | ||
Line 478: | Line 763: | ||
====== E.g. 1 ====== | ====== E.g. 1 ====== | ||
- | < | + | < |
+ | > # d <- read.table(" | ||
+ | > d <- read.table(" | ||
> head(d) | > head(d) | ||
distant talkatv carelss hardwrk anxious agreebl tense | distant talkatv carelss hardwrk anxious agreebl tense | ||
Line 647: | Line 935: | ||
< | < | ||
library(psych) | library(psych) | ||
- | d.fa <- fa(d, rotate=" | + | d.fa <- fa(d, rotate=" |
- | names(d.fa) | + | names(d.fa) |
+ | </ | ||
- | plot(d.fa$e.values, | + | < |
+ | [1] " | ||
+ | [5] " | ||
+ | [9] " | ||
+ | [13] " | ||
+ | [17] " | ||
+ | [21] " | ||
+ | [25] " | ||
+ | [29] " | ||
+ | [33] " | ||
+ | [37] " | ||
+ | [41] " | ||
+ | [45] " | ||
+ | |||
+ | < | ||
d.fa$e.values | d.fa$e.values | ||
+ | </ | ||
+ | {{: | ||
+ | |||
+ | < | ||
# 6 under eigenvalue 1 | # 6 under eigenvalue 1 | ||
- | d.fa <- fa(d, nfactors=6, | + | d.fa <- fa(d, nfactors=6, |
d.fa.so <- fa.sort(d.fa) | d.fa.so <- fa.sort(d.fa) | ||
d.fa.so | d.fa.so | ||
Line 769: | Line 1076: | ||
</ | </ | ||
+ | ===== communality ===== | ||
+ | < | ||
+ | > fa.sort(data.frame(d.fa.so$communality)) | ||
+ | d.fa.so.communality order | ||
+ | outgoin | ||
+ | disorgn | ||
+ | organiz | ||
+ | quiet | ||
+ | tense | ||
+ | withdrw | ||
+ | sociabl | ||
+ | talkatv | ||
+ | relaxed | ||
+ | friendl | ||
+ | worryin | ||
+ | contrar | ||
+ | anxious | ||
+ | shy | ||
+ | lazy 0.5771937 | ||
+ | respnsi | ||
+ | hardwrk | ||
+ | carelss | ||
+ | kind 0.5251513 | ||
+ | discipl | ||
+ | laidbck | ||
+ | harsh | ||
+ | distant | ||
+ | coopera | ||
+ | opposng | ||
+ | agreebl | ||
+ | persevr | ||
+ | givinup | ||
+ | easygon | ||
+ | criticl | ||
+ | approvn | ||
+ | lax | ||
+ | > | ||
+ | </ | ||
===== eigenvalues ===== | ===== eigenvalues ===== | ||
+ | 위의 아웃풋에서 (d.fa.so) | ||
+ | SS loadings (eigenvalue 라고 부른다) | ||
< | < | ||
SS loadings | SS loadings | ||
Line 777: | Line 1124: | ||
Cumulative Proportion 0.25 0.43 0.60 0.75 0.88 1.00 | Cumulative Proportion 0.25 0.43 0.60 0.75 0.88 1.00 | ||
- | SS total = 32.14286 | ||
SS loadings = eigenvalues for each factor (MR1, . . . ) | SS loadings = eigenvalues for each factor (MR1, . . . ) | ||
</ | </ | ||
+ | |||
SS loadings | SS loadings | ||
- | Proportion Var | + | <code> |
+ | # SS total = 각 변인들의 분산을 (variation) 1 로 보았을 때 SS loading 값을 구한 것이므로 | ||
+ | # SS total 값은 각 변인들의 숫자만큼이 된다. 이 경우는 총 32개 문항이 존재하므로 32가 SS total | ||
+ | ss.tot = 32 | ||
+ | </code> | ||
+ | SS total <fc # | ||
+ | $\frac {4.5}{32} = 0.14$ | ||
+ | Proportion Var <fc # | ||
eigenvalues for factor 1 | eigenvalues for factor 1 | ||
- | < | + | |
- | d.fa.s.loadings.f1 <- d.fa.s$loadings[, | + | | SS loadings \\ eigenvalue |
- | ev_fa1 <- sum(data.frame(d.fa.s.loadings.f1)^2) | + | | | $\frac {4.5}{32}$ |
+ | | Proportion Var | 0.14 | 0.10 | 0.09 | 0.08 | 0.07 | 0.07 | | ||
+ | | Cumulative Var | 0.14 | 0.24 | 0.33 | 0.41 | 0.48 | 0.55 | | ||
+ | |||
+ | 아래는 loading값 중 첫번 째 팩터의 합을 (eigenvalue) | ||
+ | < | ||
+ | d.fa.so.loadings.f1 <- d.fa.so$loadings[, | ||
+ | ev_fa1 <- sum(data.frame(d.fa.so.loadings.f1)^2) | ||
# this value should be matched with SS loadings for MR1 | # this value should be matched with SS loadings for MR1 | ||
ev_fa1 | ev_fa1 | ||
Line 792: | Line 1153: | ||
</ | </ | ||
- | What is the total variance of all variables? | + | < |
- | \begin{eqnarray*} | + | > (4.50+3.19+2.97+2.55+2.31+2.16)/32 |
- | 4.5 : 0.14 =& x : 1.00 \\ | + | [1] 0.5525 |
- | x =& 4.5 / .14 \\ | + | |
- | =& 32.14286 | + | |
- | \end{eqnarray*} | + | |
- | + | ||
- | Proportion of Factor 1's contribution | + | |
- | < | + | |
- | [1] 0.1406331 | + | |
- | ></ | + | |
+ | > or | ||
+ | sum(d.fa.so.loadings^2)/ | ||
+ | </ | ||
===== specific variance ===== | ===== specific variance ===== | ||
1 - communality | 1 - communality | ||
Uniqueness | Uniqueness | ||
< | < | ||
- | data.frame(d.fa.s$uniquenesses) | + | data.frame(d.fa.so$uniquenesses) |
- | d.fa.s.uniquenesses | + | d.fa.so.uniquenesses |
outgoin | outgoin | ||
quiet | quiet | ||
Line 847: | Line 1203: | ||
uniqueness for variable 1 (v1) | uniqueness for variable 1 (v1) | ||
- | < | + | < |
- | > d.fa.s.communality.v1 <- sum(d.fa.s.loadings.v1^2) | + | > d.fa.so.communality.v1 <- sum(d.fa.so.loadings.v1^2) |
- | > d.fa.s.uniqeness.v1 <- 1 - d.fa.s.communality.v1 | + | > d.fa.so.uniqeness.v1 <- 1 - d.fa.so.communality.v1 |
- | > d.fa.s.communality.v1 | + | > d.fa.so.communality.v1 |
[1] 0.737626 | [1] 0.737626 | ||
- | > d.fa.s.uniqeness.v1 | + | > d.fa.so.uniqeness.v1 |
[1] 0.262374 | [1] 0.262374 | ||
> </ | > </ | ||
- | > d.fa.s.communality.v1 | + | > d.fa.so.communality.v1 |
- | > d.fa.s.uniqeness.v1 | + | > d.fa.so.uniqeness.v1 |
===== plotting ===== | ===== plotting ===== | ||
intronductory | intronductory | ||
< | < | ||
- | load12 <- d.fa.s$loadings[, | + | load12 <- d.fa.so$loadings[, |
plot(load12, | plot(load12, | ||
- | text(load12, | + | text(load12, |
</ | </ | ||
< | < | ||
- | load23 <- d.fa.s$loadings[, | + | load23 <- d.fa.so$loadings[, |
plot(load23, | plot(load23, | ||
- | text(load23, | + | text(load23, |
</ | </ | ||
< | < | ||
- | load123 <- d.fa.s$loadings[, | + | load123 <- d.fa.so$loadings[, |
plot(load123, | plot(load123, | ||
- | text(load123, | + | text(load123, |
</ | </ | ||
====== E.g., 4 ====== | ====== E.g., 4 ====== | ||
Line 1112: | Line 1468: | ||
head(saq) | head(saq) | ||
</ | </ | ||
+ | |||
+ | see [[:SAQ dataset]] | ||
====== e.g., 5 ====== | ====== e.g., 5 ====== | ||
{{: | {{: | ||
+ | ====== e.g. secu com finance 2007 example | ||
+ | {{: | ||
+ | |||
+ | < | ||
+ | Sys.setlocale(" | ||
+ | secu_com_finance_2007 <- read.csv(" | ||
+ | secu_com_finance_2007 | ||
+ | |||
+ | # V1 : 총자본순이익율 | ||
+ | # V2 : 자기자본순이익율 | ||
+ | # V3 : 자기자본비율 | ||
+ | # V4 : 부채비율 | ||
+ | # V5 : 자기자본회전율 | ||
+ | |||
+ | # 표준화 변환 (standardization) | ||
+ | secu_com_finance_2007 <- transform(secu_com_finance_2007, | ||
+ | V1_s = scale(V1), | ||
+ | V2_s = scale(V2), | ||
+ | V3_s = scale(V3), | ||
+ | V4_s = scale(V4), | ||
+ | V5_s = scale(V5)) | ||
+ | |||
+ | # 부채비율(V4_s)을 방향(max(V4_s)-V4_s) 변환 | ||
+ | secu_com_finance_2007 <- transform(secu_com_finance_2007, | ||
+ | |||
+ | # variable selection | ||
+ | secu_com_finance_2007_2 <- secu_com_finance_2007[, | ||
+ | |||
+ | # Correlation analysis | ||
+ | cor(secu_com_finance_2007_2[, | ||
+ | |||
+ | round(cor(secu_com_finance_2007_2[, | ||
+ | |||
+ | # Scatter plot matrix | ||
+ | plot(secu_com_finance_2007_2[, | ||
+ | |||
+ | # Scree Plot | ||
+ | plot(prcomp(secu_com_finance_2007_2[, | ||
+ | |||
+ | </ | ||
+ | |||
+ | < | ||
+ | # 요인분석(maximum likelihood factor analysis) | ||
+ | # rotation = " | ||
+ | secu_factanal <- factanal(secu_com_finance_2007_2[, | ||
+ | factors = 2, | ||
+ | rotation = " | ||
+ | scores=" | ||
+ | print(secu_factanal) | ||
+ | |||
+ | </ | ||
+ | |||
+ | < | ||
+ | print(secu_factanal$loadings, | ||
+ | |||
+ | # factor scores plotting | ||
+ | secu_factanal$scores | ||
+ | |||
+ | plot(secu_factanal$scores, | ||
+ | |||
+ | # 관측치별 이름 매핑(rownames mapping) | ||
+ | text(secu_factanal$scores[, | ||
+ | | ||
+ | cex = 0.7, pos = 3, col = " | ||
+ | |||
+ | # factor loadings plotting | ||
+ | points(secu_factanal$loadings, | ||
+ | |||
+ | |||
+ | text(secu_factanal$loadings[, | ||
+ | | ||
+ | cex = 0.8, pos = 3, col = " | ||
+ | |||
+ | # plotting lines between (0,0) and (factor loadings by Var.) | ||
+ | segments(0, | ||
+ | segments(0, | ||
+ | segments(0, | ||
+ | segments(0, | ||
+ | segments(0, | ||
+ | |||
+ | |||
+ | |||
+ | </ | ||
+ | ====== e.g ====== | ||
+ | http:// | ||
====== etc. ====== | ====== etc. ====== | ||
< | < | ||
{{: | {{: | ||
{{: | {{: | ||
- | {{: | + | |
====== Reference ====== | ====== Reference ====== | ||
{{: | {{: | ||
+ | [[https:// | ||
+ | [[https:// | ||
+ | see exploratory factor analysis :: {{youtube> |
factor_analysis.txt · Last modified: 2023/11/06 02:53 by hkimscil