14--因子分析


因子分析

探索性因子分析(EFA)是一系列用來發現一組變量的潛在結構的方法。它通過尋找一組更小的、潛在的或隱藏的結構來解釋已觀測到的、顯式的變量間的關系。例如,Harman74.cor包含了24個心理測驗間的相互關系,受試對象為145個七年級或八年級的學生。假使應用EFA來探索該數據,結果表明276個測驗間的相互關系可用四個學生能力的潛在因子(語言能力、反應速度、推理能力和記憶能力)來進行解釋。

 

1 探索性因子分析

 

EFA的目標是通過發掘隱藏在數據下的一組較少的、更為基本的無法觀測的變量,來解釋一

 

組可觀測變量的相關性。這些虛擬的、無法觀測的變量稱作因子。(每個因子被認為可解釋多個觀測變量間共有的方差,因此准確來說,它們應該稱作公共因子。)

 

雖然PCAEFA存在差異,但是它們的許多分析步驟都是相似的。為闡述EFA的分析過程,

 

我們用它來對六個心理學測驗間的相關性進行分析。112個人參與了六個測驗,包括非語言的普通智力測驗(general)、畫圖測驗(picture)、積木圖案測驗(blocks)、迷宮測驗(maze)、閱讀測驗(reading)和詞匯測驗(vocab)。我們如何用一組較少的、潛在的心理學因素來解釋參與者的測驗得分呢?

 

數據集ability.cov提供了變量的協方差矩陣,你可用cov2cor()函數將其轉化為相關系數矩陣。

 

options(digits=2)     #設置小數點后保留兩位小數

 

covariances <- ability.cov$cov     #獲取協方差矩陣

 

correlations <- cov2cor(covariances)      #協方差矩陣轉化為相關系數矩陣

 

correlations

 

 

 

與使用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是要進行的模擬分析的數量

 

 

 

結果分析:圖中同時展示了PCAEFA的結果。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欄指成分唯一性,即方差無法被主成分解釋的比例(1h2

 

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

 

結果分析:根據以上結果,你可以看出正交旋轉和斜交旋轉的不同之處。對於正交旋轉,因子分析的重點在於因子結構矩陣(變量與因子的相關系數),而對於斜交旋轉,因子分析會考慮三個矩陣:因子結構矩陣、因子模式矩陣和因子關聯矩陣。

 

因子模式矩陣即標准化的回歸系數矩陣。它列出了因子預測變量的權重。因子關聯矩陣即因子相關系數矩陣。

 

在結果中,PA1PA2欄中的值組成了因子模式矩陣。它們是標准化的回歸系數,而不是相關系數。注意,矩陣的列仍用來對因子進行命名(雖然此處存在一些爭論)。你同樣可

 

以得到一個語言因子和一個非語言因子。

 

因子關聯矩陣顯示兩個因子的相關系數為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 因子得分

 

相比PCAEFA並不那么關注計算因子得分。在fa()函數中添加score = TRUE選項(原始數據可得時)便可很輕松地獲得因子得分。另外還可以得到得分系數(標准化的回歸權重),它在返回對象的weights元素中。

 

對於ability.cov數據集,通過二因子斜交旋轉法便可獲得用來計算因子得分的權重:

 

fa.promax$weights

 

 

 

總結:主成分分析(PCA)和探索性因子分析(EFA)兩種方法。PCA在數據降維方面非常有用,它能用一組較少的不相關變量來替代大量相關變量,進而簡化分析過程。EFA包含很多方法,可用來發現一組可觀測變量背后潛在的或無法觀測的結構(因子)。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM