因子分析
探索性因子分析(EFA)是一系列用來發現一組變量的潛在結構的方法。它通過尋找一組更小的、潛在的或隐藏的結構來解釋已觀測到的、顯式的變量間的關系。例如,Harman74.cor包含了24個心理測驗間的互相關系,受試對象為145個七年級或八年級的學生。假使應用EFA來探索該資料,結果表明276個測驗間的互相關系可用四個學生能力的潛在因子(語言能力、反應速度、推理能力和記憶能力)來進行解釋。
1 探索性因子分析
EFA的目标是通過發掘隐藏在資料下的一組較少的、更為基本的無法觀測的變量,來解釋一
組可觀測變量的相關性。這些虛拟的、無法觀測的變量稱作因子。(每個因子被認為可解釋多個觀測變量間共有的方差,是以準确來說,它們應該稱作公共因子。)
雖然PCA和EFA存在差異,但是它們的許多分析步驟都是相似的。為闡述EFA的分析過程,
我們用它來對六個心理學測驗間的相關性進行分析。112個人參與了六個測驗,包括非語言的普通智力測驗(general)、畫圖測驗(picture)、積木圖案測驗(blocks)、迷宮測驗(maze)、閱讀測驗(reading)和詞彙測驗(vocab)。我們如何用一組較少的、潛在的心理學因素來解釋參與者的測驗得分呢?
資料集ability.cov提供了變量的協方差矩陣,你可用cov2cor()函數将其轉化為相關系數矩陣。
options(digits=2) #設定小數點後保留兩位小數
covariances <- ability.cov$cov #擷取協方差矩陣
correlations <- cov2cor(covariances) #将協方差矩陣轉化為相關系數矩陣
correlations
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iYidjNzUTNiJzMzQTO5kDM5gDO1QWYmZ2NwEWOhJWN48CX0EzLchDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL3M3Lc9CX6MHc0RHaiojIsJye.png)
與使用PCA相同,下一步工作為判斷需要提取幾個因子。
1.1 判斷需提取的公共因子數
用fa.parallel()函數可判斷需提取的因子數:
library(psych)
covariances <- ability.cov$cov
correlations <- cov2cor(covariances)
fa.parallel(correlations, n.obs=112, fa="both", n.iter=100,
main="Scree plots with parallel analysis")
#n.obs=0意味着是一個資料矩陣/資料框。否則,用多少個案例來尋找相關性。fa="both",因子圖形将會同時展示主成分和公共因子分析的結果。n.iter是要進行的模拟分析的數量
結果分析:圖中同時展示了PCA和EFA的結果。PCA結果建議提取一個或者兩個成分,EFA建議提取兩個因子。如果使用PCA方法,你可能會選擇一個成分(碎石檢驗和平行分析)或者兩個成分(特征值大于1)。當搖擺不定時,高估因子數通常比低估因子數的結果好,因為高估因子數一般較少曲解“真實”情況。觀察EFA的結果,顯然需提取兩個因子。碎石檢驗的前兩個特征值(三角形)都在拐角處之上,并且大于基于100次模拟資料矩陣的特征值均值。
1.2 提取公共因子
現在你決定提取兩個因子,可以使用fa()函數獲得相應的結果。fa()函數的格式如下:
fa(r, nfactors=, n.obs=, rotate=, scores=, fm=)
其中:
q r是相關系數矩陣或者原始資料矩陣;
q nfactors設定提取的因子數(預設為1);
q n.obs是觀測數(輸入相關系數矩陣時需要填寫);
q rotate設定旋轉的方法(預設互變異數最小法);
q scores設定是否計算因子得分(預設不計算);
q fm設定因子化方法(預設極小殘差法)。
與PCA不同,提取公共因子的方法很多,包括最大似然法(ml)、主軸疊代法(pa)、權重最小二乘法(wls)、廣義權重最小二乘法(gls)和最小殘差法(minres)。統計學家青睐使用最大似然法,因為它有良好的統計性質。不過有時候最大似然法不會收斂,此時使用主軸疊代法效果會很好。
本例使用主軸疊代法(fm="pa")提取未旋轉的因子。代碼如下:
fa <- fa(correlations, nfactors=2, rotate="none", fm="pa")
fa
結果分析:可以看到,兩個因子解釋了六個心理學測驗60%的方差。不過因子載荷陣的意義并不太好解釋,此時使用因子旋轉将有助于因子的解釋。
1.3 因子旋轉
你可以使用正交旋轉或者斜交旋轉來旋轉上節中兩個因子的結果:
(1)用正交旋轉提取因子
fa.varimax <- fa(correlations, nfactors=2, rotate="varimax", fm="pa")
fa.varimax
結果分析:結果顯示因子變得更好解釋了。閱讀reading和詞彙vocab在第一因子上載荷較大,畫圖picture、積木圖案blocks和迷宮maze在第二因子上載荷較大,非語言的普通智力測量在兩個因子上載荷較為平均,這表明存在一個語言智力因子和一個非語言智力因子。h2欄指成分公因子方差,即主成分對每個變量的方差解釋度。u2欄指成分唯一性,即方差無法被主成分解釋的比例(1–h2)
(2)用斜交旋轉提取因子
使用正交旋轉将人為地強制兩個因子不相關。如果想允許兩個因子相關該怎麼辦呢?此時可以使用斜交轉軸法,比如promax。
fa.promax <- fa(correlations, nfactors=2, rotate="promax", fm="pa")
錯誤:Loading required namespace: GPArotationFailed with error: ‘there is no package called ‘GPArotation’’Error in kaiser(loadings, rotate = "Promax", ...) :
解決方法:
install.packages("GPArotation")
library(GPArotation)
fa.promax <- fa(correlations, nfactors=2, rotate="promax", fm="pa")
fa.promax
結果分析:根據以上結果,你可以看出正交旋轉和斜交旋轉的不同之處。對于正交旋轉,因子分析的重點在于因子結構矩陣(變量與因子的相關系數),而對于斜交旋轉,因子分析會考慮三個矩陣:因子結構矩陣、因子模式矩陣和因子關聯矩陣。
因子模式矩陣即标準化的回歸系數矩陣。它列出了因子預測變量的權重。因子關聯矩陣即因子相關系數矩陣。
在結果中,PA1和PA2欄中的值組成了因子模式矩陣。它們是标準化的回歸系數,而不是相關系數。注意,矩陣的列仍用來對因子進行命名(雖然此處存在一些争論)。你同樣可
以得到一個語言因子和一個非語言因子。
因子關聯矩陣顯示兩個因子的相關系數為0.57,相關性很大。如果因子間的關聯性很低,你可能需要重新使用正交旋轉來簡化問題。
因子結構矩陣(或稱因子載荷陣)沒有被列出來,但你可以使用公式F = P*Phi很輕松地得
到它,其中F是因子載荷陣,P為因子模式矩陣,Phi為因子關聯矩陣。下面的函數即可進行該乘法運算:
fsm <- function(oblique) {
if (class(oblique)[2]=="fa" & is.null(oblique$Phi)) {
warning("Object doesn't look like oblique EFA")
} else {
P <- unclass(oblique$loading)
F <- P %*% oblique$Phi
colnames(F) <- c("PA1", "PA2")
return(F)
}
}
對上面的例子使用該函數,可得:
fsm(fa.promax)
結果分析:現在你可以看到變量與因子間的相關系數。将它們與正交旋轉所得因子載荷陣相比,你會發現該載荷陣列的噪音比較大,這是因為之前你允許潛在因子相關。雖然斜交方法更為複雜,但模型将更符合真實資料。
使用factor.plot()或fa.diagram()函數,你可以繪制正交或者斜交結果的圖形。來看以下代碼:
factor.plot(fa.promax, labels=rownames(fa.promax$loadings))
結果分析:資料集ability.cov中心理學測驗的兩因子圖形。詞彙和閱讀在第一個因子(PA1)上載荷較大,而積木圖案、畫圖和迷宮在第二個因子(PA2)上載荷較大。普通智力測驗在兩個因子上較為平均。
生成關聯圖形,可視化效果會更加明顯,代碼如下:
fa.diagram(fa.promax, simple=FALSE)
#若使simple = TRUE,那麼将僅顯示每個因子下最大的載荷,以及因子間的相關系數。
結果分析:這張圖檔能清楚的看到它們之間的相關系數,這類圖形在有多個因子時十分實用。
1.4 因子得分
相比PCA,EFA并不那麼關注計算因子得分。在fa()函數中添加score = TRUE選項(原始資料可得時)便可很輕松地獲得因子得分。另外還可以得到得分系數(标準化的回歸權重),它在傳回對象的weights元素中。
對于ability.cov資料集,通過二因子斜交旋轉法便可獲得用來計算因子得分的權重:
fa.promax$weights
總結:主成分分析(PCA)和探索性因子分析(EFA)兩種方法。PCA在資料降維方面非常有用,它能用一組較少的不相關變量來替代大量相關變量,進而簡化分析過程。EFA包含很多方法,可用來發現一組可觀測變量背後潛在的或無法觀測的結構(因子)。
作者:zhang-X,轉載請注明原文連結