R语言机器学习与临床预测模型31--因子分析
本内容为【科研私家菜】R语言机器学习与临床预测模型系列课程
R小盐准备介绍R语言机器学习与预测模型的学习笔记
你想要的R语言学习资料都在这里, 快来收藏关注【科研私家菜】
01 什么是因子分析?
因子分析是指研究从变量群中提取共性因子的统计技术。最早由英国心理学家C.E.斯皮尔曼提出。他发现学生的各科成绩之间存在着一定的相关性,一科成绩好的学生,往往其他各科成绩也比较好,从而推想是否存在某些潜在的共性因子,或称某些一般智力条件影响着学生的学习成绩。因子分析可在许多变量中找出隐藏的具有代表性的因子。将相同本质的变量归入一个因子,可减少变量的数目,还可检验变量间关系的假设。
因子分析的方法一般有两种:一是探索性因子分析(EFA);二是验证性因子分析(CFA)。探索性因子分析有助于建立新的假设、发展新的理论;验证性因子分析适用于理论架构已经较为清晰和完善的时候。
02 主成分分析与因子分析的差别
主成分分析仅仅是变量变换,强调解释数据变异的能力,适合做数据简化,模型中没有误差项,主成分没有实际意义;而因子分析是要寻找变量内部的相关性及潜在的公共因子,强调变量之间的相关性,适合检测数据结构,模型中有误差项,公因子一般有实际意义。 因子分析实际上是建立在主成分分析上的,可以看作是主成分的推广和扩展。
主成分分析:以离散程度(方差),来衡量样本间的差异性,得出的结果,难以从业务场景的角度解释。
因子分析:组合相关性较强的原始变量,目的是找到在背后起作用的少量关键因子,更容易用业务知识去加以解释。
把多个变量,根据主观(业务经验),或客观(具体分类算法),归为几个类别,从而使变量减少,便于分析。
在PCA中,每个主成分(或叫主成分变量更好理解)PC是由观测变量X整合出来的,即PC是观测变量X的线性组合:
而在EFA(或CFA)中,与之相反,观测变量X是因子变量F的线性组合,当然更可能的是一个观测变量X只有一个因子变量F来解释它。
选择因子模型分析步骤
03 探索性因子分析(EFA)
探索性因子分析(EFA)是一系列用来发现一组变量的潜在结构的方法。它通过寻找一组更小的、潜在的或隐藏的结构来解释已观测到的、显式的变量间的关系。
估计因子负荷量的方法主要包括:主成分分析法、主轴因子法、极大似然法等
#test.data <- Harman74.cor$cov #The 24 variable Holzinger - Harman problem
#fa.parallel(test.data,n.obs=145)
fa.parallel(Thurstone,n.obs=213) #the 9 variable Thurstone problem
#set.seed(123)
#minor <- sim.minor(24,4,400) #4 large and 12 minor factors
#ffa.parallel(minor$observed) #shows 5 factors and 4 components -- compare with
#fa.parallel(minor$observed,SMC=FALSE) #which shows 6 and 4 components factors
#a demonstration of parallel analysis of a dichotomous variable
#fp <- fa.parallel(psychTools::ability) #use the default Pearson correlation
#fpt <- fa.parallel(psychTools::ability,cor="tet") #do a tetrachoric correlation
#fpt <- fa.parallel(psychTools::ability,cor="tet",quant=.95) #do a tetrachoric correlation and
#use the 95th percentile of the simulated results
#apply(fp$values,2,function(x) quantile(x,.95)) #look at the 95th percentile of values
#apply(fpt$values,2,function(x) quantile(x,.95)) #look at the 95th percentile of values
#describe(fpt$values) #look at all the statistics of the simulated values
效果如下:
04 R语言实现因子分析
library(psych)
example17_3 <- read.table ("data.csv", header=TRUE, sep=",")
example17_3
fa.parallel(example17_3, fa="fa", n.iter=100, main="Screen plots with parallel analysis")
abline(0,0)
fa <- fa(example17_3, nfactors=4, rotate="none", fm="ml", score=TRUE)
fa
fa$weights
fa$scores
factor.plot(fa, labels=rownames(fa$loadings))
fa.diagram(fa, simple=FALSE)
fa2 <- fa(example17_3, nfactors=4, rotate="varimax", fm="ml", score=TRUE)
fa2
fa2$weights
fa2$scores
factor.plot(fa2, labels=rownames(fa$loadings))
fa.diagram(fa2, simple=FALSE)
library(GPArotation)
fa.promax <- fa(example17_3, nfactors=4, rotate="promax", fm="ml")
fa.promax
fa.diagram(fa.promax, simple=FALSE)
结果如下:
参考资料:
https://zhuanlan.zhihu.com/p/37440281
https://zhuanlan.zhihu.com/p/149246100
https://www.jianshu.com/p/2b318b94ff51
关注R小盐,关注科研私家菜(VX_GZH: SciPrivate),有问题请联系R小盐。让我们一起来学习 R语言机器学习与临床预测模型