当前位置:   article > 正文

因子分析(factor analysis)

因子分析

因子分析

  1. 基本思想
  2. 公式推导
  3. 基于R的实验
  4. 结论

基本思想

在这一讲当中呢,我们谈一谈,因子分析(factor analysis),在上一节当中,我们说了主成分分析,我们说这两种方法有点相似,初学者往往有些搞不清楚。首先从原理上说,主成分分析是试图寻找原有自变量的一个线性组合。这个组合方差要大,那么携带的信息也就多,也就是相当于把原始数据的主要成分给拿了出来。而因子分析呢,是从假设出发,它是假设所有的自变量x出现的原因是因为背后存在一个潜变量f,也就是我们所说的因子,在这个因子的作用下,x可以被观察到。什么意思呢,举个例子,比如一个学生考试,数学,化学 ,物理都考了满分,那么我们认为这个学生理性思维较强,理性思维就是一个因子。在这个因子的作用下,偏理科的成绩才会那么高。这就是因子分析,通过这点,大家就可以感受到,因子分析和主成分分析是明显不一样的。并且因子分析最早就由心理学家提出的。那么因子分析呢,又存在两个方向,一个是探索性因子分析(exploratory factor
analysis)。另一个是验证性因子分析(confirmatory factor
analysis)。探索性因子分析是不确定一堆自变量背后有几个因子,我们通过这种方法试图寻找到这几个因子。而验证性因子分析是已经假设自变量背后有几个因子,试图通过这种方法去验证一下这种假设是否正确。验证性因子分析又和结构方程模型有很大关系。后面我们会专门的介绍,今天先介绍探索性因子分析。

数学推导

因子分析假设自变量x背后存在影响它的因子z,既然是z影响x,那么x就可以写成z的函数了。当然,直接写不行,它有个假设,假设这个x是已经中心化的。那么就可以写出下式:

xiμ=j=1maijzj+ϵi  i=1,2,...l,

如果为了方便呢,我们可以把它写成矩阵代数的形式如下:
xμ=Az+ϵ

这里呢,需要加一些假设,否则没法求解。首先是无关于误差项 ϵ的,均值为 0,协方差矩阵ϵ=E(ϵϵT)=diag(σ12,σ22,...,σl2).还需要假设因子和误差是独立的。在这种情况下,当我们的数据已经中心化之后,上面的因子分析式子就可以写成下式:
x=Az+ϵ

进一步有
xT=(Az+ϵ)T

所以
xxT=(Az+ϵ)(Az+ϵ)T=AzzTA+ϵzTAT+AzϵT+ϵϵT

这样的话,对上式两边取数学期望。利用误差项均值为 0,我们得到下式:
E[xxT]=AE[zzT]AT+E[ϵϵT]

这里还需要一个假设,那就是因子的协方差矩阵为单位矩阵。也就可以得到下式
x=AAT+ϵ
这样的话,就简明了一些,我们主要是为了求载荷矩阵 A和因子z。但是我们在推导过程中先巧妙地把 z给去掉了。这样就可以先计算出A,再计算 z。那么A其实就是矩阵 (xϵ)的一种分解。当然这种分解不是唯一的,因为如果一个矩阵 C可以写成AAT,那么 C=AU(AU)T也是成立的。其中 U为正交变换。所以才有了因子变换这个东西,经过因子变换,矩阵A中一部分数被变的很小,这样就可以看出哪个自变量属于哪个因子了。如果矩阵 A计算出来了。那么z就好说了. z=ATx1x。这样就全部计算出来了。
下面给出一个基于R的因子分析

基于R的因子分析

数据介绍:数据是来自上市公司的财务指标,因此想通过因子分析将财务指标进降维,希望提取出一些反应不同特征的因子出来。最后根据因子对上市公司进行排名。

#设置路径
setwd('D:/Rdata')
#清除空间变量
rm(list = ls())                   
#载入读取excel的包
library(readxl)  
library(psy)     


#读取数据
dat.fact <- read_excel(file='MicEcoData.xlsx')
head(dat.fact)
# A tibble: 6 x 8
  资产负债率 总资产增长率B 基本每股收益增长率B 净利润增长率B 营业利润增长率B 每股收益 每股营业收入
       <dbl>         <dbl>               <dbl>         <dbl>           <dbl>    <dbl>        <dbl>
1   0.950996      0.324008            0.044776      0.026753        0.056436   0.7000     2.054515
2   0.552744      0.473920            0.315789      0.773855        0.799483   0.2500     0.379673
3   0.068507      1.966211            0.417778      1.195843        1.199118   0.1276     0.251927
4   0.580620      0.338351            1.479791      2.792940        2.749402   0.1902     0.296074
5   0.389105      0.083378           -0.250000     -0.224369       -0.177181   0.0600     0.153072
6   0.755508      0.061588           -0.444444      0.435094        0.435804   0.0500     0.206344
# ... with 1 more variables: 销售净利率 <dbl>
#重新命个名 
names(dat.fact) <- paste('x', 1:ncol(dat.fact), sep='')
#进行因子分析,设置因子个数为两个
factor.result <- factanal(x=dat.fact, factor=2, scores="regression")
#查看图
psy::scree.plot(dat.fact)  
#查看因子分析的各种结果   
names(factor.result)
 [1] "converged"    "loadings"     "uniquenesses" "correlation"  "criteria"     "factors"     
 [7] "dof"          "method"       "rotmat"       "scores"       "STATISTIC"    "PVAL"        
[13] "n.obs"        "call"        
print(factor.result)

Call:
factanal(x = dat.fact, factors = 2, scores = "regression")

Uniquenesses:
   x1    x2    x3    x4    x5    x6    x7    x8 
0.508 0.005 0.005 0.005 0.005 0.281 0.507 0.710 

Loadings:
   Factor1 Factor2
x1          0.695 
x2  0.997         
x3  0.997         
x4  0.998         
x5  0.998         
x6          0.846 
x7          0.702 
x8  0.251  -0.476 

               Factor1 Factor2
SS loadings      4.054   1.931
Proportion Var   0.507   0.241
Cumulative Var   0.507   0.748

Test of the hypothesis that 2 factors are sufficient.
The chi square statistic is 357.17 on 13 degrees of freedom.
The p-value is 2.4e-68 
> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62

效果还可以,哪几个变量属于哪个因子一目了然。
因子分析结果图
下面呢,我们做个更有意思的分析,现在经过因子分析已经将原来的8个财务指标进行合并,形成了两个因子,那么这两个因子按照加权合并,就形成了一个指标,通过对这一个指标进行排序,就可以得到上市公司的排名。下面是代码实现

# 计算权重
lambdas <- eigen(factor.result$correlation)$value            # 就是特指值所占的比例
(w <- lambdas[1:2]/sum(lambdas[1:2]))
 0.6391052 0.3608948

#计算因子得分
score <- factor.result$scores                                
eva <- score %*% w                                           # 进行排序    
 eva
             [,1]
 [1,]  0.44919649
 [2,] -0.21418681
 [3,] -0.47822650
 [4,] -0.22218907
 [5,] -0.45469601
 [6,] -0.31123904
 [7,] -0.33324507
 [8,] -0.31634880
 [9,]  0.16510054
[10,]  0.19619702
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

结论

本节带领大家了解了一下,因子分析。通过因子分析主要发掘变量背后存在的潜变量。并且提到了主成分分析与因子分析的不同,主成分分析主要是想寻找原始特征的一个线性组合。这个组合方差要最大。方差最大保证了主要成分的提取。为了计算方便,提出了一些假设,使得主成分分析成为了一个约束优化问题。而因子分析呢,是从假设开始入手,假设原始特征是由于因子的影响产生的,因此可以写出x=Af+ϵ,从这个表达式逐步进行假设求解。当然呢,主成分分析和因子分析有相似的地方,主要就是求解过程中,都很巧妙地和特征值,特征向量挂起关系。好,那么这一讲,我们就讲到这里,下一讲继续。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/94238
推荐阅读
  

闽ICP备14008679号