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复制