因子分析

 

   在某些領域中我們並沒有辦法直接得到(由實驗或是問卷)我們有興趣的量值。例如,一個人的IQ或是EQ。在這種時候,我們就會用一些「測驗」來測量我們有興趣的變數,但這並不能得到真實的資料。

 

        若我們有興趣的量(因子)是f(維度k),但我們能量測到的值是x(維度q, q>k)。則我們假設fx有線性的關係,L是因子的loadinge是其殘差。

  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相當一致。