因子分析
在某些領域中我們並沒有辦法直接得到(由實驗或是問卷)我們有興趣的量值。例如,一個人的IQ或是EQ。在這種時候,我們就會用一些「測驗」來測量我們有興趣的變數,但這並不能得到真實的資料。
若我們有興趣的量(因子)是f(維度k),但我們能量測到的值是x(維度q, q>k)。則我們假設f和x有線性的關係,L是因子的loading,e是其殘差。
x的變異數和L的關係可由以下的公式導出。
故而我們可以由var(x)來想辦法求出L及Ψ(對角矩陣),再求出我們有興趣的f。比較簡單的作法就是主成份法。先想一下主成份的作法和FA有什麼相同的地方。主成份是把var(x)拆解成多個固有向量的向量的乘積和。選取足夠大的比例的向量,當作每個成份的線性組合的係數。在FA的方法中,我們必須讓對角元是沒有誤差的,所以可以由固有值和固有向量估出L和 Y。
通常我們用不同方法求出的f 都不唯一。為了解決這個問題,我們可以做坐標軸的旋轉,再重新定義f。通常我們的目標就是減少每一個因子中loading較大的變數數目,只有讓少數變數的loading有比較大的值(varimax法)。
計算出L及Ψ就可以由以下式子估出factor scores
mle 法
Regression法
下面是一個高中基測的資料。我們想看看在這筆資料中的因子是什麼。
檔案裡面有三個班150人。每人每科的成績,及寫作成績。寫作成績是ordinal的變數,重新recode成最低1分最高7分。先保留最後三筆資料。來做分析。
dat=read.table("grad.txt")
colnames(dat)=c("Chinese","English","Math","Society","Science","Lang")
dat[,6]=factor(dat[,6],levels=c("C+","B-","B","B+","A-","A","A+")) #relevel
x=cbind(dat[1:147,1:5],as.numeric(dat[1:147,6]))
colnames(x)=colnames(dat)
fa=factanal(x,2,scores="Bartlett",rotation="none") #df=((p-m)^2-p-m)/2
fa
Call:
factanal(x = x, factors = 2, scores = "Bartlett", rotation = "none")
Uniquenesses:
Chinese |
English |
Math |
Society |
Science |
Lang |
0.184 |
0.632 |
0.57 |
0.748 |
0.202 |
0.428 |
Loadings:
|
Factor1 |
Factor2 |
Chinese |
0.790 |
-0.438 |
English |
0.602 |
0.079 |
Math |
0.521 |
0.398 |
Society |
0.464 |
0.192 |
Science |
0.669 |
0.592 |
Lang |
0.614 |
-0.442 |
|
Factor1 |
Factor2 |
SS loadings |
2.298 |
0.94 |
Proportion Var |
0.383 |
0.157 |
Cumulative Var |
0.383 |
0.54 |
Test of the hypothesis that 2 factors are sufficient.
The chi square statistic is 1.21 on 4 degrees of freedom.
The p-value is 0.876
Uniquenesses就是Ψ的對角元,Ψ是一個對角矩陣。
先看檢定的結果。檢定顯示,用二個因子就足已解釋這筆資料。如果我們想做三個因子的分析,就會用完所有的自由度(df)就沒辦法做檢定了。
從loading可以看出來,第一個因子可視為是綜合的表現,每個loading值都差不多大小;第二個因子主要是理解能力(數學、自然)語言能力(國文、寫作能力)和的差異。而第一個因子可以解釋38.3%的變異,第二個因子可以解15.7%的變異。
也就是說,影響學生成績的因子,最主要有二個。一個是綜合能力,一個是理解能力和語言能力的差異。而最重要是綜合能力的表現。這樣的解釋看起來有點難懂,一般人很難理解二個能力的差異。所以我們可以做一下rotation看因子是否更好解釋。
fa=factanal(x,2,scores ="B",rotation="varimax")
只看loading的部分
|
Factor1 |
Factor2 |
Chinese |
0.228139 |
0.874315 |
English |
0.472355 |
0.381104 |
Math |
0.647677 |
0.102079 |
Society |
0.459508 |
0.202956 |
Science |
0.890275 |
0.075423 |
Lang |
0.103712 |
0.749439 |
|
Factor1 |
Factor2 |
SS loadings |
1.709 |
1.529 |
Proportion Var |
0.285 |
0.255 |
Cumulative Var |
0.285 |
0.54 |
這二個新的因子能解釋的部分還是一樣是54%,但是loading的部分變了。第一個因子看起來像是以理解力為主(自然、數學、英文及社會),第二個因子語言能力(主要是國文、和語言表達能力),而每個因子解釋的變異百分比是差不多的,也就是每個因子的重要性相同。
因子分析也可以讓多維的資料降維,讓我們比較好理解。現在先把大家的score的散布圖畫出來,外圍的學生表示,至少有一個能力表現的很突出(很不好或是很好)。例如:146就是語言能力表現佳,43的理解能力有待加強。
圖一、147學生score的散布圖+代表之前保留的三個學生。
我們現在來算一下之前保留的score。算score之前先要標準化。這裡的標準化是要對之前那147筆的資料來做。
fld=fa$loading[ ]
u=diag(fa$u)
fa$score[1:3,]
solve(t(fld)%*%solve(u)%*%fld)%*%t(fld)%*%solve(u)%*%t(sdx0) #由mle法算
solve(t(fld)%*%solve(u)%*%fld)%*%t(fld)%*%solve(u)%*%t(stdx[1:3,]) #對照
我們可以看到,這三個學生的score可以看到,學生的理解力較原來資料內的同學表現稍差,但是語言能力表現相當出色。
|
148 |
149 |
150 |
Factor1 |
-0.293 |
-0.7503 |
-0.5354 |
Factor2 |
1.419668 |
3.252952 |
1.132591 |
我們把這個筆資料加到圖一,看得出來,他們的理解力普通,但是語言能力相當不錯。
表一 原始分數針對x標準化化後的數值。
|
|
Chinese |
English |
Math |
Society |
Science |
Lang |
原始分數 |
平均 |
12.04 |
12.64 |
11.88 |
11.41 |
12.92 |
4.22 |
148 |
13 |
14 |
15 |
14 |
12 |
6 |
|
149 |
15 |
15 |
13 |
13 |
12 |
7 |
|
150 |
13 |
14 |
5 |
14 |
13 |
5 |
|
|
|
|
|
|
|
|
|
標準化 |
148 |
0.81 |
0.67 |
1.39 |
1.49 |
-0.69 |
1.70 |
149 |
2.49 |
1.17 |
0.50 |
0.91 |
-0.69 |
2.65 |
|
150 |
0.81 |
0.67 |
-3.05 |
1.49 |
0.06 |
0.74 |
由表一可以更清楚的看到每個學生成績,和我們算出的score相當一致。