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()。
> factor.analysis=function(x,m){
+ p=nrow(x);x.diag=diag(x);sum.rank=sum(x.diag)
+ rowname=paste("X",1:p,sep="") #设置行名、列名
+ colname=paste("Factor",1:m,sep="")
+ A=matrix(0,nrow=p,ncol=m,dimnames=list(rowname,colname)) #构造因子载荷矩阵A,初值设为0
+ eig=eigen(x) #eig包含两个元素,values为特征根,vectors为特征向量
+ for(i in 1:m)
+ A[,i]=sqrt(eig$values[i])*eig$vectors[,i] #填充矩阵A的值
+ var.A=diag(A%*%t(A)) #公共因子的方差
+ rowname1=c("SS loadings","Proportion Var","Cumulative Var")
+ result=matrix(0,nrow=3,ncol=m,dimnames=list(rowname1,colname)) #构造输出结果的矩阵,初值设为0
+ for(i in 1:m){
+ result[1,i]=sum(A[,i]^2) #计算各因子的方差
+ result[2,i]=result[1,i]/sum.rank #计算方差贡献率
+ result[3,i]=sum(result[1,1:i])/sum.rank #累计方差贡献率
+ }
+ method=c("Principal Component Method")
+ #输出计算结果
+ list(method=method,loadings=A,var=cbind(common=var.A,specific=x.diag-var.A),result=result)
+ }
例:
一家股份制商业银行为研究对象,选取I1个指标来研究它们的经营绩效,
> bank=read.table("d:/data/bank.txt",header=T)
> bank=bank[,-1] #剔除第一列序号
> R=cor(bank) #计算相关系数矩阵
> options(digits=3) #结果显示3位有效数字
> factor.analysis(R,5)
$method
[1] "Principal Component Method"
$loadings
Factor1 Factor2 Factor3 Factor4 Factor5
X1 0.394 0.2431 -0.2041 0.76100 0.3940
X2 -0.209 -0.1280 0.8928 0.12540 -0.2654
X3 0.804 0.1743 0.4772 0.20028 -0.0819
X4 0.877 0.1978 0.2827 -0.23663 0.1982
X5 0.594 0.2171 -0.0425 0.30028 -0.6327
X6 0.309 0.8681 0.2126 0.00168 0.2912
X7 0.911 -0.0434 -0.1026 -0.21235 -0.0258
X8 0.200 -0.8106 0.0252 0.52455 0.0766
X9 0.856 -0.4227 0.0227 -0.14650 0.0640
X10 -0.764 0.5250 -0.0233 0.24916 -0.2040
X11 0.644 0.2050 -0.5499 -0.00226 -0.3653
$var
common specific
X1 0.990 0.00991
X2 0.943 0.05685
X3 0.951 0.04908
X4 0.984 0.01646
X5 0.892 0.10807
X6 0.979 0.02104
X7 0.888 0.11206
X8 0.979 0.02116
X9 0.937 0.06299
X10 0.964 0.03564
X11 0.893 0.10739
$result
Factor1 Factor2 Factor3 Factor4 Factor5
SS loadings 4.663 2.101 1.508 1.185 0.9424
Proportion Var 0.424 0.191 0.137 0.108 0.0857
Cumulative Var 0.424 0.615 0.752 0.860 0.9454
根据loadings的输出结果,我们可以写出原始变量和5个因子之间的线性关系式
例2
某公司想要了解消费者购买牙膏时更追求什么样的}J标,于是通过商场拦访对30个人进行访谈,用7级里克特量表询问他们对以下陈述的认同程度(即1表示非常不同意,7表示非常同意)。
> yg=read.table("d:/data/yagao.txt",header=T)
> data=yg[,-1]
> factanal(data,factors=2)
Call:
factanal(x = data, factors = 2)
Uniquenesses:
V1 V2 V3 V4 V5 V6
0.104 0.440 0.141 0.384 0.238 0.294
Loadings:
Factor1 Factor2
V1 0.945
V2 0.747
V3 0.917 -0.135
V4 0.779
V5 -0.868
V6 0.838
Factor1 Factor2
SS loadings 2.505 1.896
Proportion Var 0.417 0.316
Cumulative Var 0.417 0.733
Test of the hypothesis that 2 factors are sufficient.
The chi square statistic is 4.86 on 4 degrees of freedom.
The p-value is 0.302
根据载荷系数矩阵,写出2个因子和原变量之间的线性关系式