ixxmu / mp_duty

抓取网络文章到github issues保存
https://archives.duty-machine.now.sh/
108 stars 30 forks source link

Nature子刊:什么是主成分分析(PCA)? #2096

Closed ixxmu closed 2 years ago

ixxmu commented 2 years ago

https://mp.weixin.qq.com/s/COYxW9QBAHpAupYRxPON1w

github-actions[bot] commented 2 years ago

Nature子刊:什么是主成分分析(PCA)? by R语言和统计

欢迎关注"R语言和统计"~~


小编最近阅读文献的时候,发现了一篇由Markus发表在Nature Biotechnology上的论文[1],名为《What is princinpal component analysis?》,对于想要了解什么是主成分分析(PCA)的朋友们也许会有帮助。 





那什么是PCA? 


PCA是一种数学算法,可用于降低数据的维度,但同时尽可能保留原有数据的统计信息[2]


比如,随着基因测序以及质谱等方法的出现,一个样本可以检测出成百上千个变量,这种数据即是典型的小n(样本)多p(变量)的高维度数据。


而面对这样的数据,不管是统计分析还是作图都非常有挑战性。


假如样本分为疾病组和正常组,用t检验一个一个的进行分组比较,会大大增高假阳性的风险(也称为Type I 错误[一张图搞定第一类错误与第二类错误])。同时,面对这么多的变量,作图也无从下手。


所以,如果可以将变量从几百或几千降到几个,同时又不丢失数据信息的话,对之后的数据探索以及作图都大有帮助,而PCA是数据降维方法中最经典以及被广泛使用的一种









读懂六张图,助你基本入门PCA



论文作者[1]以乳腺癌方面的研究为例子。


首先,看第一张图: 


来源:[1] Figure 1.a

论文作者[1]举了一个最简单的例子,假设只检测了两个基因的表达水平: GATA3和XBP1。通过上述的两个变量,就可以画出散点图,图中的点即是不同的样本。

上述的样本又被进一步的分为雌激素受体阳性(红色)和阴性(黑色)。从上可知,雌激素受体阳性的样本主要分布在图片的右上角,即GATA3和XBP1的表达水平都比较高的地方。

这样的散点图,应该非常容易理解。

好了,第一步顺利完成



再看第二张图: 


来源:[1] Figure 1.b


PCA可以给数据找到新的变量,这些变量又称为主成分(PCs)。

那它是如何找到第一个主成分(PC1)的呢?

通过将点到PC1的垂直距离最小化,投射到PC1上的点的分布将会越广越散开,即达到方差最大化。从上图来说,这条直线接近对角线。

寻找PC2的方式非常类似,但要加上一点,PC2不能和PC1有关,也就是要求它们之间的关系是正交的(orthogonal )。

如果说上述的解释不好理解,那可以这么想:PC1和PC2其实并没有改变数据的本身,而是经过数学转换后,通过不同的角度看数据。

有点“横看成岭侧成峰”的意思,但庐山还是庐山。

将高维度的数据降维后,就可以选择PC1和PC2作为新的变量,用于后续数据的探索,作图和分析。



第三张图: 


来源:[1] Figure 1.c


如上图,可以将所有样本(点)投射到PC1上,后续将PC1作为新的变量,数据就从原来的二维降成了一维。




第四张图: 


来源:[1] Figure 1.d


前面的例子仅含有两个基因。

之后为了进一步说明,作者纳入105个样本,检测了8534个基因的表达水平,再进行了PCA分析。

上图中,横坐标为PCs (1到100+),纵坐标为能够解释的方差百分比,或者说是能够解释的数据信息的百分比

我们发现,前面两个PCs(PC1和PC2)加起来大概可以解释数据方差的22%,前面63个PCs加起来可以解释数据方差的90%,而104个PCs几乎就可以解释100%的方差了[1]

因此,PCA可以大大降低数据的维度(8634 → 104),同时并没有丢失数据的信息




第五张图: 


来源:[1] Figure 1.e


第五张图为“Biplot”,可以描述在PCs的体系中不同样本之间的关系(比如,哪些样本比较类似,哪些样本差异较大等信息)以及不同变量(这里指的是基因)对PCs的贡献度(也称为权重)

如上所示,横坐标为PC1,纵坐标为PC2,散点为各个样本,其中标注出两个具体的基因(XBP1和CCNB2)。

因为每个基因的表达水平都对PCs的计算做出了一定的贡献,所以上图可以用它们的权重(weights)进行作图。

后面实战部分, 会在R中重复作出biplot图。



第六张图: 


来源:[1] Figure 1.f


上图中的棕色指的是ERBB2-,蓝色指的是ERBB2+,绿色指的是ERBB2状态不明


而在上图中,ERBB2状态不同的样本存在大量重叠,并不能将数据很好的进行分类。


作者使用上图的目的主要在于提醒大家:PCA本质上是一种数据降维以及将数据方差(或数据的信息)最大化的方法,并不是一种用于识别潜在亚组或用于分类的方法,至少不是那么有效。





PCA实战


好了,进入大家最喜欢的实战部分了


主要是重复上述的第4张和第5张图片。 


首先,安装PCA作图的包: 


install.packages("factoextra")
library(factoextra)


查看数据“iris”: 


summary(iris)



因为我们需要使用“iris”中的前四个连续变量进行PCA分析,所以将Species从数据中剔除后保存到新的数据集iris_reduced中: 


iris_reduced <- iris[, -5]


PCA分析: 


iris_pca <- prcomp(iris_reduced, scale. = TRUE)
summary(iris_pca)



从上述结果可知,一共有4个主成分(PCs),PC1可以解释73%的信息,PC2可以解释22.9%的信息,所以PC1加上PC2可以解释95.9%的信息。如果使用PC1和PC2两个新变量的话,那就可以将数据中的变量从4个降到2个,还保留了数据的大部分信息。

也可以制作scree plot(上面的图4),更加直观的显示PCs能够解释的信息百分比: 


fviz_eig(iris_pca, 
         barfill = "aquamarine3",   # 修改颜色
         barcolor = "aquamarine3"# 修改颜色 




制作biplot (即上述的图5): 


fviz_pca_biplot(iris_pca, 
                label =
"var",      # 显示4个变量名
                ggtheme = theme_minimal())
+
  labs(x = "PC1 (73%)", y = "PC2 (22.9%)"



还可以将“iris”中本身的类别标签(Species)在上图中显示出来: 


fviz_pca_biplot(iris_pca, 
                label = "var",
                habillage = iris$Species,  # 添加组别的标签
                addEllipses = TRUE,        # 用椭圆形圈出相同组别的样本
                ellipse.level = 0.95,
                palette = "aaas",          # 修改颜色
                ggtheme = theme_minimal()) +
  labs(x = "PC1 (73%)", y = "PC2 (22.9%)") +
  theme(legend.position = c(0.9, 0.9))




好啦,今天的内容就到这里。

如果有帮助,记得分享给需要的人









参考文献

[1]. What is principal component analysis? Ringnér M, Nat Biotechnol. 2008 Mar;26(3):303-4. 
[2]. Jolliffe, I.T. Principal Component Analysis (Springer, New York, 2002).


▌声明:本文由R语言和统计首发,如需转载请联系我们
▌编辑:June
▌我们的宗旨是:让R语言和统计变得简单!

< 往期合集 >