第十四章:主成分和因子分析
本章內容
主成分分析
探索性因子分析
其他潛變量模型
主成分分析(PCA)是一種數據降維技巧,它能將大量相關變量轉化為一組很少的不相關變量,這些無關變量稱為主成分。探索性因子分析(EFA)是一系列用來發現一組變量的潛在結構的方法。它通過尋找一組更小的、潛在的或隱藏的結構來解釋已觀測到的、顯式的變量間的關系。
PCA與EFA模型間的區別
主成分(PC1和PC2)是觀測變量(X1到X5)的線性組合。形成線性組合的權重都是通過最大化各主成分所解釋的方差來獲得,同時還要保證個主成分間不相關。相反,因子(F1和F2)被當做是觀測變量的結構基礎或“原因”,而不是它們的線性組合。代表觀測變量方差的誤差(e1到e5)無法用因子來解釋。圖中的圓圈表示因子和誤差無法直接觀測,但是可通過變量間的相互關系推導得到
14.1 R 中的主成分和因子分析
psych包中有用的因子分析函數
principal() |
含多種可選的方差旋轉方法的主成分分析 |
fa() |
可用主軸、最小殘差、加權最小平方或最大似然法估計的因子分析 |
fa.parallel() |
含平行分析的碎石圖 |
factor.plot() |
繪制因子分析或主成分分析的結果 |
fa.diagram() |
繪制因子分析或主成分的載荷矩陣 |
scree() |
因子分析和主成分分析的碎石圖 |
最常見的步驟:
(1) 數據預處理。PCA和EFA都根據觀測變量間的相關性來推導結果。用戶可以輸入原始數據矩陣或者相關系數矩陣到principal()和fa()函數中。若輸入初始數據,相關系數矩陣將會被自動計算,在計算前請確保數據中沒有缺失值。
(2) 選擇因子模型。判斷是PCA(數據降維)還是EFA(發現潛在結構)更符合你的研究目標。如果選擇EFA方法,你還需要選擇一種估計因子模型的方法(如最大似然估計)。
(3) 判斷要選擇的主成分/因子數目。
(4) 選擇主成分/因子。
(5) 旋轉主成分/因子。
(6) 解釋結果。
(7) 計算主成分或因子得分。
14.2 主成分分析
PCA的目標是用一組較少的不相關變量代替大量相關變量,同時盡可能保留初始變量的信息,這些推導所得的變量稱為主成分,它們是觀測變量的線性組合。如第一主成分為:PC1=a1X1+a2X 2+……+ak Xk它是k個觀測變量的加權組合,對初始變量集的方差解釋性最大。第二主成分也是初始變量的線性組合,對方差的解釋性排第二,同時與第一主成分正交(不相關)。后面每一個主成分都最大化它對方差的解釋程度,同時與之前所有的主成分都正交。數據集USJudgeRatings為例,數據框包含43個觀測,12個變量。
變 量 | 描 述 |
CONT | 律師與法官的接觸次數 |
INTG | 法官正直程度 |
DMNR | 風度 |
DILG | 勤勉度 |
CFMG | 案例流程管理水平 |
DECI | 決策效率 |
PREP | 審理前的准備工作 |
FAMI | 對法律的熟稔程度 |
ORAL | 口頭裁決的可靠度 |
WRIT | 書面裁決的可靠度 |
PHYS | 體能 |
RTEN | 是否值得保留 |
14.2.1 判斷主成分的個數
判斷PCA中需要多少個主成分的准則:
根據先驗經驗和理論知識判斷主成分數;
根據要解釋變量方差的積累值的閾值來判斷需要的主成分數;
通過檢查變量間k × k的相關系數矩陣來判斷保留的主成分數。
利用fa.parallel()函數,可以同時對三種特征值判別准則進行評價
> fa.parallel(USJudgeRatings[,-1],fa="PC",n.iter=100, + show.legend=FALSE, + main="Scree plotwith parallel analysis")
評價美國法官評分中要保留的主成分個數。碎石圖(直線與x符號)、特征值大於1准則(水平線)和100次模擬的平行分析(虛線)都表明保留一個主成分即可。三種准則表明選擇一個主成分即可保留數據集的大部分信息
14.2.2 提取主成分
principal()函數可以根據原始數據矩陣或者相關系數矩陣做主成分分析。格式為:principal(r,nfactors=,rotate=,scores=)
r是相關系數矩陣或原始數據矩陣;
nfactors設定主成分數(默認為1);
rotate指定旋轉的方法[默認最大方差旋轉(varimax)
scores設定是否需要計算主成分得分(默認不需要)。
> pc<-principal(USJudgeRatings[,-1],nfactors=1) > pc Principal Components Analysis Call: principal(r = USJudgeRatings[, -1], nfactors = 1) Standardized loadings (pattern matrix) based upon correlation matrix PC1 h2 u2 INTG 0.92 0.84 0.1565 DMNR 0.91 0.83 0.1663 DILG 0.97 0.94 0.0613 CFMG 0.96 0.93 0.0720 DECI 0.96 0.92 0.0763 PREP 0.98 0.97 0.0299 FAMI 0.98 0.95 0.0469 ORAL 1.00 0.99 0.0091 WRIT 0.99 0.98 0.0196 PHYS 0.89 0.80 0.2013 RTEN 0.99 0.97 0.0275 PC1 SS loadings 10.13 Proportion Var 0.92
由於PCA只對相關系數矩陣進行分析,在獲取主成分前,原始數據將會被自動轉換為相關系數矩陣。PC1欄包含了成分載荷,指觀測變量與主成分的相關系數。如果提取不止一個主成分,那么還將會有PC2、PC3等欄。成分載荷(component loadings)可用來解釋主成分的含義。此處可以看到,第一主成分(PC1)與每個變量都高度相關,也就是說,它是一個可用來進行一般性評價的維度。
h2欄指成分公因子方差——主成分對每個變量的方差解釋度。u2欄指成分唯一性——方差無法被主成分解釋的比例.如,體能(PHYS)80%的方差都可用第一主成分來解釋,20%不能。相比而言,PHYS是用第一主成分表示性最差的變量。SS loadings行包含了與主成分相關聯的特征值,指的是與特定主成分相關聯的標准化后的方差值(本例中,第一主成分的值為10)。最后,Proportion Var行表示的是每個主成分對整個數據集的解釋程度。此處可以看到,第一主成分解釋了11個變量92%的方差。
14.2.3 主成分旋轉
旋轉是一系列將成分載荷陣變得更容易解釋的數學方法,它們盡可能地對成分去噪。旋轉方
法有兩種:使選擇的成分保持不相關(正交旋轉),和讓它們變得相關(斜交旋轉)。旋轉方法也會依據去噪定義的不同而不同。最流行的正交旋轉是方差極大旋轉,它試圖對載荷陣的列進行去噪,使得每個成分只是由一組有限的變量來解釋(即載荷陣每列只有少數幾個很大的載荷,其他都是很小的載荷)。
方差極大旋轉的主成分分析
>rc<-principal(Harman23.cor$cov,nfactors=2,rotate="varimax") > rc Principal Components Analysis Call: principal(r = Harman23.cor$cov, nfactors = 2, rotate ="varimax") Standardized loadings (pattern matrix) based upon correlation matrix RC1 RC2 h2 u2 height 0.90 0.25 0.88 0.123 arm.span 0.93 0.19 0.90 0.097 forearm 0.92 0.16 0.87 0.128 lower.leg 0.90 0.22 0.86 0.139 weight 0.26 0.88 0.85 0.150 bitro.diameter 0.19 0.84 0.74 0.261 chest.girth 0.11 0.84 0.72 0.283 chest.width 0.26 0.75 0.62 0.375 RC1 RC2 SS loadings 3.52 2.92 Proportion Var 0.44 0.37 Cumulative Var 0.44 0.81
觀察RC1欄的載荷,你可以發現第一主成分主要由前四個變量來解釋(長度變量)。RC2欄的載荷表示第二主成分主要由變量5到變量8來解釋(容量變量),兩個主成分旋轉后的累積方差解釋性沒有變化(81%),變的只是各個主成分對方差的解釋度(成分1從58%變為44%,成分2從22%變為37%)。各成分的方差解釋度趨同,准確來說,此時應該稱它們為成分而不是主成分(因為單個主成分方差最大化性質沒有保留)。
14.2.4 獲取主成分得分
從原始數據中獲取成分得分
> library(psych) > pc<-principal(USJudgeRatings[,-1],nfactors=1,score=TRUE) > head(pc$scores) PC1 AARONSON,L.H. -0.1857981 ALEXANDER,J.M. 0.7469865 ARMENTANO,A.J. 0.0704772 BERDON,R.I. 1.1358765 BRACKEN,J.J. -2.1586211 BURNS,E.B. 0.7669406
當scores = TRUE時,主成分得分存儲在principal()函數返回對象的scores元素中。
還可以獲得律師與法官的接觸頻數與法官評分間的相關系數:
> cor(USJudgeRatings$CONT,pc$score) PC1 [1,] -0.008815895
律師與法官的熟稔度與律師的評分毫無關聯
獲取主成分得分的系數
> library(psych) >rc<-principal(Harman23.cor$cov,nfactors=2,rotate="varimax") > round(unclass(rc$weights),2) RC1 RC2 height 0.28 -0.05 arm.span 0.30 -0.08 forearm 0.30 -0.09 lower.leg 0.28 -0.06 weight -0.06 0.33 bitro.diameter -0.08 0.32 chest.girth -0.10 0.34 chest.width -0.04 0.27
主成分得分:
PC1=0.25*height+0.3*arm.span+0.3*forearm+0.29*lower.leg-0.06*weight-0.08*bitro.diameter-0.1*chest.girth-0.04*chest.width
14.3 探索性因子分析
EFA的目標是通過發掘隱藏在數據下的一組較少的、更為基本的無法觀測的變量,來解釋一組可觀測變量的相關性。這些虛擬的、無法觀測的變量稱作因子。(每個因子被認為可解釋多個觀測變量間共有的方差,因此准確來說,它們應該稱作公共因子。)模型的形式為:
其中Xi是第i個可觀測變量(i = 1…k),Fj是公共因子(j = 1…p),並且p<k。Ui是Xi變量獨有的部分(無法被公共因子解釋)。ai可認為是每個因子對復合而成的可觀測變量的貢獻值。
> options(digits=2) > covariances<-ability.cov$cov > correlations<-cov2cor(covariances) > correlations general picture blocks mazereading vocab general 1.00 0.47 0.55 0.34 0.58 0.51 picture 0.47 1.00 0.57 0.19 0.26 0.24 blocks 0.55 0.57 1.00 0.45 0.35 0.36 maze 0.34 0.19 0.45 1.00 0.18 0.22 reading 0.58 0.26 0.35 0.18 1.00 0.79 vocab 0.51 0.24 0.36 0.22 0.79 1.00
14.3.1 判斷需提取的公共因子數
用fa.parallel()函數可判斷需提取的因子數:
> library(psych) > covariances<-ability.cov$cov > correlations<-cov2cor(covariances) > fa.parallel(correlations,n.obs=112,fa="both",n.iter=100, + main="Screeplots with parrallel analysis")
判斷心理學測驗需要保留的因子數。圖中同時展示了PCA和EFA的結果。PCA結果建議提取一個或者兩個成分,EFA建議提取兩個因子
14.3.2 提取公共因子
決定提取兩個因子,可以使用fa()函數獲得相應的結果。fa()函數的格式如下:fa(r,nfactors=,n.obs=,rotate=,scores=,fm=)
r是相關系數矩陣或者原始數據矩陣;
nfactors設定提取的因子數(默認為1);
n.obs是觀測數(輸入相關系數矩陣時需要填寫);
rotate設定旋轉的方法(默認互變異數最小法);
scores設定是否計算因子得分(默認不計算);
fm設定因子化方法(默認極小殘差法)。
與PCA不同,提取公共因子的方法很多,包括最大似然法(ml)、主軸迭代法(pa)、加權最小二乘法(wls)、廣義加權最小二乘法(gls)和最小殘差法(minres)未旋轉的主軸迭代因子法:
> fa<-fa(correlations,nfactors=2,rotate="none",fm="pa") > fa Factor Analysis using method = pa Call: fa(r = correlations, nfactors = 2, rotate = "none", fm ="pa") Standardized loadings (pattern matrix) based upon correlation matrix PA1 PA2 h2 u2 com general 0.75 0.07 0.57 0.432 1.0 picture 0.52 0.32 0.38 0.623 1.7 blocks 0.75 0.52 0.83 0.166 1.8 maze 0.39 0.22 0.20 0.798 1.6 reading 0.81 -0.51 0.91 0.089 1.7 vocab 0.73 -0.39 0.69 0.313 1.5 PA1 PA2 SS loadings 2.75 0.83 Proportion Var 0.46 0.14 Cumulative Var 0.46 0.60
兩個因子解釋了六個心理學測驗60%的方差。不過因子載荷陣的意義並不太好解釋,此時使用因子旋轉將有助於因子的解釋。
14.3.3 因子旋轉
用正交旋轉提取因子
> fa.varimax<-fa(correlations,nfactors=2,rotate="varimax",fm="pa") > fa.varimax Factor Analysis using method = pa Call: fa(r = correlations, nfactors = 2, rotate = "varimax", fm= "pa") Standardized loadings (pattern matrix) based upon correlation matrix PA1 PA2 h2 u2 com general 0.49 0.57 0.57 0.432 2.0 picture 0.16 0.59 0.38 0.623 1.1 blocks 0.18 0.89 0.83 0.166 1.1 maze 0.13 0.43 0.20 0.798 1.2 reading 0.93 0.20 0.91 0.089 1.1 vocab 0.80 0.23 0.69 0.313 1.2 PA1 PA2 SS loadings 1.83 1.75 Proportion Var 0.30 0.29 Cumulative Var 0.30 0.60
結果顯示因子變得更好解釋了。閱讀和詞匯在第一因子上載荷較大,畫圖、積木圖案和迷宮在第二因子上載荷較大,非語言的普通智力測量在兩個因子上載荷較為平均,這表明存在一個語言智力因子和一個非語言智力因子。
用斜交旋轉提取因子:
> fa.promax<-fa(correlations,nfactors=2,rotate="promax",fm="pa") > fa.promax Factor Analysis using method = pa Call: fa(r = correlations, nfactors = 2, rotate = "promax", fm ="pa") PA1 PA2 h2 u2 com general 0.36 0.49 0.57 0.432 1.8 picture -0.04 0.64 0.38 0.623 1.0 blocks -0.12 0.98 0.83 0.166 1.0 maze -0.01 0.45 0.20 0.798 1.0 reading 1.01 -0.11 0.91 0.089 1.0 vocab 0.84 -0.02 0.69 0.313 1.0 PA1 PA2 SS loadings 1.82 1.76 Proportion Var 0.30 0.29 Cumulative Var 0.30 0.60 With factor correlations of PA1 PA2 PA1 1.00 0.57 PA2 0.57 1.00
根據以上結果,你可以看出正交旋轉和斜交旋轉的不同之處。對於正交旋轉,因子分析的重點在於因子結構矩陣(變量與因子的相關系數),而對於斜交旋轉,因子分析會考慮三個矩陣:因子結構矩陣、因子模式矩陣和因子關聯矩陣。因子模式矩陣即標准化的回歸系數矩陣。它列出了因子預測變量的權重。因子關聯矩陣即因子相關系數矩陣。factor.plot()或fa.diagram()函數,你可以繪制正交或者斜交結果的圖形。
> fa.diagram(fa.promax,simple=FALSE)
14.3.4 因子得分
EFA並不那么關注計算因子得分。在fa()函數中添加score = TRUE選項(原始數據可得時)便可很輕松地獲得因子得分。
> fa.promax$weights [,1] [,2] general 0.080 0.210 picture 0.021 0.090 blocks 0.044 0.695 maze 0.027 0.035 reading 0.739 0.044 vocab 0.176 0.039
14.5 小結
歡迎關注