#第14章 主成分分析和因子分析
#PCA的目标是用一组较少的 不相关变量代替大量相关变量
#以数据集USJudgeRatings为例 从实用角度出发 能否用较少的变量来总结除cont以外的11个变量
#如果可以 需要多少个 如何对他们进行定义
#注意数据需要保持初始得分的格式 没有缺失值#主成分分析步骤
# 案例1 分析会发现其主成分只有1个
#1 判断主成分的个数(碎石检验 平行分析 特征值大于1 共3种特征值判别进行评价)
#利用psych::fa.parallel可以同时对三种特征值判别准则进行评价
library(psych)
USJudgeRatings
psych::fa.parallel(USJudgeRatings[,-1],fa = "pc",n.iter = 100,
show.legend = FALSE, main = "scree plot with parallel analysis")
#表明1个主成分即可保留数据集的大部分信息
#2 提取主成分
pc <- psych::principal(USJudgeRatings[,-1],nfactors = 1)
pc#h2指成分公因子方差 即主成分对每个变量的方差解释度
#u2=1-h2 指成分唯一性 即方差无法被解释的比例
#SS loadings 与特定主成分相关联的标准化后的方差值 此处第一主成分的值为10
#Proportion Var每个主成分对整个数据集的解释程度 此处第一主成分解释了11个变量的92%的方差#3 获取主成分得分
pc <- psych::principal(USJudgeRatings[,-1],nfactors = 1,scores = TRUE)
head(pc$scores)# 获得律师与法官的接触频率数与法官评分间的相关系数
cor(USJudgeRatings$CONT,pc$score)# 案例2 分析会发现其主成分不只1个
# Harman23.cor数据集 希望用更少的变量替换这些原始身体指标 并设定样本大小为302个
#1 判断主成分的个数
Harman23.cor
psych::fa.parallel(Harman23.cor$cov,n.obs = 302,fa="pc",n.iter = 100,
show.legend = FALSE, main = "scree plot with parallel analysis 2")
#表明2个主成分即可保留数据集的大部分信息#2 提取主成分
pc2 <- psych::principal(Harman23.cor$cov,nfactors = 2,rotate = "none")
pc#当提取了多个成分时 对他们进行旋转可使结果更具解释性
#3 主成分旋转
#旋转是一系列将成分载荷阵变得更容易解释的数学方法 它们尽可能地对成分去噪
#旋转方法有:正交旋转(成分保持不相关)和斜交旋转(成分变得相关)
# 最流行的正交旋转是方差极大旋转#3.1 方差极大旋转的主成分分析
rc <- psych::principal(Harman23.cor$cov,nfactors = 2,rotate = "varimax")#4 获得主成分得分
rc <- psych::principal(Harman23.cor$cov,nfactors = 2,rotate = "varimax")
round(unclass(rc$weights),2)########探索性因子分析
#使用ability.cov 112个人参与了6个测验 用它来对6个心理学测验间的相关性进行分析
ability.cov
options(digits=2)
covariances <- ability.cov$cov
correlations <- cov2cor(covariances)
correlations#1 判断需提取的公共因子数
psych::fa.parallel(correlations,n.obs = 112,fa="both",n.iter = 100,#同时展示主成分和公共因子分析结果
show.legend = TRUE, main = "scree plot with parallel analysis 3")
#EFA结果显示需要提取2个因子#2 提取公因子
fa <- fa(correlations,nfactors = 2,rotate = "none",fm="pa")
fa#3.1 因子旋转 正交旋转提取因子
fa.varimax <- fa(correlations,nfactors = 2,rotate = "varimax",fm="pa")
fa.varimax#3.2 因子旋转 斜交旋转提取因子
library(GPArotation)
fa.promax <- fa(correlations,nfactors = 2,rotate = "promax",fm="pa")
fa.promax#绘制正交或斜交结果的图像
factor.plot(fa.varimax,labels = row.names(fa.varimax$loadings))
factor.plot(fa.promax,labels = row.names(fa.promax$loadings))
#可见 词汇和阅读在第一个因子上载荷较大 积木图案和迷宫在第二个因子上载荷较大 普通智力测验在两个因子上较为平均#4 因子得分 相对PCA而言 EFA不那么关注因子得分
fa.varimax$weights
fa.promax$weights#练习 Harman74.cor数据集
# fa.24tests <- fa(Harman74.cor$cov,nfactors=4,rotate="promax")covariances <- Harman74.cor$cov #$n.obs=145
correlations <- cov2cor(covariances)
correlations
#1 判断需提取的公共因子数
psych::fa.parallel(correlations,n.obs = 145,fa="both",n.iter = 100,#同时展示主成分和公共因子分析结果
show.legend = TRUE, main = "scree plot with parallel analysis 4")
#Parallel analysis suggests that the number of factors = 4
#and the number of components = 3
#EFA结果显示需要提取4个因子 PCA显示需要3个因子#2 提取公因子
fa <- fa(correlations,nfactors = 4,rotate = "none",fm="pa")
fa#3.1 因子旋转 正交旋转提取因子
fa.varimax <- fa(correlations,nfactors = 4,rotate = "varimax",fm="pa")
fa.varimax#3.2 因子旋转 斜交旋转提取因子
library(GPArotation)
fa.promax <- fa(correlations,nfactors = 4,rotate = "promax",fm="pa")
fa.promax#绘制正交或斜交结果的图像
factor.plot(fa.varimax,labels = row.names(fa.varimax$loadings))
factor.plot(fa.promax,labels = row.names(fa.promax$loadings))#4 因子得分 相对PCA而言 EFA不那么关注因子得分
fa.varimax$weights
fa.promax$weights