R-第七章|因子分析

        和之前一样,也是根据老师的课件和自己的理解整理的,不过为了减少不必要的时间开支,只会记录一些重要的点,其他不关心的就不记录了。

目录

1. 因子分析理论基础

(1)因子分析和主成分分析的区别与联系

(2)因子分析模型

(3)因子载荷的意义

(4)因子旋转的目的

(5)因子得分

(6)最后画出因子信息图

2. 因子分析的基本步骤

(1)确认数据是否适合作因子分析

(2)构造因子变量

(3)按照方差贡献确定因子数

(4)旋转因子使其更具有可解释性

(5)计算因子得分并做因子图

3. 代码部分


1. 因子分析理论基础

(1)因子分析和主成分分析的区别与联系

        区别①:分析角度不一样。因子分析侧重于找到变量的共同点或者异常点,并且把原有的变量分类,构成新的综合变量;主成分分析只是单纯的降维。

        区别②:计算方法不一样。主成分分析是先投影到第一主成分上,方差最大化,然后第二主成分垂直于第一主成分。因子分析是已经知道了样本的分布,直接计算某个平面的概率最大化。

        联系:如果样本均匀分布,那么因子分析退化成主成分分析。

(2)因子分析模型

图1 

        因子载荷A的估计有两种,一种是主因子估计(涉及到谱分解),计算样本投影到某个轴的方差最大;另一种是极大似然估计法,知道样本分布规律的时候,可以用极大似然法,估计样本落在某个平面的概率,然后求概率的最大方差。

(3)因子载荷的意义

图2 

         a_{ij} 表示 xj (第i个变量)依赖 Fj (第j个因子)的程度,值越大,依赖程度越大。

        ①共同度就是列系数加总,表示同一个变量对所有因子的累计权重,如果低就说明这一组(m个)因子对该变量的解释性不好,也可以说因子的公共性不好。

        ②方差贡献就是行系数加总,表示同一个因子的累计权重。

(4)因子旋转的目的

        为了寻找每个主因子的实际意义,如果各个主因子的典型代表变量载荷不高,就需要进行旋转,使得因子载荷矩阵中的绝对值向0和1两个方向分化。

图3 

        结合上图进行理解,旋转前六个变量的三个因子的载荷比较平均,旋转后就比较明显得知Factor1包括x1和x2。

(5)因子得分

        已知X = AF+\varepsilon ,用回归估计法得到  F = (A^TA)^{-1}A^TX, Var(\varepsilon)=\sigma^2I

(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)

Published by

风君子

独自遨游何稽首 揭天掀地慰生平