主成分分析和探索性因子分析是两种用来探索和简化多变量复杂关系的常用方法。
主成分分析(PCA)是一种将数据降维技巧,它将大量相关变量转化成一组很少的不相关变量,这些无相关变量称为主成分。
探索性因子分析(EFA)是一系列用来发现一组变量的潜在结构的方法。
R基础安装包提供了PCA和EFA的函数,分别是princomp()和factanal()。本章重点介绍psych包中提供的函数,该包提供了比基础函数更丰富和有用的选项。
- principal() 含多种可选的方差旋转方法的主成分分析;
- fa() 可用主轴、最小残差、加权最小平方或最大似然法估计的因子分析;
- fa.parallel() 含平行分析的碎石图;
- factor.polt() 绘制因子分析或主成分分析的结果;
- fa.diagram() 绘制因子分析或主成分的载荷矩阵;
- scree() 因子分析和主成分分析的碎石图
最常见步骤
1、数据预处理,在计算前请确保数据没有缺失值;
2、选择因子模型,是选择PCA还是EFA,如果选择EFA,需要选择一种估计因子模型,如最大似然法估计;
3、判断要选择的主成分/因子数目;
4、选择主成分/因子;
5、旋转主成分/因子;
6、解释结果;
7、计算主成分或因子得分。
主成分分析
- 例1主成分分析,USJudgeRatings数据集包含了律师对美国高等法院法官的评分。
加载psych包
library(ggplot2)
library(psych)
展示基于观测特征值的碎石检验、根据100个随机数据矩阵推导出来的特征值均值、以及大于1的特征值准则(Y=1的水平线)
fa.parallel(USJudgeRatings[, -1], fa = "pc", n.iter = 100, show.legend = FALSE, main = 'Scree plot with parallel analysis')
对数据USJudgeRatings进行主成分分析
pc<-principal(USJudgeRatings[, -1],nfactors=1)
pc
- 例2主成分分析,Harman23.cor数据集包含了305个女孩的8个身体指标
加载psych包
library(ggplot2)
library(psych)
展示基于观测特征值的碎石检验、根据100个随机数据矩阵推导出来的特征值均值、以及大于1的特征值准则(Y=1的水平线)
fa.parallel(Harman23.cor$cov, n.obs=305,fa = "pc", n.iter = 100, show.legend = FALSE, main = 'Scree plot with parallel analysis')
对数据Harman23.cor进行主成分分析
pc2<-principal(Harman23.cor$cov,nfactors=2,rotate = 'none')
pc2
- 例3主成分旋转,Harman23.cor数据集包含了305个女孩的8个身体指标
旋转是一系列将成分载荷变得更容易解释的数学方法,它们尽可能地对成分去噪。
rc2<-principal(Harman23.cor$cov,nfactors = 2,rotate='varimax')
rc2
获得主成分得分,USJudgeRatings数据集包含了律师对美国高等法院法官的评分。
library(ggplot2)
library(psych)
pc3<-principal(USJudgeRatings[, -1],nfactors=1,scores=TRUE)
pc3
head(pc3$scores)
获得律师与法官的接触频数与法官评分间的相关系数,执行结果看到两者关联非常小。
cor(USJudgeRatings$CONT,pc3$scores)
获取主成分得分的系数,Harman23.cor数据集包含了305个女孩的8个身体指标
当主成分分析基于相关系数矩阵(如Harman23.cor$cov)时,原始数据便不可用了,也不可能获取每个观测的主成分得分,但是可以得到用来计算主成分得分的系数。
在身体测量数据中,有各个身体测量指标间的相关系数,但是没有305个女孩的个体测量值。
library(ggplot2)
library(psych)
rc3<-principal(Harman23.cor$cov,nfactors = 2,rotate='varimax')
round(unclass(rc3$weights),2)
利用如下公式可以得到主成分得分
pc1=0.28height+0.30arm.span+0.30forearm+0.28lower.leg-0.06weight-0.08bitro.diamete-0.10chest.girth-0.04chest.width
pc2=-0.05height-0.08arm.span-0.09forearm-0.06lower.leg+0.33weight+0.32bitro.diamete+0.34chest.girth+0.27chest.width