用R语言做数据分析——主成份分析

小微 科技用R语言做数据分析——主成份分析已关闭评论102字数 6458阅读模式
摘要主成分分析(PCA)的目标是用一组较少的不相关变量代替大量相关变量,同时尽可能保留初始变量的信息,这些推导所得的变量称为主成分,它们是观测变量的线性组合。如第一主成分为:它是k个观...

主成份分析(PCA)的目标是用一组较少的不相关变量接替大量相关变量,同时尽量保存初始变量的信息,这些推导所得的变量称为主成份,它们是观测变量的线性组合。如第一主成份为:

它是k个观测变量的加权组合,对初始变量集的方差解释性最大。第二主成份也是初始变量的线性组合,对方差的解释性排第二,同时与第一主成份正交(不相关)。后面每一一个主成份都最大化它对方差的解释程度,同时与以前所有的主成份都正交。理论上说,咱们可以选取与变量数相同的主成份,但从实用的角度来看,咱们都但愿能用较少的主成份来近似全变量集。下面看一个简单的示例。文章源自微观生活(93wg.com)微观生活-https://93wg.com/23275.html

数据集USJudgeRatiings包括了律师对美国高等法院法官的评分。数据框包括43个观测、12个变量:文章源自微观生活(93wg.com)微观生活-https://93wg.com/23275.html

从实用的角度来看,咱们能否用较少的变量来总结这11个变量(从INTG到RTEN)评估的信息?如果可以,需要多少个?怎么对它们进行定义呢?由于咱们的目标是简化数据,所以可以使用PCA。数据维持初始得分的格式,没出缺失值。因而,下一步的决策便是判断需要多少个主成份。文章源自微观生活(93wg.com)微观生活-https://93wg.com/23275.html

判断主成份的个数文章源自微观生活(93wg.com)微观生活-https://93wg.com/23275.html

下列是一些可用来判断PCA需要多少个主成份的准则:文章源自微观生活(93wg.com)微观生活-https://93wg.com/23275.html

依据先验经验以及理论知识判断主成份数;文章源自微观生活(93wg.com)微观生活-https://93wg.com/23275.html

依据要解释变量方差的累积值的阈值来判断需要的主成份数;文章源自微观生活(93wg.com)微观生活-https://93wg.com/23275.html

通过检查变量间k*k的相关系数矩阵来判断保存的主成份数。文章源自微观生活(93wg.com)微观生活-https://93wg.com/23275.html

最多见的是基于特征值的办法。每一个主成份都与相关系数矩阵的特征值相关联,第一主成份与最大的特征值相关联,第二主成份与第二大的特征值相关联。依此类推。Kaiser-Harris准则建议保存特征值大于1的主成份,特征值小于1的成份所解释的方差比包括在单个变量中的方差更少。Cattell碎石检修则绘制了特征值与主成份数的图形。这种图形可以清晰地展现图形曲折状态,在图形变化最大处之上的主成份均可保存。最后,咱们还可以进行摹拟,根据与初始矩阵相同大小的随机数据矩阵来判断要提取的特征值。若基于真实数据的某个特征值大于一组随机数据矩阵相应的平均特征值,那么该主成份可以保存。该办法称作平行分析。文章源自微观生活(93wg.com)微观生活-https://93wg.com/23275.html

应用fa.parallel()函数,咱们可以同时对三种特征值辨别准则进行评价。对于11种评分(删了CONT变量),代码如下:文章源自微观生活(93wg.com)微观生活-https://93wg.com/23275.html

> library(psych)

> fa.parallel(USJudgeRatings[,-1],fa=\"pc\",n.iter = 100,show.legend = FALSE,main = \"Scree plot with parallel analysis\")

代码生成图形如下,展现了基于观测特征值的碎石检修(由线段以及x符号组成)、依据100个随机数据矩阵推导出来的特征值均值(虚线),和大于1的特征值准则(y=1的水平线)。

三种准则表明选择一个主成份便可保存数据集的大部份信息。下一步是使用principal()函数挑拣出相应的主成份。

提取主成份

principal()函数可以依据原始数据矩阵或者相关系数矩阵做主成份分析,格式为:

principal(r,nfactors=,rotate=,scores=)

其中:

r是相关系数矩阵或原始数据矩阵;

nfactors设定主成份数(默许为1);

rotate指定旋转的方式(默许最大方差旋转);

scores设定是不是需要计算主成份得分(默许不需要)

下面是美国法官评分的主成份分析代码:

> library(psych)

> pc<-principal(USJudgeRatings[,-1], nfactors = 1)

> pc

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

Mean item complexity = 1

Test of the hypothesis that 1 component is sufficient.

The root mean square of the residuals (RMSR) is 0.04

with the empirical chi square 6.21 with prob < 1

Fit based upon off diagonal values = 1

这里并无输入CONT变量的原始数据,并指定获取一个未旋转的主成份。因为PCA只对相关系数矩阵进行分析,在获取主成份前,原始数据将会自动转换为相关系数矩阵。

PC1栏包括了成份载荷,指观测变量与主成份的相关系数。如果提取不止一个主成份,那么还将会有PC2、PC3等栏。成份载荷可用来解释主成份的含意。此处可以看到,第一主成份(PC1)与每一个变量都高度相关,也就是说,它是一个可用来进行一般性评价的维度。

h2栏指成份公因子方差——主成份对每一个变量的方差解释度。u2栏指成份独一性——方差没法被主成份解释的比例(1-h2)。例如,体能(PHYS)80%的方差均可用第一主成份来解释,20%不能。相比而言,PHYS是用第一主成份表示性最差的变量。

SS loadings行包括了与主成份相关联的特征值,指的是与特定主成份相关联的标准化后的方差值。最后,Proportion Var行表示的是每一个主成份对整个数据集的解释程度。此处可以看到,第一主成份解释了11个变量92%的方差。

让咱们再看看第二个例子,它的结果不止一个主成份。Harman23.cor数据集包括305个女孩的8个身体丈量指标。在这个例子中,数据集由变量的相关系数组成,而不是原始数据集。

一样地,咱们但愿用较少的变量替代这些原始身体指标。如下代码可判断要提取的主成份数。此处,咱们需要填入相关系数矩阵(Harman23.cor对象中的cov部份),并设定样本大小(n.obs):

> fa.parallel(Harman23.cor$cov, n.obs = 302, fa=\"pc\",n.iter = 100, show.legend = FALSE, main = \"Scree plot with parallel analysis\")

与第一个例子相似,图形中的Kaiser-Harris准则、碎石检修以及平行分析都建议选择两个主成份。然而三个筹备其实不老是相同,咱们可能需要根据实际情况提取不同数目的主成份,选择最优解决方案。下列代码是从相关系数矩阵中提取了前两个主成份。

>library(psych)

> PC <- principal(Harman23.cor$cov,nfactors = 2,rotate = \"none\")

> PC

Principal Components Analysis

Call: principal(r = Harman23.cor$cov, nfactors = 2, rotate = \"none\")

Standardized loadings (pattern matrix) based upon correlation matrix

PC1 PC2 h2 u2 com

height 0.86 -0.37 0.88 0.123 1.4

arm.span 0.84 -0.44 0.90 0.097 1.5

forearm 0.81 -0.46 0.87 0.128 1.6

lower.leg 0.84 -0.40 0.86 0.139 1.4

weight 0.76 0.52 0.85 0.150 1.8

bitro.diameter 0.67 0.53 0.74 0.261 1.9

chest.girth 0.62 0.58 0.72 0.283 2.0

chest.width 0.67 0.42 0.62 0.375 1.7

PC1 PC2

SS loadings 4.67 1.77

Proportion Var 0.58 0.22

Cumulative Var 0.58 0.81

Proportion Explained 0.73 0.27

Cumulative Proportion 0.73 1.00

Mean item complexity = 1.7

Test of the hypothesis that 2 components are sufficient.

The root mean square of the residuals (RMSR) is 0.05

Fit based upon off diagonal values = 0.99

从代码中的PC1以及PC2栏可以看到,第一主成份解释了身体丈量指标58%的方差,而第二主成份解释了22%,二者总共解释了81%的方差。对于高度变量,二者则共解释了其88%的方差。

载荷阵解释了成份以及因子的含意。第一主成份与每一个身体丈量指标都正相关,看起来似乎是一个一般性的衡量因子;第二主成份与前四个变量(height、arm.span、forearm以及lower.leg)负相关,与后四个变量(weight、bitro.diameter、chest.girth以及chest.width)正相关,因而它看起来似乎是一个长度-容量因子。但理念上的东西都不易构建,当提取了多个成份时,对它们进行旋转可以使结果更具解释性。

主成份旋转

旋转是一系列将成份载荷阵变得更易解释的数学办法,它们尽量地对成份去噪。旋转办法有两种:使选择的成份维持不相关(正交旋转),以及让它们变得相关(斜交旋转)。旋转办法也会根据去噪定义的不同而不同。最流行的正交旋转是方差极大旋转,它试图对载荷阵的列进行去噪,使得每一个成份只是由一组有限的变量来解释(即载荷阵每一列只有少数几个很大的载荷,其他都是很小的载荷)。对身体丈量数据使用方差极大旋转,下面使用代码进行方差极大旋转的主成份分析:

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

> rc

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

Proportion Explained 0.55 0.45

Cumulative Proportion 0.55 1.00

Mean item complexity = 1.1

Test of the hypothesis that 2 components are sufficient.

The root mean square of the residuals (RMSR) is 0.05

Fit based upon off diagonal values = 0.99

列的名字都从PC变为了RC,以表汗死成份被旋转。察看RC1的载荷,咱们可以发现第一主成份主要由前四个变量来解释(长度变量)。RC2栏的载荷表示第二主成份主要由变量5到变量8来解释(容量变量)。注意两个主成份仍不相关,对变量的解释性不变,这是由于变量的群组没有产生变化。此外,两个主成份旋转后的积累方差解释性没有变化(81%),变的只是各个主成份对方差的解释度(成份1从58%变成44%,成份2从22%变成37%)。各成份的方差解释度趋同,准确来讲,此时应当称它们为成份而不是主成份(由于单个主成份方差最大化性质没有保存)。

咱们的终究目标是用一组较少的变量替代一组较多的相关变量,因而,咱们还需要获取每一个观测在成份上的得分。

获取主成份得分

在美国法官评分例子中,咱们依据原始数据中的11个评分变量提取了一个主成份。应用principal()函数,咱们很容易取得每一个调查对象在该主成份上的得分,代码如下:

> pc<-principal(USJudgeRatings[,-1],nfactors = 1,score = TRUE)

> head(pc$scores)

PC1

AARONSON,L.H. -0.1857981

ALEXANDER,J.M. 0.7469865

ARMENTANO,A.J. 0.0704772

BERDON,R.I. 1.1358765

BRACKEN,J.J. -2.1586211

BURNS,E.B. 0.7669406

当scores=TRUE时,主成份得分存储在principal()函数返回对象的scores元素中。如果有需要,咱们还可以取得律师与法官的接触频数与法官评分间的相关系数:

> cor(USJudgeRatings$CONT,pc$score)

PC1

[1,] -0.008815895

显然,律师与法官的熟稔度与律师的评分毫无关联。

当主成份分析基于相关系数矩阵时,原始数据便不可用了,也不可能取得每一个观测的主成份得分,然而咱们可以得到用来计算主成份得分的系数。

在身体丈量的数据中,咱们有各个身体丈量指标间的相关系数,然而没有305个女孩的个体丈量值。通过下列代码可以得到得分系数:

> 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.29*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

两个等式都就假设身体丈量指标都已标准化(mean=0,sd=1)。注意,体重在PC1上的系数约为0.3或0,对于PC2也是同样。从实际角度斟酌,咱们可以进一步简化办法,将第一主成份看作是前四个变量标准化得分的均值,相似地,将第二主成份看作是后四个变量标准化得分的均值,这恰是咱们通常在实际中采取的办法。

以上就是微观生活(93wg.com)关于“用R语言做数据分析——主成份分析”的详细内容,希望对大家有所帮助!

继续阅读
 
小微
  • 版权声明: 本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们(管理员邮箱:81118366@qq.com),情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!
  • 转载请务必保留本文链接:https://93wg.com/23275.html