R語言-主成分分析
1.PCA
使用場景:主成分分析是一種數據降維,可以將大量的相關變量轉換成一組很少的不相關的變量,這些無關變量稱為主成分
步驟:
- 數據預處理(保證數據中沒有缺失值)
- 選擇因子模型(判斷是PCA還是EFA)
- 判斷要選擇的主成分/因子數目
- 選擇主成分
- 旋轉主成分
- 解釋結果
- 計算主成分或因子的得分
案例:從USJudgeRatings數據集中有11個變量,如何去減化數據(單個主成分分析)
1.使用碎石圖確定需要提取的主成分個數
1 library(psych) 2 # 1.做出碎石圖確定主成分的個數 3 fa.parallel(USJudgeRatings[,-1],fa=‘pc‘,n.iter = 100,show.legend = F,main = ‘Scree plot with parallel analysis‘)
結論:在特征值大於1的的點附近,都表明保留1個主成分即可
2.提取主成分
1 # 1.第一個參數是關系矩陣 2 # 2.nfactors指定主成分的個數 3 # 3.rotate指定旋轉方法,默認varimax 4 # 4.scores表示是否需要計算主成分得分,默認不需要 5 pc <- principal(USJudgeRatings[,-1],nfactors = 1) 6 pc
結論:第一主成分與每一個變量高度相關
3.獲取主成分得分
1 pc <- principal(USJudgeRatings[,-1],nfactors = 1,scores = T) 2 head(pc$scores) 3 cor(USJudgeRatings$CONT,pc$scores)
4.獲取相關系數
1 cor(USJudgeRatings$CONT,pc$scores)
結論:律師和法官的私交和律師的評級沒有關系
案例2:減少女孩身體指標的主成分分析(多個主成分分析)
1.判斷個數
1 fa.parallel(Harman23.cor$cov,n.obs = 203,fa=‘pc‘,n.iter = 100,show.legend = F, 2 main = ‘Scree plot with parallel analysis‘)
結論:有2個點在水平線1上,所以需要2個主成分
2.主成分分析
pc2 <- principal(Harman23.cor$cov,nfactors = 2,rotate = ‘none‘) pc2
結論:需要對數據旋轉作進一步分析
3.主成分旋轉(盡可能對成分去噪)
1 rc <- principal(Harman23.cor$cov,nfactors = 2,rotate = ‘varimax‘) 2 rc
4.獲取主成分的得分系數
1 round(unclass(rc$weights),2)
結論:可以通過系數*數值來計算出主成分得分
2.EFA
使用場景:探索因子分析發掘數據下一組較少的,無法觀測的變量來解釋一組可觀測變量的相關性
案例:使用EFA對6個心理學測試來檢測參與者的得分
1.判斷需要提取的因子數
1 covariances <- ability.cov$cov 2 correlations <- cov2cor(covariances) 3 fa.parallel(correlations,n.obs = 112,fa=‘both‘,n.iter=100,main = ‘Scree plots with parallel analysis‘)
結論:需要提取2個因子,因為圖形在拐點之上有2個分布
2.提取公共因子
1 fa <- fa(correlations,nfactors = 2,rotate = ‘none‘,fm=‘pa‘) 2 fa
結論:2個因子解釋了6個心理學測試的60%方差,需要進一步旋轉
1 fa.varimax <- fa(correlations,nfactors=2,rotate=‘varimax‘,fm=‘pa‘) 2 fa.varimax
結論:閱讀和詞匯在第一個因子占比較大,畫圖,積木在第二個因子上成分較大,如果想進一步判斷這個各因子是否相關,需要使用斜交旋轉提取因子
1 fa.promax <- fa(correlations,nfactors=2,rotate=‘Promax‘,fm=‘pa‘) 2 fa.promax
結論:相關性為0.57,相關性很大,如果相關性不大,使用正交旋轉即可
3.計算得分
1 fsm <- function(oblique) { 2 if (class(oblique)[2]=="fa" & is.null(oblique$Phi)) { 3 warning("Object doesn‘t look like oblique EFA") 4 } else { 5 P <- unclass(oblique$loading) 6 F <- P %*% oblique$Phi 7 colnames(F) <- c("PA1", "PA2") 8 return(F) 9 } 10 } 11 12 fsm(fa.promax)
5.正交旋轉所得因子得分圖
結論:詞匯和閱讀在第一因子上載荷較大,圖片,迷宮,積木在第二個因子上載荷較大,普通智力檢測在二者的分布較為平均
6.斜交旋轉所生成的因子圖
1 fa.diagram(fa.promax,simple = F)
結論:顯示了因子之間的關系,該圖比上一張圖更為準確
R語言-主成分分析