和之前一样,也是根据老师的课件和自己的理解整理的,不过为了减少不必要的时间开支,只会记录一些重要的点,其他不关心的就不记录了。
目录
1. 因子分析理论基础
(1)因子分析和主成分分析的区别与联系
(2)因子分析模型
(3)因子载荷的意义
(4)因子旋转的目的
(5)因子得分
(6)最后画出因子信息图
2. 因子分析的基本步骤
(1)确认数据是否适合作因子分析
(2)构造因子变量
(3)按照方差贡献确定因子数
(4)旋转因子使其更具有可解释性
(5)计算因子得分并做因子图
3. 代码部分
1. 因子分析理论基础
(1)因子分析和主成分分析的区别与联系
区别①:分析角度不一样。因子分析侧重于找到变量的共同点或者异常点,并且把原有的变量分类,构成新的综合变量;主成分分析只是单纯的降维。
区别②:计算方法不一样。主成分分析是先投影到第一主成分上,方差最大化,然后第二主成分垂直于第一主成分。因子分析是已经知道了样本的分布,直接计算某个平面的概率最大化。
联系:如果样本均匀分布,那么因子分析退化成主成分分析。
(2)因子分析模型
图1
因子载荷A的估计有两种,一种是主因子估计(涉及到谱分解),计算样本投影到某个轴的方差最大;另一种是极大似然估计法,知道样本分布规律的时候,可以用极大似然法,估计样本落在某个平面的概率,然后求概率的最大方差。
(3)因子载荷的意义
图2
表示 xj (第i个变量)依赖 Fj (第j个因子)的程度,值越大,依赖程度越大。
①共同度就是列系数加总,表示同一个变量对所有因子的累计权重,如果低就说明这一组(m个)因子对该变量的解释性不好,也可以说因子的公共性不好。
②方差贡献就是行系数加总,表示同一个因子的累计权重。
(4)因子旋转的目的
为了寻找每个主因子的实际意义,如果各个主因子的典型代表变量载荷不高,就需要进行旋转,使得因子载荷矩阵中的绝对值向0和1两个方向分化。
图3
结合上图进行理解,旋转前六个变量的三个因子的载荷比较平均,旋转后就比较明显得知Factor1包括x1和x2。
(5)因子得分
已知 ,用回归估计法得到
(6)最后画出因子信息图
图4
可以看到,狮头股份在Factor2轴上绝对值比较大,说明F2的得分比较高,同时狮头股份和x3方向一致,说明x3变量上狮头股份比其他主体得分更高。
2. 因子分析的基本步骤
(1)确认数据是否适合作因子分析
①变量较少的时候看相关系数矩阵-如果相关系数较低,说明变量之间没有太高的相关性,就不需要因子分析了。
②变量较多的时候相关系数矩阵数据较多,如果看相关系数会比较麻烦,可以用KMO和Bartlet's检验
(2)构造因子变量
此时的旋转是为了涵盖尽可能多的信息。
(3)按照方差贡献确定因子数
一般大于80%就可以了。
(4)旋转因子使其更具有可解释性
和构造因子变量那一步的旋转不一样,这一步旋转因子是为了让结果更有解释性。相当于在上一步得到的因子基础上旋转我们的变量,让变量倾向于某个因子,让结果更有解释性。再结合一下图3和图5,其实可以知道银子旋转之后变量会更加贴近因子(理解为坐标轴)。
一般这一步用"varimax"(最大方差正交旋转法)
图5
(5)计算因子得分并做因子图
3. 代码部分
setwd(".../") #设定工作路径
ex6.6 = read.csv("ex6.6.csv",header = T)
d6.6 = ex6.6[,-1] #第一列不要
rownames(d6.6) = ex6.6[,1] #给行名重新命名
head(d6.6) #预览数据# 1、因子分析-KMO
# 调用路径
setwd("D:/.../")
source("KMO_function.R") #调用老师写的函数
KMO= KMO_fun(d6.6)
KMO$overall; KMO$report #输出结果# 2、确定因子数目
## 可以用碎石图,也可以先选择3个,然后查看总方差,根据80%为临界值选择数目
outa1 = factanal(d6.6,3,scores="regression",rotation="none") #不旋转
outa2 = factanal(d6.6,3,scores="regression",rotation="varimax") #旋转
## factanal函数scores="regression(线性回归计算因子得分/Bartlett)"outa1$loadings #载荷
outa2$loadingsouta1$uniquenesses #共同度
outa2$uniquenesses#旋转前:因子得分画图
s1_before = outa1$scores[,1:2]
l1_before = outa1$loadings[,1:2]
biplot(s1_before,l1_before);abline(h=0,v=0,lty=3)#旋转后:因子得分画图
s1_after = outa2$scores[,1:2]
l1_after = outa2$loadings[,1:2]
biplot(s1_after,l1_after);abline(h=0,v=0,lty=3)