本文對應《R語言實戰》第14章:主成分和因子分析
主成分分析(PCA)是一種數據降維技巧,它能將大量相關變量轉化為一組很少的不相關變量,這些無關變量成為主成分。
探索性因子分析(EFA)是一系列用來發現一組變量的潛在結構的方法。通過尋找一組更小的、潛在的或隱藏的結構來解釋已觀測到的、顯式的變量間的關系。
這兩種方法都需要大樣本來支撐穩定的結果,但是多大是足夠的也是一個復雜的問題。目前,數據分析師常使用經驗法則:因子分析需要5~10倍於變量數的樣本數。另外有研究表明,所需樣本量依賴於因子數目、與各因子相關聯的變量數,以及因子對變量方差的解釋程度。
基礎安裝包里有princomp()函數可以做主成分分析,factanal()函數可以做因子分析。
另外有psych包,提供以下函數:
函數 |
描述 |
principal() |
含多種可選的方差旋轉方法的主成分分析 |
fa() |
可用主軸、最小殘差、加權最小平方或最大似然法估計的因子分析 |
fa.parallel() |
含平行分析的碎石圖 |
factor.plot() |
繪制因子分析或主成分分析的結果 |
fa.diagram() |
繪制因子分析或主成分的載荷矩陣 |
scree() |
因子分析和主成分分析的碎石圖 |
主要步驟:
1. 數據預處理
需要確保數據中沒有缺失值
2. 選擇因子模型
判斷是PCA(數據降維)還是EFA(發現潛在結構)更符合你的研究目標。如果選擇EFA方法,還需要選擇一種估計因子模型的方法(如最大似然估計)
3. 判斷要選擇的主成分/因子數目
4. 選擇主成分/因子
5. 旋轉主成分/因子
6. 解釋結果
7. 計算主成分或因子得分
=========================================================================
主成分分析:
PCA的目標是用一組較少的不相關變量代替大量相關變量,同時盡可能保留初始變量的信息,這些推導所得的變量成為主成分,它們是觀測變量的線性組合。各主成分互相正交。
判斷主成分的個數准則:
- 根據先驗經驗和理論知識判斷主成分數
- 根據要解釋變量方差的積累值的閾值來判斷需要的主成分數
- 通過檢查變量間k*k的相關系數矩陣來判斷保留的主成分數
最常見的是基於特征值的方法。每個主成分都與相關系數矩陣的特征值相關聯,第一主成分與最大的特征值相關聯,第二主成分與第二大的特征值相關聯,依次類推。Kaiser-Harris准則建議保留特征值大於1的主成分,因為特征值小於1的成分所解釋的方差比包含在單個變量中的方差更少。Cattell碎石檢驗則繪制了特征值與主成分數的圖形。這類圖形可以清晰地展示圖形彎曲狀況,在圖形變化最大處之上的主成分都可以保留。最后,還可以進行模擬,依據與初始矩陣相同大小的隨機數據矩陣來判斷要提取的特征值。若基於真實數據的某個特征值大於一組隨機數據矩陣相應的平均特征值,那么該主成分可以保留。這種方法稱為平行分析。
#展示基於觀測特征值的碎石檢驗(線段與x符號組成)、根據100個隨機數據矩陣推導出來的特征值均值(虛線),以及大於1的特征值准則(y=1的水平線) library(psych) fa.parallel(USJudgeRatings[, -1], fa = “PC”, n.iter = 100, show.legend = FALSE, main = “Scree plot with parallel analysis”)
提取主成分:
principal(r, nfactors = , rotate = , scores = )
其中r是相關系數矩陣或原始數據矩陣;
nfactors設定主成分數(默認為1);
rotate指定旋轉的方法(默認為最大方差旋轉,varimax);
scores設定是否需要計算主成分得分(默認不需要)。
輸出解釋:
PC1(或PC2…)欄包含了成分載荷,指觀測變量與主成分的相關系數。可用來解釋主成分的含義,是一個可用來進行一般性評價的維度。
h2欄指成分公因子方差:主成分對每個變量的方差解釋度;
u2欄指成分唯一性(1-h2):方差無法被主成分解釋的比例;
SS loadings行包含了與主成分相關聯的特征值,指的是與特定主成分相關聯的標准化后的方差值。
Proportion Var行表示的是每個主成分對整個數據集的解釋程度。
主成分旋轉:
當提取了多個成分時,對它們進行旋轉可使結果更具解釋性。
旋轉是一系列將成分載荷變得更容易解釋的數學方法,它們盡可能地對成分去噪。
旋轉方法有兩種:使選擇的成分保持不相關(正交旋轉);讓它們變得相關(斜交旋轉)。
最流行的正交旋轉是方差極大旋轉,它試圖對載荷陣的列進行去噪,使得每個成分只是由一組有限的變量來解釋(即載荷陣每列只有少數幾個很大的載荷,其他都是很小的載荷)。(具體例子參見書305頁)
由於最終目標是用一組較少的變量替換一組較多的相關變量,因此還需要獲取每個觀測在成分上的得分。
獲取主成分得分的方法:
第一種情況是,只有一個主成分,此時設置score = TRUE即可得到主成分得分;
第二種情況是,基於相關系數矩陣的主成分分析,雖然原始數據不可用,但是可以得到用來計算主成分得分的系數。為了簡化計算,通常將接近0的系數直接看作是0。
=========================================================================
探索性因子分析:
目標是通過發掘隱藏在數據下的一組較少的、更為基本的無法觀測的變量,來解釋一組可觀測變量的相關性。這些虛擬的、無法觀測的變量稱作因子。(每個因子被認為可以解釋多個觀測變量間共有的方差,因此准確來說,它們應該稱作公共因子)
同樣的,需要判斷需提取的公共因子數:
值得注意的是,當三種原則搖擺不定時,高估因子數通常比低估因子數的結果好。另外,Kaiser-Harris准則的特征值數大於0而不是1(圖中的水平線)。
提取公共因子:
fa(r, nfactors = , n.obs = , rotate = , scores = , fm = )
r是相關系數矩陣或者原始數據矩陣;
nfactors設定提取的因子數(默認為1);
n.obs是觀測數(輸入相關系數矩陣時需要填寫);
rotate設定旋轉的方法(默認互變異數最小法);
scores設定是否計算因子得分(默認不計算);
fm設定因子化方法(默認極小殘差法)。
提取公共因子的方法有很多,包括最大似然法(ml)、主軸迭代法(pa)、加權最小二乘法(wls)、廣義加權最小二乘法(gls)和最小殘差法(minres)。最大似然法有良好的統計性質,但是有時最大似然法不會收斂,此時采用主軸迭代法會有好效果。
因子旋轉:
正交與斜交旋轉,具體例子參考書310頁。
兩者不同之處:對於正交旋轉,因子分析的重點在於因子結構矩陣(變量與因子的相關系數),而對於斜交旋轉,因子分析會考慮三個矩陣:因子結構矩陣、因子模式矩陣和因子關聯矩陣。
因子模式矩陣即標准化的回歸系數矩陣,它列出了因子預測變量的權重。因子關聯矩陣即因子相關系數矩陣。
因子結構矩陣(即因子載荷矩陣)一般不會列出來,但是可以計算得到,公式為F = P * Phi,其中F是因子載荷陣,P為因子模式矩陣,Phi為因子關聯矩陣。(例子可以參考311頁)
因子得分:
相比PCA,EFA並不那么關注計算因子得分。在fa()函數中添加score = TRUE即可得到因子得分。另外還可以得到得分系數(標准化的回歸權重),它在返回對象的weights元素中。
其他與EFA相關的包:
FactoMineR: 提供PCA和FEA方法,潛變量模型,並有更多參數選項;
FAiR: 使用遺傳算法估計因子分析模型,增強了模型參數的估計能力,能夠處理不等式的約束條件;
GPArotation: 提供多種因子旋轉方法;
nFactors: 提供了用來判斷因子數目的許多復雜方法。
其他潛變量模型:
CFA(驗證性因子分析)是結構方程模型(SEM)中的一種方法。SEM不僅可以假定潛在因子的數目以及組成,還能假定因子間的影響方式。可以將SEM看做是驗證性因子分析(對變量)和回歸分析(對因子)的組合,它的結果輸出包含統計檢驗和擬合度的指標。具體實現方式有sem包,openMx包,lavaan包。
ltm包可以用來擬合測驗和問卷中各項目的潛變量模型。
潛類別模型(潛在的因子被認為是類別型而非連續型)可通過FlexMix, lcmm, randomLCA, poLC包進行擬合。lcda包可做潛類別判別分析,lsa包可做潛在語義分析。
ca包提供了可做簡單和多重對應分析的函數。
另外MDS(多維標度法)可以用來發現解釋相似性和可測對象間距離的潛在維度。基礎安裝的cmdscale()函數可以實現經典MDS,MASS包里的isoMDS()函數可以做非線性MDS。
小結: