factor_analysis
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
factor_analysis [2019/09/14 17:26] – [e.g. secu com finance 2007 example] hkimscil | factor_analysis [2023/11/06 02:53] (current) – [E.g. 2] 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 103: | 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 133: | 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 177: | Line 185: | ||
| Y3 | $S_{31}$ | | Y3 | $S_{31}$ | ||
- | 실제 데이터에서 구한 variance covariance table은 아래와 같다. | + | 실제 데이터에서 구한 variance covariance table은 아래와 같다((편의상 여기 분산값은 n으로 (n-1이 아닌) 나눠 준 것)). |
| Variable | | Variable | ||
Line 183: | 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 192: | Line 210: | ||
$$ | $$ | ||
+ | 아래는 설명한 것과 같이 이론적으로 구한 covariance matrix 이다 (나). | ||
$$ | $$ | ||
\begin{pmatrix} | \begin{pmatrix} | ||
Line 200: | Line 219: | ||
$$ | $$ | ||
- | + | 실제 데이터에서 구한 variance covariance 값과 | |
- | + | ||
- | 실제 데이터에서 구한 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 ====== | ====== Interpretation of factor loading and the rotation method ====== | ||
- | 위의 분석작업을 통해서 아래와 같은 regression 공식을 얻었다고 가정하자. 아래 공식의 문제점은 F1과 F2의 loading값이 골고루 퍼져 있어서, finance 점수에 영향을 주는 것이 F1인지 F2인지 이야기하기기 어렵다는 점이다. 즉, factor loadings are not unique하다는 것이다. | + | 위의 분석작업을 통해서 아래와 같은 regression 공식을 얻었다고 가정하자 |
+ | |||
+ | 좀 더 설명하자면 우리가 regression에서 배운 것에 의하면 아래는 $Y_{1}$ 은 F1이 0.5만큼 F2가 0.5만큼 설명한다고 하겠다. 이것을 팩터로딩이 팩터 간에 독립적으로 나타나지 않는다고 이야기 한다는 뜻이다. 그러나 우리가 factor analysis 를 하는 이유는 Factor 중의 하나가 $Y_{1}$에 온전히 기여를 하고 나머지는 기여를 하지 않는 구조를 가지는가를 보기 위해서다. 이를 위해서 아래의 해는 로테이션이라는 과정을 한번 더 거치게 된다 (바로 아래 문장 참조 - " | ||
Model A | Model A | ||
Line 216: | 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 223: | 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 248: | Line 273: | ||
====== Factor solution among many . . . ====== | ====== Factor solution among many . . . ====== | ||
- | Principal component factor analysis | ||
| Variable, \\ Y< | | Variable, \\ Y< | ||
Line 257: | 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 282: | 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 370: | Line 414: | ||
===== Eigenvalue (고유값) ===== | ===== Eigenvalue (고유값) ===== | ||
- | 특정요인의 모든 요인적재량(factor loadings)을 제곱하여 합한 값이다. 특정요인이 설명하는 총분산을 의미한다. | + | 특정요인의 모든 요인적재량(factor loadings)을 제곱하여 합한 값이다. 특정요인이 |
| | | | ||
| Variable | | Variable | ||
Line 389: | 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 402: | Line 446: | ||
이렇게 각 변인의 communality값을 구해보면 아래와 같은 테이블을 구할 수 있는데, 요인분석 모델은 Climate, Health, Arts, 그리고 economics의 변량을 가장 잘 설명한다고 하겠다. | 이렇게 각 변인의 communality값을 구해보면 아래와 같은 테이블을 구할 수 있는데, 요인분석 모델은 Climate, Health, Arts, 그리고 economics의 변량을 가장 잘 설명한다고 하겠다. | ||
- | |< 300px 30% - >| | + | |
| Variable | | Variable | ||
| Climate | | Climate | ||
Line 412: | 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 421: | Line 477: | ||
* see [[https:// | * see [[https:// | ||
- | ====== E.g. 2 ====== | + | ===== E.g. 2 ====== |
{{: | {{: | ||
+ | < | ||
+ | my.data <- 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 433: | 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 512: | 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 681: | 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 803: | 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 811: | 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 826: | 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 881: | 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 1146: | Line 1468: | ||
head(saq) | head(saq) | ||
</ | </ | ||
+ | |||
+ | see [[:SAQ dataset]] | ||
====== e.g., 5 ====== | ====== e.g., 5 ====== | ||
{{: | {{: | ||
Line 1155: | Line 1479: | ||
secu_com_finance_2007 <- read.csv(" | secu_com_finance_2007 <- read.csv(" | ||
secu_com_finance_2007 | 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. ====== | ||
< | < | ||
Line 1163: | Line 1564: | ||
====== Reference ====== | ====== Reference ====== | ||
{{: | {{: | ||
+ | [[https:// | ||
+ | [[https:// | ||
+ | see exploratory factor analysis :: {{youtube> |
factor_analysis.txt · Last modified: 2023/11/06 02:53 by hkimscil