目錄
1 . 因子分析(factor analysis)是由英國心理學家Spearman在1904年提出來的,他 成功地解決了智力測驗得分的統計分析,長期以來,教育心理學家不斷豐富、發展了因 子分析理論和方法,並應用這一方法在行爲科學領域進行了廣泛的研究。
因子分析可以看成主成分分析的推廣,它也是多元統計分析中常用的一種降維方 式,因子分析所涉及的計算與主成分分析也很類似,但差別也是很明顯的:
1)主成分 分析把方差劃分爲不同的正交成分,而因子分析則把方差劃歸爲不同的起因因子;
2) 因子分析中特徵值的計算只能從相關係數矩陣出發,且必須將主成分轉換成因子。 因子分析有確定的模型,觀察數據在模型中被分解爲公共因子、特殊因子和誤差三 部分。
2. 初學因子分析的大困難在於理解它的模型,我們先看如下幾個例子。
例1 爲了解學生的知識和能力,對學生進行了抽樣命題考試,考題包括的面很廣, 但總的來講可歸結爲學生的語文水平、數學推導、藝術修養、歷史知識、生活知識等五個方面,我們把每一個方面稱爲一個(公共)因子,顯然每個學生的成績均可由這五個 因子來確定,即可設想第i個學生考試的分數 能用這五個公共因子 的線性組合表示出來 :
線性組合係數 稱爲因子載荷(loadings),它分別表示第i個學生在這五個因子方面的能力; 是總平均, 是第i個學生的能力和知識不能被這五個因子包含的部分,稱爲特殊因子,常假定 。 不難發現,這個模型與迴歸模型在形式上是很相似的,但這裏 的值卻是未知的,有關參數的意義也有很大的差異。
因子分析的首要任務就是估計因子載荷 的方差 ,然後給因子 一個合理的解釋,若難以進行合理的解釋,則需要進一步作因子旋轉,希望旋轉後能發現比較合理的解釋。
特別需要說明的是這裏的因子和試驗設計裏的因子(或因素)是不同的,它比較抽象和概括,往往是不可以單獨測量的。
例2 診斷時,醫生檢測了病人的五個生理指標:收縮壓、舒張壓、心跳間隔、呼 吸間隔和舌下溫度,但依據生理學知識,這五個指標是受植物神經支配的,植物神經又 分爲交感神經和副交感神經,因此這五個指標可用交感神經和副交感神經兩個公共因子 來確定,從而也構成了因子模型。
例3 Holjinger和Swineford在芝加哥郊區對145名七、八年級學生進行了24個心理 測驗,通過因子分析,這24個心理指標被歸結爲4個公共因子,即詞語因子、速度因子、 推理因子和記憶因子。
其中殘差矩陣可表示爲 ;所以與相關係數矩陣R 比較接近時,則從直觀上可以認爲因子模型給出了數據較好的擬合。
在因子分析中,一般人們的重點是估計因子模型的參數,即載荷矩陣,有時公共因 子的估計,即所謂因子得分,也是需要的,因子得分可以用於模型診斷,也可以作下一 步分析的原始數據,需要指出的是,因子得分的計算並不是通常意義下的參數估計,它是對不可觀測的隨機向量 取值的估計。通常可以用加權小二乘法和迴歸法來估計因子得分。
上面主成分解是不唯一的,因爲對 A作任何正交變換都不會改變原來的 ,即設Q爲m 階正交矩陣, B = AQ則 ,載荷矩陣的這種不唯一性表明看是不利的,但我們卻可以利用這種不變性,通過適當的因子變換,使變換後新的因子具有 更鮮明的實際意義或可解釋性,比如,我們可以通過正交變換使B 中有儘可能多的元 素等於或接近於0,從而使因子載荷矩陣結構簡單化,便於做出更有實際意義的解釋。
由於正交變換是一種旋轉變換,如果我們選取方差大的正交旋轉,即將各個因子 旋轉到某個位置,使每個變量在旋轉後的因子軸上的投影向大、小兩級分化,從而 使每個因子中的高載荷只出現在少數的變量上,在後得到的旋轉因子載荷矩陣中,每 列元素除幾個值外,其餘的均接近於0。
當 m=2 時,還可以通過圖解法,憑直覺將座標軸旋轉一個角度 φ ,一般的做法是先對變量聚類,利用這些類很容易確定新的公共因子。
可以每次考慮不同的兩個因子的旋轉,從m 個因子中每次選兩個旋轉,共有 種旋轉,做完這 次旋轉就算完成了一個循環,然後重新開始第二個循環,每經一個循環,A陣的各列的相對方差和V 只會變大,當第k 次循環後的與上一次循環的 比較變化不大時,就停止旋轉。
綜上所述,因子分析的基本步驟可概括;
1)求樣本相關係數矩陣R 的特徵值(依大小次序)及其相應的特徵向量。
取前面k個特徵值使其累積方差貢獻率超過85%,並給出前k個特徵值對應的特徵向量。
2)求因子載荷矩陣 A 。(由(40)式即可算出)
3)對載荷矩陣 A作正交旋轉 ,使得到的矩陣 的方差和最大。
例1:設某三個變量的樣本相關係數矩陣R如下, 試從R 出發,作因子分析。
求解的MATLAB程序如下:
clc,clear r=[1 -1/3 2/3;-1/3 1 0;2/3 0 1]; [vec,val,con]=pcacov(r);num=2; f1=repmat(sign(sum(vec)),size(vec,1),1); vec=vec.*f1; %特徵向量正負號轉換 f2=repmat(sqrt(val)',size(vec,1),1); a=vec.*f2 %載荷矩陣 [b,t]=rotatefactors(a(:,1:num),'method', 'varimax')