前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【数据分析 R语言实战】学习笔记 第十章(下)因子分析

【数据分析 R语言实战】学习笔记 第十章(下)因子分析

作者头像
统计学家
发布2019-04-10 10:55:55
2.7K0
发布2019-04-10 10:55:55
举报

10.2因子分析

与主成分分析一样,因子分析也是一种“降维”的统计方法。它们的出发点都是变量的相关系数矩阵,在损失较少信息的前提下,把多个变量综合成少数几个指标来研究总体各方面信息,并且这少数几个综合变量所代表的信息不能重叠,即变量间不相关。

通常,研究中得到的观察数据都是关于事物的外在特征或个别的具体特征,这些特征的观测值存在聚合趋势,有些变量之间存在高度的相关性,这种高度相关性往往来源于一个共同的制约因素,称为共同因子。如果能够在一批多维数据资料中找到m个因子来解释变量的大部分变异,就是所谓的因子分析。简单地说,就是根据相关性对变量分组,同组内的变量之问相关性较高,不同组间的相关性较低,最终用少数几个因子描述指标或因素之间的联系。

因子载荷矩阵的估计方法

提取因子的方法有多种,常用的足主成分分析、主因子分析、迭代主因子分析和极大似然分析等。

R语言实现

R中自带的因子分析函数factanal()采用极大似然估计方法估计因子载荷,适用于大样本量的数据分析,其调用格式为

factanal(x, factors, data = NULL, covmat =NULL, n.obs = NA,subset, na.action, start = NULL,scores = c("none", "regression","Bartlett"),rotation = "varimax", control = NULL, ...)

x是公式或用于因子分析的数据,可以是矩阵(每行为一个样本)或数据框:factors表示要生成的因子个数:data指定数据集,当x为公式形式时使用;covmat是样本的协方差矩阵或相关系数矩阵,使用这个参数时x可以忽略:scores表示计算因子得分的方法;rotation表示因子旋转方法,默认为“varimax“:方差最大旋转。实际上,应用主成分法估计因子载荷的方法也使用得十分广泛,但R中仅有极大似然估计的函数factanal()因此我们可以仿照factanal()的输出结果,自己写出主成分法的因子分析函数factor.analysis()。

代码语言:javascript
复制
> factor.analysis=function(x,m){
代码语言:javascript
复制
+   p=nrow(x);x.diag=diag(x);sum.rank=sum(x.diag)
代码语言:javascript
复制
+   rowname=paste("X",1:p,sep="")  #设置行名、列名
代码语言:javascript
复制
+   colname=paste("Factor",1:m,sep="")
代码语言:javascript
复制
+   A=matrix(0,nrow=p,ncol=m,dimnames=list(rowname,colname))  #构造因子载荷矩阵A,初值设为0
代码语言:javascript
复制
+   eig=eigen(x)  #eig包含两个元素,values为特征根,vectors为特征向量
代码语言:javascript
复制
+   for(i in 1:m)
代码语言:javascript
复制
+     A[,i]=sqrt(eig$values[i])*eig$vectors[,i]  #填充矩阵A的值
代码语言:javascript
复制
+   var.A=diag(A%*%t(A))  #公共因子的方差
代码语言:javascript
复制
+   rowname1=c("SS loadings","Proportion Var","Cumulative Var")
代码语言:javascript
复制
+   result=matrix(0,nrow=3,ncol=m,dimnames=list(rowname1,colname))  #构造输出结果的矩阵,初值设为0
代码语言:javascript
复制
+   for(i in 1:m){
代码语言:javascript
复制
+     result[1,i]=sum(A[,i]^2)  #计算各因子的方差
代码语言:javascript
复制
+     result[2,i]=result[1,i]/sum.rank  #计算方差贡献率
代码语言:javascript
复制
+     result[3,i]=sum(result[1,1:i])/sum.rank  #累计方差贡献率
代码语言:javascript
复制
+   }
代码语言:javascript
复制
+   method=c("Principal Component Method")
代码语言:javascript
复制
+   #输出计算结果
代码语言:javascript
复制
+   list(method=method,loadings=A,var=cbind(common=var.A,specific=x.diag-var.A),result=result)
代码语言:javascript
复制
+ }

例:

一家股份制商业银行为研究对象,选取I1个指标来研究它们的经营绩效,

代码语言:javascript
复制
> bank=read.table("d:/data/bank.txt",header=T)
代码语言:javascript
复制
> bank=bank[,-1]  #剔除第一列序号
代码语言:javascript
复制
> R=cor(bank)  #计算相关系数矩阵
代码语言:javascript
复制
> options(digits=3)  #结果显示3位有效数字
代码语言:javascript
复制
> factor.analysis(R,5)
代码语言:javascript
复制
$method
代码语言:javascript
复制
[1] "Principal Component Method"
代码语言:javascript
复制
代码语言:javascript
复制
$loadings
代码语言:javascript
复制
    Factor1 Factor2 Factor3  Factor4 Factor5
代码语言:javascript
复制
X1    0.394  0.2431 -0.2041  0.76100  0.3940
代码语言:javascript
复制
X2   -0.209 -0.1280  0.8928  0.12540 -0.2654
代码语言:javascript
复制
X3    0.804  0.1743  0.4772  0.20028 -0.0819
代码语言:javascript
复制
X4    0.877  0.1978  0.2827 -0.23663  0.1982
代码语言:javascript
复制
X5    0.594  0.2171 -0.0425  0.30028 -0.6327
代码语言:javascript
复制
X6    0.309  0.8681  0.2126  0.00168  0.2912
代码语言:javascript
复制
X7    0.911 -0.0434 -0.1026 -0.21235 -0.0258
代码语言:javascript
复制
X8    0.200 -0.8106  0.0252  0.52455  0.0766
代码语言:javascript
复制
X9    0.856 -0.4227  0.0227 -0.14650  0.0640
代码语言:javascript
复制
X10  -0.764  0.5250 -0.0233  0.24916 -0.2040
代码语言:javascript
复制
X11   0.644  0.2050 -0.5499 -0.00226 -0.3653
代码语言:javascript
复制
代码语言:javascript
复制
$var
代码语言:javascript
复制
    common specific
代码语言:javascript
复制
X1   0.990  0.00991
代码语言:javascript
复制
X2   0.943  0.05685
代码语言:javascript
复制
X3   0.951  0.04908
代码语言:javascript
复制
X4   0.984  0.01646
代码语言:javascript
复制
X5   0.892  0.10807
代码语言:javascript
复制
X6   0.979  0.02104
代码语言:javascript
复制
X7   0.888  0.11206
代码语言:javascript
复制
X8   0.979  0.02116
代码语言:javascript
复制
X9   0.937  0.06299
代码语言:javascript
复制
X10  0.964  0.03564
代码语言:javascript
复制
X11  0.893  0.10739
代码语言:javascript
复制
代码语言:javascript
复制
$result
代码语言:javascript
复制
               Factor1 Factor2 Factor3 Factor4 Factor5
代码语言:javascript
复制
SS loadings      4.663   2.101   1.508   1.185  0.9424
代码语言:javascript
复制
Proportion Var   0.424   0.191   0.137   0.108  0.0857
代码语言:javascript
复制
Cumulative Var   0.424   0.615   0.752   0.860  0.9454

根据loadings的输出结果,我们可以写出原始变量和5个因子之间的线性关系式

例2

某公司想要了解消费者购买牙膏时更追求什么样的}J标,于是通过商场拦访对30个人进行访谈,用7级里克特量表询问他们对以下陈述的认同程度(即1表示非常不同意,7表示非常同意)。

代码语言:javascript
复制
> yg=read.table("d:/data/yagao.txt",header=T)
代码语言:javascript
复制
> data=yg[,-1]
代码语言:javascript
复制
> factanal(data,factors=2)
代码语言:javascript
复制
代码语言:javascript
复制
Call:
代码语言:javascript
复制
factanal(x = data, factors = 2)
代码语言:javascript
复制
代码语言:javascript
复制
Uniquenesses:
代码语言:javascript
复制
   V1    V2    V3    V4    V5    V6 
代码语言:javascript
复制
0.104 0.440 0.141 0.384 0.238 0.294 
代码语言:javascript
复制
代码语言:javascript
复制
Loadings:
代码语言:javascript
复制
   Factor1 Factor2
代码语言:javascript
复制
V1  0.945         
代码语言:javascript
复制
V2          0.747 
代码语言:javascript
复制
V3  0.917  -0.135 
代码语言:javascript
复制
V4          0.779 
代码语言:javascript
复制
V5 -0.868         
代码语言:javascript
复制
V6          0.838 
代码语言:javascript
复制
代码语言:javascript
复制
               Factor1 Factor2
代码语言:javascript
复制
SS loadings      2.505   1.896
代码语言:javascript
复制
Proportion Var   0.417   0.316
代码语言:javascript
复制
Cumulative Var   0.417   0.733
代码语言:javascript
复制
代码语言:javascript
复制
Test of the hypothesis that 2 factors are sufficient.
代码语言:javascript
复制
The chi square statistic is 4.86 on 4 degrees of freedom.
代码语言:javascript
复制
The p-value is 0.302 
代码语言:javascript
复制
根据载荷系数矩阵,写出2个因子和原变量之间的线性关系式
代码语言:javascript
复制
代码语言:javascript
复制
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2015-06-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习与统计学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档