主成分分析(PCA)是一種數據降維技巧,它能將大量相關變量轉化爲一組不多的不相關變量,這些無關變量稱爲主成分。git
探索性因子分析(EFA)是一系列用來發現一組變量的潛在結構的方法,經過尋找一組更小 的、潛在的或隱藏的結構來解釋已觀測到的、變量間的關係。算法
R的基礎安裝包中提供了PCA和EFA的函數,分別爲princomp ()和factanal()dom
psych包中有用的因子分析函數函數
函數 | 描述 |
principal() | 含多種可選的方差放置方法的主成分分析 |
fa() | 可用主軸、最小殘差、加權最小平方或最大似然法估計的因子分析 |
fa.parallel() | 含平等分析的碎石圖 |
factor.plot() | 繪製因子分析或主成分分析的結果 |
fa.diagram() | 繪製因子分析或主成分分析的載荷矩陣 |
scree() | 因子分析和主成分分析的碎石圖 |
(1)數據預處理;PCA和EFA都是根據觀測變量間的相關性來推導結果。用戶能夠輸入原始數據矩陣或相關係數矩陣列到principal()和fa()函數中,若輸出初始結果,相關係數矩陣將會被自動計算,在計算前請確保數據中沒有缺失值;工具
(2)選擇因子分析模型。判斷是PCA(數據降維)仍是EFA(發現潛在結構)更符合你的分析目標。若選擇EFA方法時,還須要選擇一種估計因子模型的方法(如最大似然估計)。spa
(3)判斷要選擇的主成分/因子數目;code
(4)選擇主成分/因子;component
(5)旋轉主成分/因子;對象
(6)解釋結果;blog
(7)計算主成分或因子得分。
PCA的目標是用一組較少的不相關變量代替大量相關變量,同時儘量保留初始變量的信息,這些推導所得的變量稱爲主成分,它們是觀測變量的線性組合。如第一主成分爲:
PC1=a1X1=a2X2+……+akXk 它是k個觀測變量的加權組合,對初始變量集的方差解釋性最大。
第二主成分是初始變量的線性組合,對方差的解釋性排第二, 同時與第一主成分正交(不相關)。後面每個主成分都最大化它對方差的解釋程度,同時與以前全部的主成分都正交,但從實用的角度來看,都但願能用較少的主成分來近似全變量集。
PCA中須要多少個主成分的準則:
根據先驗經驗和理論知識判斷主成分數;
根據要解釋變量方差的積累值的閾值來判斷須要的主成分數;
經過檢查變量間k*k的相關係數矩陣來判斷保留的主成分數。
最多見的是基於特徵值的方法,每一個主成分都與相關係數矩陣的特徵值 關聯,第一主成分與最大的特徵值相關聯,第二主成分與第二大的特徵值相關聯,依此類推。
Kaiser-Harris準則建議保留特徵值大於1的主成分,特徵值小於1的成分所解釋的方差比包含在單個變量中的方差更少。
Cattell碎石檢驗則繪製了特徵值與主成分數的圖形,這類圖形能夠展現圖形彎曲情況,在圖形變化最大處之上的主成分都保留。
最後,還能夠進行模擬,依據與初始矩陣相同大小的隨機數矩陣來判斷要提取的特徵值。若基於真實數據的某個特徵值大於一組隨機數據矩陣相應的平均特徵值,那麼該主成分能夠保留。該方法稱做平行分析。
利用fa.parallel()函數,可同時對三種特徵值判別準則進行評價。
library(psych) fa.parallel(USJudgeRatings[,-1],fa="PC",n.iter=100,show.legend=FALSE,main="Screen plot with parallel analysis")
碎石頭、特徵值大於1準則和100次模擬的平行分析(虛線)都代表保留一個主成分便可保留數據集的大部分信息,下一步是使用principal()函數挑選出相應的主成分。
principal()函數可根據原始數據矩陣或相關係數矩陣作主成分分析
格式爲:principal(的,nfactors=,rotate=,scores=)
其中:r是相關係數矩陣或原始數據矩陣;
nfactors設定主成分數(默認爲1);
rotate指定旋轉的方式[默認最大方差旋轉(varimax)]
scores設定是否須要計算主成分得分(默認不須要)。
美國法官評分的主成分分析 library(psych) pc<-principal(USJudgeRatings[,-1],nfactors=1) pc
PC1欄包含了成分載荷,指觀測變量與主成分的相關係數。若是提取不止一個主成分,則還將會有PC二、PC3等欄。成分載荷(component loadings)可用來解釋主成分的含義。此處可看到,第一主成分(PC1)與每一個變量都高度相關,也就是說,它是一個可用來進行通常性評價的維度。
h2柆指成分公因子方差-----主成分對每一個變量的方差解釋度。
u2欄指成分惟一性-------方差沒法 被主成分解釋的比例(1-h2)。
SS loadings行包含了主成分相關聯的特徵值,指的是與特定主成分相關聯的標準化後的方差值。
Proportin Var行表示的是每一個主成分對整個數據集的解釋程度。
結果不止一個主成分的狀況
library(psych) fa.parallel(Harman23.cor$cov,n.obs=302,fa="pc",n.iter=100,show.legend=FALSE,main="Scree plot with parallel analysis")
載荷陣解釋了成分和因子的含義,第一成分與每一個身體測量指標都正相關,看起來彷佛是一個通常性的衡量因子;第二主成分與前四個變量負相關,與後四個變量正相關,所以它看起來彷佛是一個長度容量因子。但理念上的東西都不容易構建,當提取了多個成分時,對它們進行旋轉可以使結果更具備解釋性。
旋轉是一系列將成分載荷陣變得更容易解釋的數學方法,它們儘量地對成分去噪。
旋轉方法有兩種:使選擇的成分保持不相關(正效旋轉),和讓它們變得相關(斜交旋轉)。
旋轉方法也會依據去噪定義的不一樣而不一樣。
最流行的下次旋轉是方差極大旋轉,它試圖對載荷陣的列進行去噪,使得每一個成分只是由一組有限的變量來解釋(即載荷陣每列只有少數幾個很大的載荷,其餘都是很小的載荷)。
install.packages("GPArotation") library(GPArotation) rc<-principal(Harman23.cor$cov,nfactors=2,rotate="varimax") rc
列名從PC變成了RC,以表示成分被旋轉
觀察能夠發現第一主成分主要由前四個變量來解釋,第二主成分主要由變量5到變量8來解釋。
注意兩個主成分仍不相關,對變量的解釋性不變,這是由於變量的羣組沒有發生變化。另外,兩個主成分放置後的累積方差解釋性沒有變化,變的只是各個主成分對方差的解釋(成分1從58%變爲44%,成分2從22%變爲37%)。各成分的方差解釋度趨同,準確來講,此時應該稱它們爲成分而不是主成分。
利用principal()函數,很容易得到每一個調查對象在該主成分上的得分。
<strong>從原始數據中獲取成分得分</strong>
library(psych) pc<-principal(USJudgeRatings[,-1],nfactors=1,score=TRUE) head(pc$scores)
當scores=TRUE時,主成分得分存儲在principal()函數返回對象的scores元素中。
cor(USJudgeRatings$CONT,PC$scores)
<strong>獲取主成分得分的係數</strong>
library(psych) rc<-principal(Harman23.cor$cov,nfactor=2,rotate="varimax") round(unclass(rc$weights),2)
獲得主成分得分:
PC1=0.28*height+0.30*arm.span+0.30*forearm+0.29*lower.leg-0.06*weight-0.08*bitro.diameter-0.10*chest.girth-0.04*chest.width
PC2=-0.05*height-0.08*arm.span-0.09*forearm-0.06*lower.leg+0.33*weight+0.32*bitro.diameter+0.34*chest.girth+0.27*chest.width
options(digits=2) covariances<-ability.cov$cov correlations<-cov2cor(covariances) correlations
ability.cov提供了變量的協方差矩陣
cov2cor()函數將其轉化爲相關係數矩陣
library(psych) convariances<-ability.cov$cov correlations<-cov2cor(covariances) fa.parallel(correlations,n.obs=112,fa="both",n.iter=100,main="Scree plots with parallel analysis")
若使用PCA方法,可能會選擇一個成分或兩個成分。當搖擺不定時,高估因子數一般比低估因子數的結果好,由於高估因子數通常較少曲解「真實」狀況。
<strong>未旋轉的主軸迭代因子法</strong>
fa<-fa(correlations,nfactors=2,rotate="none",fm="pa") fa
<strong>用正交旋轉提取因子</strong>
fa.varimax<-fa(correlations,nfactors=2,rotate="varimax",fm="pa") fa.varimax
<strong>正交放置將人爲地強制兩個因子不相關</strong>
<strong>正交旋轉,因子分析的重點在於因子結構矩陣(變量與因子的相關係數)</strong>
fa.promax<-fa(correlations,nfactors=2,rotate="promax",fm="pa") fa.promax
<strong>對於斜交旋轉,因子分析會考慮三個矩陣:因子結構矩陣、因子模式矩陣和因子關聯矩陣</strong>
<strong>因子模式矩陣即標準化的迴歸係數矩陣,它列出了因子的預測變量的權重;</strong>
<strong>因子關聯矩陣即因子相關係數矩陣;</strong>
<strong>因子結構矩陣(或稱因子載荷陣),可以使用公式F=P*Phi來計算獲得,其中F是載荷陣,P爲因子模式矩陣,Phi爲因子關聯矩陣。</strong>
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.promax,labels=rownames(fa.promax$loadings))
fa.diagram(fa.promax,simple=TRUE)
fa.promax$weights