前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R语言数据分析与挖掘(第七章):因子分析

R语言数据分析与挖掘(第七章):因子分析

作者头像
DoubleHelix
发布2019-12-17 16:58:43
5.2K0
发布2019-12-17 16:58:43
举报
文章被收录于专栏:生物信息云生物信息云

因子分析概述

因子分析(factor analysis, 简称FC)又称因素分析,基于相关关系而进行的数据分析技术,是一种建立在众多的观测数据的基础上的降维处理方法。其主要目的是探索隐藏在大量观测数据背后的某种结构,寻找一组变量变化的共同因子,将相同本质的变量归入一个因子,可减少变量的数目,还可检验变量间关系的假设。

因子分析是对数据进行“降维”的另一种方法,它是主成分分析的推广和发展,也是研究相关矩阵或协方差阵的内部依赖关系,其思想在于:将多个变量综合为少数几个因子,以再现原始变量与因子之间的关系。主成分分析和探索性因子分析均是用来探索和简化多变量复杂关系的常用方法,它们之间有联系也有区别。主成分分析(PCA)是一种数据降维方法,它能将大量相关变量转化为一组很少的不相关变量,这些无关变量称为主成分。例如,使用PCA可将30个相关的环境变量转化为少数几个无关的成分变量,并且尽可能地保留原始数据集的信息。相对而言,探索性因子分析(EFA)是一系列用来发现一组变量的潜在结构的方法。它通过寻找一组更小的、潜在的或隐藏的结构来解释已观测到的、显式的变量间的关系。

在医学、心理学等研究中,有些变量是可以直接测量的,称之为可观测变量或显变量,比如血压水平;有些变量是无法直接测量的,它们只能通过其他多个可观测变量来间接地反映,称之为不可观测变量或潜变量,比如学习能力这个指标是无法直接测量的,但它可以通过学习专注力、思维灵活度、学习成就感、反思力等多个指标来综合反映。由于学习专注力、思维灵活度等可观测指标都在不同程度上反映了学习能力的情况,所以这些指标之间可能会存在一定的相关关系。因子分析的数学模型如下:

其中X1、X2、Xn表示原始变量(指标),每个原始变量的表达式中均有F1、F2、Fm,即F1、F2、Fm与每一个原始变量X1、X2、Xn均有关但无法直接观测得到,故称F1、F2、Fm为潜变量(公因子)。e1、e2、en只与相应的一个X有关,故称之为特殊因子或个性因子。

简单来说,因子分析(Factor Analysis)就是一种从分析多个原始指标的相关关系入手,找到支配这种相关关系的有限个不可观测的潜变量(公因子),并用这些潜变量来解释原始指标之间的相关性或协方差关系的多元统计方法。

函数介绍

在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:指定祥本协方矩阵或样本相关矩阵;

N.ods:整数,用上指定观测样本的个数,

Subset:指定可选向量,表示选择的样本子集;

Na.action:一个函数,指定缺失数据的处理方法,若为NULL,则使用函数na.omit()删除缺失数据;

Start:指定特殊方差的初始值,可以为NULL或一个矩阵, 默认值是NULL;

Sores:字符串,指定因子得分的计算方法,"none"表示不计算因子得分,"regression"表水用回归方法计解因子得分,"Bartlett"表示用Bartlett法计算因子得分,默认值为none;

Rotution:字符串,指定因子载荷矩阵的旋转方法,"varimax"表示方差最大旋转法,若为"none"则表示不做旋转;

Control:模型中因子对照的列表,默认值为NULL,该函数的返回值为一个列表,其中包括:

loadings表示因子载荷阵;

uniqucnsses表示特殊方差:

correlation表示相关矩阵;

criteria表示优化结果,副对数似然函数值和函数梯度的调用次数;

factors表示因子数;

dof表示因子分析模型中的自由度;

method一般为"mle",表示极大似然估计;

rotmat 表示旋转矩阵;

scores表示因子得分矩阵;

n.obs表示样本的观测个数。

此外,也可以利用其他函数来提取因子分析的结果,函数varimax()可用于完成因子载荷矩阵的旋转变换,其返回值为一个列表,其中包括旋转后的因子载荷阵和旋转矩阵;函数promax()用于完成斜交变化,返回值与函数varimax()基本一致,不同之处在于顺转矩阵不是正交阵。

综合案例:能力和智商测试的因子分析探索

  下面利用ability.cov数据集进行实战演练,该数据集是关于能力和智商测试的数据,对112个个体进行6项测试,分别为:使用Catell的文化公平测试(general)、 图片完成测试(picture)、板块设计(blocks)、迷宫(maze)、阅读理解(reading) 和词汇量(vocab), 数据以列表的形式存储,其中包括cov、center和n.obs三个子列表。

> data("ability.cov")
> class(ability.cov)
[1] "list"
> ability.cov
$cov
        general picture  blocks   maze reading   vocab
general  24.641   5.991  33.520  6.023  20.755  29.701
picture   5.991   6.700  18.137  1.782   4.936   7.204
blocks   33.520  18.137 149.831 19.424  31.430  50.753
maze      6.023   1.782  19.424 12.711   4.757   9.075
reading  20.755   4.936  31.430  4.757  52.604  66.762
vocab    29.701   7.204  50.753  9.075  66.762 135.292

$center
[1] 0 0 0 0 0 0

$n.obs
[1] 112

下面将数据集中的协方差阵提取出来,并用函数cov2cor()将其转化为相关矩阵:

> cova<-ability.cov$cov
> cova
        general picture  blocks   maze reading   vocab
general  24.641   5.991  33.520  6.023  20.755  29.701
picture   5.991   6.700  18.137  1.782   4.936   7.204
blocks   33.520  18.137 149.831 19.424  31.430  50.753
maze      6.023   1.782  19.424 12.711   4.757   9.075
reading  20.755   4.936  31.430  4.757  52.604  66.762
vocab    29.701   7.204  50.753  9.075  66.762 135.292
> corr<-cov2cor(cova)
> corr
          general   picture    blocks      maze   reading     vocab
general 1.0000000 0.4662649 0.5516632 0.3403250 0.5764799 0.5144058
picture 0.4662649 1.0000000 0.5724364 0.1930992 0.2629229 0.2392766
blocks  0.5516632 0.5724364 1.0000000 0.4450901 0.3540252 0.3564715
maze    0.3403250 0.1930992 0.4450901 1.0000000 0.1839645 0.2188370
reading 0.5764799 0.2629229 0.3540252 0.1839645 1.0000000 0.7913779
vocab   0.5144058 0.2392766 0.3564715 0.2188370 0.7913779 1.0000000
> library(corrplot)
corrplot 0.84 loaded
> corrplot(corr)

绘制相关矩阵图,不难发现原始数据中存在多重共线性问题,为了解决这一问题,需要进行因子分析。

> (fa1<-factanal(covmat=corr,factors=2,rotation="none"))

Call:
factanal(factors = 2, covmat = corr, rotation = "none")

Uniquenesses:
general picture  blocks    maze reading   vocab 
  0.455   0.589   0.218   0.769   0.052   0.334 

Loadings:
        Factor1 Factor2
general  0.648   0.354 
picture  0.347   0.538 
blocks   0.471   0.748 
maze     0.253   0.408 
reading  0.964  -0.135 
vocab    0.815         

               Factor1 Factor2
SS loadings      2.420   1.162
Proportion Var   0.403   0.194
Cumulative Var   0.403   0.597

The degrees of freedom for the model is 4 and the fit was 0.0572 

上面代码表示,采用未旋转的主轴迭代因子法进行因子分析,人为设定因子个数为2;输出结果中:

Uniquenesses:表示特殊方差

Loadings:为因子载荷矩阵;

Factor1和Factor2分别为提取的第一主因子和第二主因子;

SS loadings:表示公因子Fi对6个原始变量总方差贡献;

Proportion Var:表示方差贡献率;

Cumulative Var :表示累计方差贡献率。

若采用正交旋转和斜交旋转提取因子,输出结果有所不同,具体如下:

> update(fa1,factors=2,rotation = "varimax")#用用正交旋转提取因子

Call:
factanal(factors = 2, covmat = corr, rotation = "varimax")

Uniquenesses:
general picture  blocks    maze reading   vocab 
  0.455   0.589   0.218   0.769   0.052   0.334 

Loadings:
        Factor1 Factor2
general 0.499   0.543  
picture 0.156   0.622  
blocks  0.206   0.860  
maze    0.109   0.468  
reading 0.956   0.182  
vocab   0.785   0.225  

               Factor1 Factor2
SS loadings      1.858   1.724
Proportion Var   0.310   0.287
Cumulative Var   0.310   0.597

The degrees of freedom for the model is 4 and the fit was 0.0572 
> update(fa1,factors=2,rotation = "promax")#用斜交旋转提取因子

Call:
factanal(factors = 2, covmat = corr, rotation = "promax")

Uniquenesses:
general picture  blocks    maze reading   vocab 
  0.455   0.589   0.218   0.769   0.052   0.334 

Loadings:
        Factor1 Factor2
general  0.364   0.470 
picture          0.671 
blocks           0.932 
maze             0.508 
reading  1.023         
vocab    0.811         

               Factor1 Factor2
SS loadings      1.853   1.807
Proportion Var   0.309   0.301
Cumulative Var   0.309   0.610

Factor Correlations:
        Factor1 Factor2
Factor1   1.000   0.557
Factor2   0.557   1.000

The degrees of freedom for the model is 4 and the fit was 0.0572

输出结果显示,不同的因子旋转法得到的分析结果不同,需要注意的是,本案例均设定因子个数为2,也可设定为3,但是不能设置为4及以上,否则R会报错,因为原始变量的个数为6,超过3个的因子设定对于6来说太大了。

> update(fa1,factors=3,rotation = "promax")

Call:
factanal(factors = 3, covmat = corr, rotation = "promax")

Uniquenesses:
general picture  blocks    maze reading   vocab 
  0.441   0.217   0.329   0.580   0.040   0.336 

Loadings:
        Factor1 Factor2 Factor3
general  0.359   0.322   0.210 
picture                  0.935 
blocks           0.612   0.317 
maze    -0.124   0.811  -0.199 
reading  1.051  -0.113         
vocab    0.810                 

               Factor1 Factor2 Factor3
SS loadings      1.912   1.153   1.063
Proportion Var   0.319   0.192   0.177
Cumulative Var   0.319   0.511   0.688

Factor Correlations:
        Factor1 Factor2 Factor3
Factor1   1.000   0.444   0.567
Factor2   0.444   1.000   0.622
Factor3   0.567   0.622   1.000

The degrees of freedom for the model is 0 and the fit was 0 
> update(fa1,factors=4,rotation = "promax")
Error in factanal(factors = 4, covmat = corr, rotation = "promax") : 
  6变量不能有4这么多的因子

上述代码表示:采用斜交变换法进行因子分析,分别设定因子个数为3和4,输出结果显示:因子个数设定为3时累计方差贡献率为0.688,而因子个数设定为4时软件报错。根据loadings的输出结果,原始变量与3个主因子之间的线性关系可表示为:

general=0.359F1+0.322F2+0.210F3

picture=0.935F3

blocks=0.612F2+0.317F3

maze=-0.124F1+0.811F2-0.199F3

reading=1.051F1-0.113F2

vocab =0.810F1

下面对提取出的因子进行命名:在第一主因子中,系数绝对值较大的变量为reading和vocab,且高度正相关,故因子F1反映的是阅读能力;在第二主因子中,系数绝对值较大的变量为blocks和maze,且高度正相关,故因子F2反映的是结构化思维能力;在第三主因子中,系数绝对值较大的变量为picture,且高度正相关,故因子F反映的是结构化分析能力艺术敏感度。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MedBioInfoCloud 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 因子分析概述
  • 函数介绍
  • 综合案例:能力和智商测试的因子分析探索
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档