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

时间:2024-01-06 20:42:14

主成分分析

主成分分析

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

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

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

简单例子

> 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与数据分析旧笔记(十七) 主成分分析

相关的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与数据分析旧笔记(十七) 主成分分析)、体重(R与数据分析旧笔记(十七) 主成分分析)、胸围(R与数据分析旧笔记(十七) 主成分分析)和坐高(R与数据分析旧笔记(十七) 主成分分析),数据如表。试对这30名中学生身体四项指标数据作主成分分析。

序号 R与数据分析旧笔记(十七) 主成分分析 R与数据分析旧笔记(十七) 主成分分析 R与数据分析旧笔记(十七) 主成分分析 R与数据分析旧笔记(十七) 主成分分析
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(载荷)的内容,因此得到:

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

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

由于前两个主成分的累积贡献率已达到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")

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

画出散点图:

> biplot(student.pr,choices=1:2,scale=1,pc.biplot=F)

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