例如,在儿童生长发育的评价中,收集到的数据包括每一儿童的身高、体重、胸围、头围、坐高、肺活量等十多个指标。怎样利用这类多指标的数据对每一儿童的生长发育水平作出正确的评价?如果仅用其中任一指标来作评价,其结论显然是片面的,而且不能充分利用已有的数据信息。如果分别利用每一指标进行评价,然后再综合各指标评价的结论,这样做一是可能会出现各指标评价的结论不一致,甚至相互冲突,从而给最后的综合评价带来困难;二是工作量明显增大,不利于进一步的统计分析。
事实上,在实际工作中,所涉及的众多指标之间经常是有相互联系和影响的,从这一点出发,希望通过对原始指标相互关系的研究,找出少数几个综合指标,这些综合指标是原始指标的线性组合,它既保留了原始指标的主要信息,且又互不相关。这样一种从众多原始指标之间相互关系入手,寻找少数综合指标以概括原始指标信息的多元统计方法称为主成分分析。
关于特征值、特征向量、方差贡献率、累积方差贡献率等概念,大家可以阅读网络教程或者课本等。
今天只是小试牛刀,后面会为大家带来更加详细的主成分分析可视化。
使用R语言自带的iris
鸢尾花数据进行演示。
str(iris)
## 'data.frame': 150 obs. of 5 variables:
## $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
## $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
## $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
## $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
## $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
psych::headTail(iris)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## ... ... ... ... ...
## 147 6.3 2.5 5 1.9 virginica
## 148 6.5 3 5.2 2 virginica
## 149 6.2 3.4 5.4 2.3 virginica
## 150 5.9 3 5.1 1.8 virginica
首先给大家介绍下R自带的主成分分析函数。
在进行PCA之前可以先进行相关性分析,看看相关系数:
cor(iris[,-5])
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Sepal.Length 1.0000000 -0.1175698 0.8717538 0.8179411
## Sepal.Width -0.1175698 1.0000000 -0.4284401 -0.3661259
## Petal.Length 0.8717538 -0.4284401 1.0000000 0.9628654
## Petal.Width 0.8179411 -0.3661259 0.9628654 1.0000000
使用psych
实现,关于这两个检验的解读大家自行学习~
psych::KMO(iris[,-5])
## Kaiser-Meyer-Olkin factor adequacy
## Call: psych::KMO(r = iris[, -5])
## Overall MSA = 0.54
## MSA for each item =
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 0.58 0.27 0.53 0.63
这个检验主要反应样本量够不够,Overall MSA
是总体的检验统计量,然后是每个变量的检验统计量。
MSA
越大越好。一般要求大于0.5才可以(没有绝对标准,根据实际情况来)。
psych::cortest.bartlett(iris[,-5])
## R was not square, finding R from data
## $chisq
## [1] 706.9592
##
## $p.value
## [1] 1.92268e-149
##
## $df
## [1] 6
p.value小于0.05,表明数据可以进行主成分分析。
主成分的实现可以通过分步计算,主要就是标准化-求相关矩阵-计算特征值和特征向量。
R中自带了prcomp()
进行主成分分析,这就是工具的魅力,一次完成多步需求。
使用prcomp()
进行主成分分析:
# R自带函数
pca.res <- prcomp(iris[,-5], scale. = T, # 标准化
center = T # 中心化
)
# 查看标准差、特征向量(回归系数)
pca.res
## Standard deviations (1, .., p=4):
## [1] 1.7083611 0.9560494 0.3830886 0.1439265
##
## Rotation (n x k) = (4 x 4):
## PC1 PC2 PC3 PC4
## Sepal.Length 0.5210659 -0.37741762 0.7195664 0.2612863
## Sepal.Width -0.2693474 -0.92329566 -0.2443818 -0.1235096
## Petal.Length 0.5804131 -0.02449161 -0.1421264 -0.8014492
## Petal.Width 0.5648565 -0.06694199 -0.6342727 0.5235971
主成分就是根据这几个系数算出来的:
PC1 = 0.5210659Sepal.Length - 0.2693474Sepal.Width + 0.5804131Petal.Length + 0.5648565Petal.Width
后面的主成分计算方法以此类推。
# 样本得分score
head(pca.res$x)
## PC1 PC2 PC3 PC4
## [1,] -2.257141 -0.4784238 0.12727962 0.024087508
## [2,] -2.074013 0.6718827 0.23382552 0.102662845
## [3,] -2.356335 0.3407664 -0.04405390 0.028282305
## [4,] -2.291707 0.5953999 -0.09098530 -0.065735340
## [5,] -2.381863 -0.6446757 -0.01568565 -0.035802870
## [6,] -2.068701 -1.4842053 -0.02687825 0.006586116
# 查看标准差、方差贡献率、累积方差贡献率
summary(pca.res)
## Importance of components:
## PC1 PC2 PC3 PC4
## Standard deviation 1.7084 0.9560 0.38309 0.14393
## Proportion of Variance 0.7296 0.2285 0.03669 0.00518
## Cumulative Proportion 0.7296 0.9581 0.99482 1.00000
Standard deviation
:标准差Proportion of Variance
:方差贡献率Cumulative Proportion
:累积方差贡献率关于主成分分析中的各种术语解读,我推荐知乎上的一篇文章:主成分分析各类术语的白话解读
默认的主成分分析结果可视化:
biplot(pca.res)
碎石图可以帮助确认最佳的主成分个数,可以使用默认的screeplot()
实现:
# 默认是条形图,我们改为折线图,其实就是方差贡献度的可视化
screeplot(pca.res, type = "lines")
可以看到用2-3个主成分就挺好了。
一般来说,主成分的保留个数可以按照以下原则确定:
但是保留几个主成分并没有绝对的标准,大家根据自己的实际情况来!
今天只是小试牛刀,后面会为大家带来更加详细的主成分分析可视化。可参考推文: