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

2019-04-10 10:55:55 浏览数 (1)

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

0 人点赞