主成分分析

主成分分析

  • Pearson于1901年提出的,再由Hotelling(1933)加以发展的一种多变量统计方法
  • 通过析取主成分显出最大的个别差异,也用来削减回归分析和聚类分析中变量的数目
  • 可以使用样本协方差矩阵或相关系数矩阵作为出发点进行分析
  • 成分的保留:Kaiser主张(1960)将特征值小于1的成分放弃,只保留特征值大于1的成分
  • 如果能用不超过3-5个成分就能解释变异的80%,就算是成功
  • 通过对原是变量进行线性组合,得到优化的指标
  • 把原先多个指标的计算降维为少量几个经过优化指标的计算(占去绝大部分份额)
  • 基本思想:设法将原先众多具有一定相关性的指标,重新组合为一组新的互相独立的综合指标,并代替原先的指标

主成分分析的直观几何意义

简单例子

> x1<-c(171,175,159,155,152,158,154,164,168,166,159,164)
> x2<-c(57,64,41,38,35,44,41,51,57,49,47,46)
> plot(x1,x2,xlim=c(145,180),ylim=c(25,75))
> lines(c(150,178),c(33,66));text(180,68,"y1")
> lines(c(161,168),c(60,38));text(161,63,"y2")

相关的R函数

princomp()

princomp(formula,data=NULL,subset,na.actioon,….)

其中formula是没有响应变量的公式(类似回归分析、方差分析,但无响应变量)

data是数据框(类似于回归分析、方差分析)

summary()

summary(object,loadings=FALSE,cutoff=0.1,…)

其中object是由princomp()得到的对象。loadings是逻辑变量,当loadings=TRUE表示显示loadings的内容,loadings=FALSE则不显示。

loadings()

loadings()函数是显示主成分分析或因子分析中loadings(载荷)的内容。在主成分分析中,该内容实际上是主成分对应的各列。在因子分析中,其内容就是载荷因子矩阵。

loadings(x)

其中x是由函数princomp()或factanal()得到的对象。

predict()

predict()函数是预测主成分的值。

predict(object,newdata,…)

其中object是由princomp()得到的对象。newdata是由预测值构成的数据框,当newdata缺省时,预测已有数据的主成分值。

screeplot()

screeplot()函数是画出主成分的碎石图。

screeplot(x,npcs=min(10,length(x$sdev)),type=c(“barplot”,”lines”),main=deparse(substitute(x)),…)

其中x是由princomp()得到的对象。npcs是画出主成分的个数。type是描述画出来的碎石图的类型。”barplot”是直方图类型,”lines”是直线图类型 。

biplot()

biplot()是画出数据关于主成分的散点图和原坐标在主成分下的方向。

biplot(x,choices=1:2,scale=1,pc.biplot=FALSE,…)

其中x是由princomp()得到的对象,choices是选择的主成分,缺省值是第1、第2主成分。pc.biplot是逻辑变量(缺省值是FALSE),当pc.biplot=TRUE,用Gabriel(1971)提出的画图方法。

实例

(中学生身体四项指标的主成分分析)

在某中学随机抽取某年级30名学生,测量其身高(R与数据分析旧笔记(十七) 主成分分析-LMLPHP)、体重(R与数据分析旧笔记(十七) 主成分分析-LMLPHP)、胸围(R与数据分析旧笔记(十七) 主成分分析-LMLPHP)和坐高(R与数据分析旧笔记(十七) 主成分分析-LMLPHP),数据如表。试对这30名中学生身体四项指标数据作主成分分析。

1148417278
2139347176
3160497786
4149366779
5159458086
6142316676
7153437683
8150437779
9151427780
10139316874
11140296474
12161477884
13158497883
14140336777
15137316673
16152357379
17149478279
18145357077
19160477487
20156447885
21151427382
22147387378
23157396880
24147306575
25157488088
26151367480
27144366876
28141306776
29139326873
30148387078

* 解:*

> student<-data.frame(
+ X1=c(148, 139, 160, 149, 159, 142, 153, 150, 151, 139,
+ 140, 161, 158, 140, 137, 152, 149, 145, 160, 156,
+ 151, 147, 157, 147, 157, 151, 144, 141, 139, 148),
+ X2=c(41, 34, 49, 36, 45, 31, 43, 43, 42, 31,
+ 29, 47, 49, 33, 31, 35, 47, 35, 47, 44,
+ 42, 38, 39, 30, 48, 36, 36, 30, 32, 38),
+ X3=c(72, 71, 77, 67, 80, 66, 76, 77, 77, 68,
+ 64, 78, 78, 67, 66, 73, 82, 70, 74, 78,
+ 73, 73, 68, 65, 80, 74, 68, 67, 68, 70),
+ X4=c(78, 76, 86, 79, 86, 76, 83, 79, 80, 74,
+ 74, 84, 83, 77, 73, 79, 79, 77, 87, 85,
+ 82,78,80,75,88,80,76,76,73,78)
+ )
> student.pr<-princomp(student,cor=T)
> summary(student.pr,loadings=T)
Importance of components:
Comp.1 Comp.2 Comp.3 Comp.4
Standard deviation 1.8817805 0.55980636 0.28179594 0.25711844
Proportion of Variance 0.8852745 0.07834579 0.01985224 0.01652747
Cumulative Proportion 0.8852745 0.96362029 0.98347253 1.00000000

Loadings:
Comp.1 Comp.2 Comp.3 Comp.4
X1 -0.497 0.543 -0.450 0.506
X2 -0.515 -0.210 -0.462 -0.691
X3 -0.481 -0.725 0.175 0.461
X4 -0.507 0.368 0.744 -0.232

student.pr<-princomp(student,cor=T)可以改成student.pr<-princomp(~X1+X2+X3+X4,data=student,cor=T)

summary()函数列出主成分分析的重要信息,Standard deviation行表示的是主成分的标准差,即主成分的方差的开方。Proportion of Variance行表示的是方差的贡献率,Cumulative Proportion行表示的是方方差的累积贡献率。

由于在summary函数的参数中选取了loadings=T,因此列出了loadings(载荷)的内容,因此得到:

R与数据分析旧笔记(十七) 主成分分析-LMLPHP

R与数据分析旧笔记(十七) 主成分分析-LMLPHP

由于前两个主成分的累积贡献率已达到96%,另外两个主成分可以舍去,达到降维的目的。

第1主成分对应系数的符号都相同,其值在0.5左右,它反映了中学生身材的魁梧(?)程度:身体高大的学生,他的4个部分的尺寸都比较大,因此,第1主成分的值就较小(因为系数均为负值);而身材矮小的学生,他的4部分的尺寸都比较小,因此,第1主成分绝对值就较大。我们称第1主成分为大小因子。第2主成分是高度与围度的差,第2主成分值大的学生表明该学生“细高”,而第2主成分值越小的学生表明该学生“矮胖”,因此,称第2主成分为体形因子。

> predict(student.pr)
Comp.1 Comp.2 Comp.3 Comp.4
[1,] 0.06990950 -0.23813701 -0.35509248 -0.266120139
[2,] 1.59526340 -0.71847399 0.32813232 -0.118056646
[3,] -2.84793151 0.38956679 -0.09731731 -0.279482487
[4,] 0.75996988 0.80604335 -0.04945722 -0.162949298
[5,] -2.73966777 0.01718087 0.36012615 0.358653044
[6,] 2.10583168 0.32284393 0.18600422 -0.036456084
[7,] -1.42105591 -0.06053165 0.21093321 -0.044223092
[8,] -0.82583977 -0.78102576 -0.27557798 0.057288572
[9,] -0.93464402 -0.58469242 -0.08814136 0.181037746
[10,] 2.36463820 -0.36532199 0.08840476 0.045520127
[11,] 2.83741916 0.34875841 0.03310423 -0.031146930
[12,] -2.60851224 0.21278728 -0.33398037 0.210157574
[13,] -2.44253342 -0.16769496 -0.46918095 -0.162987830
[14,] 1.86630669 0.05021384 0.37720280 -0.358821916
[15,] 2.81347421 -0.31790107 -0.03291329 -0.222035112
[16,] 0.06392983 0.20718448 0.04334340 0.703533624
[17,] -1.55561022 -1.70439674 -0.33126406 0.007551879
[18,] 1.07392251 -0.06763418 0.02283648 0.048606680
[19,] -2.52174212 0.97274301 0.12164633 -0.390667991
[20,] -2.14072377 0.02217881 0.37410972 0.129548960
[21,] -0.79624422 0.16307887 0.12781270 -0.294140762
[22,] 0.28708321 -0.35744666 -0.03962116 0.080991989
[23,] -0.25151075 1.25555188 -0.55617325 0.109068939
[24,] 2.05706032 0.78894494 -0.26552109 0.388088643
[25,] -3.08596855 -0.05775318 0.62110421 -0.218939612
[26,] -0.16367555 0.04317932 0.24481850 0.560248997
[27,] 1.37265053 0.02220972 -0.23378320 -0.257399715
[28,] 2.16097778 0.13733233 0.35589739 0.093123683
[29,] 2.40434827 -0.48613137 -0.16154441 -0.007914021
[30,] 0.50287468 0.14734317 -0.20590831 -0.122078819

从第1主成分来看,较小的几个值是25号样本、3号样本和5号样本,因此说明这几个学生身材魁梧;而11号样本、15号样本和29号样本的值较大,说明这几个学生身材瘦小。

从第2主成分来看,较大的几个值是23号样本、19号样本和4号样本,因此说明这几个学生属于“细高”型;而17号样本、8号样本和2号样本的值较小,说明这几个学生身材属于“矮胖”型。

画出主成分的碎石图:

> screeplot(student.pr,type="lines")

画出散点图:

> biplot(student.pr,choices=1:2,scale=1,pc.biplot=F)
05-11 19:55