主成分分析
主成分分析
- 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名学生,测量其身高()、体重()、胸围()和坐高(),数据如表。试对这30名中学生身体四项指标数据作主成分分析。
1 | 148 | 41 | 72 | 78 |
2 | 139 | 34 | 71 | 76 |
3 | 160 | 49 | 77 | 86 |
4 | 149 | 36 | 67 | 79 |
5 | 159 | 45 | 80 | 86 |
6 | 142 | 31 | 66 | 76 |
7 | 153 | 43 | 76 | 83 |
8 | 150 | 43 | 77 | 79 |
9 | 151 | 42 | 77 | 80 |
10 | 139 | 31 | 68 | 74 |
11 | 140 | 29 | 64 | 74 |
12 | 161 | 47 | 78 | 84 |
13 | 158 | 49 | 78 | 83 |
14 | 140 | 33 | 67 | 77 |
15 | 137 | 31 | 66 | 73 |
16 | 152 | 35 | 73 | 79 |
17 | 149 | 47 | 82 | 79 |
18 | 145 | 35 | 70 | 77 |
19 | 160 | 47 | 74 | 87 |
20 | 156 | 44 | 78 | 85 |
21 | 151 | 42 | 73 | 82 |
22 | 147 | 38 | 73 | 78 |
23 | 157 | 39 | 68 | 80 |
24 | 147 | 30 | 65 | 75 |
25 | 157 | 48 | 80 | 88 |
26 | 151 | 36 | 74 | 80 |
27 | 144 | 36 | 68 | 76 |
28 | 141 | 30 | 67 | 76 |
29 | 139 | 32 | 68 | 73 |
30 | 148 | 38 | 70 | 78 |
* 解:*
> 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(载荷)的内容,因此得到:
由于前两个主成分的累积贡献率已达到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)