‍‍‍‍‍‍‍‍‍

作者:姚某某

博客:https://zhuanlan.zhihu.com/mydata

往期回顾:

R语言之数据分析高级方法「时间序列」

R语言之高级数据分析「聚类分析」

本节主要总结「数据分析」的「主成分分析」和「因子分析」的思想。

通过学习《 R 语言实战 》关于这两种方法的解释,我们很容易理解这两种方法其存在的意义。——降维。

我们将要面对的数据实在是太大,变量实在太多,因此计算机所承受的压力也会越来越大。信息过度复杂是多变量数据最大的挑战之一,特别是在还要考虑变量间交互关系的时候,变量增加时交互关系的量是按阶乘关系在往上涨的,所以降维在很多时候能够起到减少大量工作量的作用,是数据分析很重要的一个思想。

以上是「主成分分析」与「因子分析」联系,有共同的目的。但是,两者的区别也很大,在实现目标时,两者采用了两种不同的思路,下面我逐一讨论。

1. 主成分分析与因子分析的不同

  • 主成分分析 ( PCA ) 是指,用一组较少的不相关变量代替大量相关变量,同时尽可能保留初始变量的信息。值得注意的是,主成分是初始变量的线性组合。

  • 因子分析 ( EFA ) 是指, 通过发掘隐藏在数据下的一组较少的、更为基本的无法观测的变量,来解释一组可观测变量的相关性。

  • 区别:从定义上其实就很好理解,但是更简单的理解方式:把「因子分析」看作是求得「元素」,这些元素是组成初始变量的因子;而把「主成分分析」看作是求得一种「组合」,这些组合是初始变量配给不同系数组成的「组合」,且每个组合之间不相关。

2.主成分分析

2.1. 主成分

主成分是初始变量的线性组合,用于替代初始变量并尽可能保留初始信息。如第一主成分:

它是 k 个观测变量的加权组合,对初始变量集的方差解释性最大。

至于主成分是如何推导得到的,请看这篇PCA (主成分分析)详解 (写给初学者)(https://my.oschina.net/gujianhan/blog/225241#OSC_h2_1),建议跟着思索一遍,对其底层算法有一点理解,在学习的时候更开心。

2.2. 判断主成分的个数

之前讲到,主成分分析的目的是为了降维,因此对于主成分的个数,我们必须有所取舍。

一般的方法是,基于特征值来判断主成分的个数:

每一个主成分都有其对应的特征值,这个特征值来自于与主成分相关联的相关系数矩阵。且按顺序分配,第一主成分与最大的特征值相关联,第二主成分与第二大的特征值相关联,判断主成分的方法通常有以下 3 种:
1. Kaiser-Harris 准则,建议保留特征值大于 1 的主成分,特征值小于 1 的成分所解释的方差比包含子单个变量中的方差更少
2. Cattell 碎石检验,通过绘制特征值与主成分数的图形,通过图形的弯曲情况,保留图形变化最大处之上的主成分
3. 通过模拟,依据与初始矩阵相同打下的随机数据矩阵来判断要提取的特征值,若基于真实数据的某个特征值大于随机数据矩阵相应的平均特征值,则保留该主成分

使用 psych 包中的 fa.parallel ( ) 函数即可得到图形,通过以上三种方法综合判断主成分的个数。

2.3. 提取主成分

通过 R 中已经包装好的算法来计算即可:

principal(r, nfactors=, rotate=, scores)
# r 是相关系数矩阵或原始数据矩阵
# nfactors 设定主成分数
# rotate 指定旋转的方法
# scores 设定是否计算主成分得分(默认为不需要)

  • 通过以上函数,我们可以得如下的结果

Principal Components Analysis
Call: principal(r = USJudgeRatings[, -1], nfactors = 1)
Standardized loadings (pattern matrix) based upon correlation matrix
     PC1   h2     u2 com
INTG 0.92 0.84 0.1565   1
DMNR 0.91 0.83 0.1663   1
DILG 0.97 0.94 0.0613   1
CFMG 0.96 0.93 0.0720   1
DECI 0.96 0.92 0.0763   1
PREP 0.98 0.97 0.0299   1
FAMI 0.98 0.95 0.0469   1
ORAL 1.00 0.99 0.0091   1
WRIT 0.99 0.98 0.0196   1
PHYS 0.89 0.80 0.2013   1
RTEN 0.99 0.97 0.0275   1

PC1
SS loadings    10.13
Proportion Var  0.92

  • PC 1 栏包含了成分载荷,即观测变量与主成分的相关系数,如果主成分不止一个,还会有 PC 2 、PC 3。h 2 栏指成分公因子方差,集主成分对每个变量的方差解释度。u 2 栏指成分的唯一性,即方差无法被主成分解释的比例( 1 - h 2 ) 。

  • 这里的旋转指的是,一系列将成分载荷阵变得更容隐解释的数学方法。旋转的方法有两种:使选择的成分保持不相关的正交旋转,和让主成分变得相关的斜交旋转。最流行的正交旋转是方差极大旋转。使用方差极大旋转,可以得到如下结果:

Principal Components Analysis
Call: principal(r = Harman23.cor$cov, nfactors = 2, rotate = "varimax")
Standardized loadings (pattern matrix) based upon correlation matrix
               RC1  RC2   h2    u2 com
height         0.90 0.25 0.88 0.123 1.2
arm.span       0.93 0.19 0.90 0.097 1.1
forearm        0.92 0.16 0.87 0.128 1.1
lower.leg      0.90 0.22 0.86 0.139 1.1
weight         0.26 0.88 0.85 0.150 1.2
bitro.diameter 0.19 0.84 0.74 0.261 1.1
chest.girth    0.11 0.84 0.72 0.283 1.0
chest.width    0.26 0.75 0.62 0.375 1.2

RC1  RC2
SS loadings           3.52 2.92
Proportion Var        0.44 0.37
Cumulative Var        0.44 0.81

    • 列名由 PC 变成 RC,表示成分被旋转。通过观察可以看出,主成分对初始变量的关联程度得到了分化,第一主成分主要由前四个变量来解释(长度变量),第二主成分主要由后四个变量来解释(容量变量)

  • 主成分得分,是用于评价不同观测之间优劣的分数。

    • 1. 如果用于主成分分析的初始数据矩阵我们知道(可能不知道,直接用相关系数矩阵来进行主成分分析),则可以直接添加 score参数来计算每个观测的主成分得分了。

    • 2. 如果初始数据矩阵未知,我们就没办法直接通过参数调节来得到原来观测的主成分得分了,要通过计算得分系数之后,得到主成分得分的求得公式。例:

> rc <- principal(Harman23.cor$cov , nfactors = 2,rotate = "varimax")

> round(unclass(rc$weights),2)
                RC1   RC2
height          0.28 -0.05
arm.span        0.30 -0.08
forearm         0.30 -0.09
lower.leg       0.28 -0.06
weight         -0.06  0.33
bitro.diameter -0.08  0.32
chest.girth    -0.10  0.34
chest.width    -0.04  0.27

主成分得分:

PC1 = 0.28*height + 0.30*arm.span + 0.30*forearm + 0.28* lower.leg - 0.06*weight   - 0.08*bitro.diameter - 0.10* chest.girth - 0.04*chest.width

PC2 = - 0.05*height - 0.08*arm.span - 0.09*forearm - 0.06* lower.leg + 0.33*weight   + 0.32*bitro.diameter + 0.34* chest.girth + 0.27*chest.width

2.4. 评价

主成分得分就可看着是各观测的主成分取值,它是初始变量的线性组合。通过得分的排名来得到观测的优劣排名。

3. 因子分析

3.1. 因子

所谓因子,指的是隐藏在数据下的一组较少、更为基本的无法观测的变量,它被认为可以解释观测变量间共有的方差。直观意义上讲,可以将观测变量视为是因子的线性组合(注意:主成分是观测变量的线性组合,容易弄混淆)。如第 i个观测变量可表示为:

这里的Fj(j=1,2,....p) 就是我们说的因子,Ui 则指的是第i个观测变量独有的部分(无法被因子解释)。

3.2. 判断需提取的公共因子数

这里的方法和判断主成分个数相同,同样采用 fa.parallel ( ) 函数来得到图形,使用三种方法来综合判断。唯一一点不同在于,采用 Kaiser-Harris 准则来判断时,主成分分析保留特征值大于 1 的成分,而因子分析保留特征值大于 0 的因子。

3.3. 提取公共因子

这里采用 R 语言中包装好的算法来计算即可:

fa(r, nfactors=, n.obs=, rotate=, scores=, fm=)
# 相比主成分分析的 principle 函数,这里多出了两个参数
# n.obs 指的是观测数,在使用相关系数矩阵时需要填写
# fm 则用于设定因子化方法

  • 有提取因子的方法有很多,我其实也并太了解如何选择,先知道有哪些方法,有具体项目的时候在作深究:

    • 最大似然法( ml )

    • 主轴迭代法( pa )

    • 加权最小二乘法( wls )

    • 广义加权最小二乘法( gls )

    • 最小残差法( minres )

3.4. 因子旋转

因子旋转的选择有三种:1. 不旋转 2. 正交旋转 3. 斜交旋转

不旋转时得到各因子与各初始变量之间的相关程度,旋转之后能够使因子变得更好解释。

  • 正交旋转

令参数 rotate="varimax" 即可,这时的因子之间强制为不相关

在提取因子后,可得到因子结构矩阵,即变量与因子的相关系数,且较不旋转的结果而言更好解释,可将不同变量重点归于某一因子。

  • 斜交旋转

令参数 rotate="promax" 即可,这时的因子之间有可能是相关的。

在提取因子后,可得到两个矩阵:因子模式矩阵(标准化的回归系数矩阵)、因子关联矩阵(因子相关系数矩阵)。同时还需要考虑因子结构矩阵(变量与因子的相关系数矩阵),但是要通过自编函数 fsm ( ) 求得,自编函数的具体代码参考《 R 语言实战 》一书。

通过考虑以上三个矩阵,我们除了可以向不同变量重点归于某一因子外,还可以得到不同因子之间的相关系数,如果现实不同因子间的关联性很低,可能需要重新使用正交旋转来简化问题。但通常斜交旋转方法更加符合真实数据,虽然这种方法更为复杂。

  • 通过图形显示

可通过 factor.plot ( ) 函数来得到两因子图形,可从图中观测出不同初始变量在哪个因子上载荷更大。

还可通过 fa.diagram ( ) 函数得到每个因子下的最大载荷,已经因子间的相关系数。

3.5. 因子得分

与主成分分析相比,因子分析并那么关注因子得分,相要得到因子得分,在提取时采用 score=TRUE 函数即可。还可以得到得分系数(标准化的回归权重),在提取因子时得分系数将会体现在返回对象 weights 元素中。

而且,这里与主成分分析不同,因子得分无法精确计算,只能估计得到。原因在于,我们的因子数总比初始变量要少,通常因子得分的估计方法有:回归估计法,Bartlett估计法,Thomson估计法。

3.6. 评价

以各因子的方差贡献率为权,由各因子的线性组合得到综合评价指标函数。

F = (w1F1+w2F2+…+wmFm)/(w1+w2+…+wm )

此处wi为旋转前或旋转后因子的方差贡献率。

利用综合得分可以得到得分名次。


4. 总结

主成分分析和因子分析的步骤可归纳为:

1. 数据预处理
2. 选择模型,是主成分分析还是因子分析
3. 判断要选择的主成分/因子数目
4. 选择主成分/因子
5. 旋转主成分/因子
6. 解释结果
7. 计算主成分/因子得分

 往期精彩内容整理合集 

2017年R语言发展报告(国内)

R语言中文社区历史文章整理(作者篇)

R语言中文社区历史文章整理(类型篇)

公众号后台回复关键字即可学习

回复 R                  R语言快速入门及数据挖掘 
回复 Kaggle案例  Kaggle十大案例精讲(连载中)
回复 文本挖掘      手把手教你做文本挖掘
回复 可视化          R语言可视化在商务场景中的应用 
回复 大数据         大数据系列免费视频教程 
回复 量化投资      张丹教你如何用R语言量化投资 
回复 用户画像      京东大数据,揭秘用户画像
回复 数据挖掘     常用数据挖掘算法原理解释与应用
回复 机器学习     人工智能系列之机器学习与实践
回复 爬虫            R语言爬虫实战案例分享

R 语言之数据分析高级方法「主成分分析」和「因子分析」相关推荐

  1. R语言学习笔记——高级篇:第十四章-主成分分析和因子分析

    R语言 R语言学习笔记--高级篇:第十四章-主成分分析和因子分析 文章目录 R语言 前言 一.R中的主成分和因子分析 二.主成分分析 2.1.判断主成分的个数 2.2.提取主成分 2.3.主成分旋转 ...

  2. R语言与数据分析练习:使用ARIMA模型预测网站访问量

    R语言与数据分析练习:使用ARIMA模型预测网站访问量 使用ARIMA模型预测网站访问量 一.实验背景: 随着流量的增大,某网站的数据信息量也在以一定的幅度增长 基于该网站2016年9月~2017年2 ...

  3. R语言对数线性模型loglm函数_用R语言进行数据分析:常规和广义线性模型

    用R语言进行数据分析:常规和广义线性模型 线性模型 对于常规的多重模型(multiple model)拟合,最基本的函数是lm(). 下面是调用它的方式的一种改进版: >fitted.model ...

  4. R语言 面板数据分析 plm包实现(一) ——LSDV和固定效应模型

    系列文章 R做面板数据分析:R语言 面板数据分析 plm包实现(一) --LSDV和固定效应模型 如果想看随机效应模型怎么做,参见这篇文章 R语言 面板数据分析 plm包实现(二)--随机效应模型 如 ...

  5. R语言创建新变量方法

    R语言创建新变量方法 在数据分析中,可能需要对数据进行求和.求均值等处理,并且将处理后的数据重新保存到原来的数据框中,这里提供三种可供解决的方法: 数据框$变量名 <- 表达式.若原数据框中含有 ...

  6. 2014全球软件技术峰会WOT:R语言金融数据分析

    跨界知识聚会系列文章,"知识是用来分享和传承的",各种会议.论坛.沙龙都是分享知识的绝佳场所.我也有幸作为演讲嘉宾参加了一些国内的大型会议,向大家展示我所做的一些成果.从听众到演讲 ...

  7. 【R语言与数据分析实战】R软件编程

    目录 1.流程控制 (1) if语句 (2) 循环语句 2.运算 (1) 数值运算 (2) 向量运算 (3) NA处理 3.定义函数 (1) 可变长函数 (2) 嵌套函数 4.作用域 5.对象的不变性 ...

  8. 【R语言与数据分析实战】绘图

    目录 1.散点图 2.图像选项 2.1 坐标轴名称 2.2 图形标题 2.3 点的类型 2.4 点的大小 2.5 颜色 2.6 坐标轴的取值范围 2.7 图像类型 2.8 线型 2.9 图形排列 2. ...

  9. 看书标记【R语言 商务数据分析实战4】

    看书标记--关于R语言 chapter 4 4.2 任务实现 [R语言 商务数据分析实战4] chapter 4 财政收入预测分析 从海量数据中发现隐藏的运行模式,并提供具有决策意义的信息.变量过多会 ...

  10. 看书标记【R语言 商务数据分析实战6】

    看书标记--关于R语言 chapter 6 6.2 任务实 [R语言 商务数据分析实战6] chapter 6 P2P信用贷款风险控制(用户逾期还款概率模型) 关于数据库的应用+数据清洗+实时数据识别 ...

最新文章

  1. linux安装oem环境,【OEM】 oem12c_install_for_linux
  2. 为什么数组是从0开始的
  3. 黄聪:wordpress如何开启文章格式post format
  4. Xcode模拟器和真机生成的日志查看(ios必知必会)
  5. SYBASE数据导入技巧
  6. 泰森怎么会输给道格拉斯_巅峰泰森为何遭遇六连败?日本女孩不是主因,而是这位黑人超模...
  7. SpringBoot之实例程序
  8. 中国荧光探针市场应用前景与投资动态预测报告(2022-2027年)
  9. 正交试验设计例题及答案_正交试验设计与数理统计作业.doc
  10. Overfeat模型(滑动窗口)
  11. Mac如何用鼠标快速锁屏
  12. ecshop模板如何修改详细图解
  13. c++中rand(),srand()使用
  14. Criteo启动上海数据中心,加大对中国市场的投入
  15. 安装部署(七) HBase集群安装部署与测试
  16. pc端,移动端,客户端的区别
  17. 菜鸟的三遍读书法进阶
  18. Python Socket网络编程(一)初识Socket和Socket初步使用
  19. mxGraph Tutorial
  20. 2022年 新华三杯决赛题目

热门文章

  1. 目前最快的 Java 框架居然是它?真的最快,秒射~
  2. 为什么Go比Java快这么多?看完这个例子就懂!
  3. 成为一名优秀架构师有标准吗?这12点或许能带给你一些启发
  4. 以 Google 为例,什么才是好的管理制度?
  5. 华为将在数据库市场挑战Oracle:5月15日发布云数据库产品
  6. 开发者的盛宴Google I/O 2016
  7. 【NOIP-2017PJ】图书管理员
  8. 第12章第1讲位运算符与表达式
  9. 每一句都值得品味的话
  10. 利用vertical-align:middle实现在整个页面居中