美文网首页
R语言——最常用的线性降维方法——PCA(主成分分析)你了解吗?

R语言——最常用的线性降维方法——PCA(主成分分析)你了解吗?

作者: 生信大碗 | 来源:发表于2023-01-18 17:38 被阅读0次

本文首发于“生信大碗”公众号,转载请注明出处

1.Principal component analysis(PCA)

Principal component analysis (PCA),即主成分分析,是最常用的线性降维方法。

主成分分析,通俗的讲,就是将一组数据消除冗余之后得到这组数据中的主要内容,用主要内容来代替原来的数据。例如原来的数据A包含n个变量,是一个k维的数据,那么通过消除冗余,我们将其变为数据B,包含m个变量的e维的数据,这个过程其实也就是一个降维的过程,降维后的维度e<k,且数据B可以被用来代替原始数据A。这里又提到了一个新的概念:降维,降维也就是减少数据中的变量,变量减少了维度也就减少了。这个化繁为简的过程中用到了比较复杂的算法,最终我们用得到的几个变量来代表整个数据,最终的变量也就是所谓的主成分!对于PCA的推导,有两种主流方法,一种是基于最小的投影距离,也就是样本点到超平面的最小距离;另一种是基于最大投影方差。具体的算法说起来就有点复杂了,大家了解即可。

对于PCA,举个简单的例子,如果我们要对授课老师的教学水平进行打分,那么就需要从:授课逻辑性、表达流畅度、课件完整性、课堂活跃度、学生的平时成绩等n多个方面进行综合考虑,那么如果我们现在要找出其中最主要的一些变量,也就是降维得到这些变量中的“主成分”。假如我们从n个变量降维成m个主成分,它们是由原有的变量线性组合而来,而不仅仅只是拿出来几个变量,这些主成分会依据方差的大小进行排序,也就是分别为主成分1(PC1)、主成分2(PC2), 主成分3(PC3),主成分4(PC4)等。每个主成分的方差在这一组变量中的总方差中所占的比例,即主成分的贡献度。一般我们仅关注贡献度前2或者前3的主成分,再进行可视化,得到二维或三维的PCA散点图。

在PCA图中,如果数个样本的点非常分散,或者点的连线距离长,就说明样本之间的相似度比较低,也就是差异性很大。如果数个样本的点聚集在一起,或者说点的连线距离短,就说明样本之间的相似度比较高,也就是差异性小。

例如,在RNA-seq分析中,我们获得了各样本中所有基因的表达量后,如果想比较样本之间在基因表达值的整体相似性或者差异程度,但是由于基因数量非常多,不能单独每一个基因去分析。因此要用到"降维"算法,将n维的表达矩阵降维成只有少数几个主成分的形式,以代表所有基因的整体表达情况,进而描述样本间的差异。

如下图所示,我们比较肝癌正常和肿瘤组织间DEG基因的表达差异,进行主成分分析(PCA)并进行可视化。如图,横坐标是PCA1,纵坐标是PCA2,百分比即该主成分的贡献度,两组中的样本在组内相互聚集,说明组内的样本数据非常相似,而组间也有较好的区分度。

2.绘制上图的代码展示

#加载包

install.packages("FactoMineR")

library(FactoMineR)

#加载差异基因

load("差异基因.rdata")

#加载表达矩阵

load("表达矩阵.rdata")

gene=rownames(data)

data1=mRNA_exp[gene,]

data1=t(data1)

#样本分组

normal=rownames(data1)[substr(rownames(data1),14,15)==11]

tumor=rownames(data1[substr(rownames(data1),14,15)!=11]

data1=data1[c(normal,tumor),]

group=data.frame(c(normal,tumor))

group$type=c(rep("normal",59),rep("tumor",526))

colnames(group)=c("sample","type")

#PCA分析

library(ggrepel)

pca <- PCA(data1, ncp = 2, scale.unit = TRUE, graph = TRUE)

pca_sample <- data.frame(pca$ind$coord[ ,1:2])

pca_sample$sample=row.names(pca_sample)

pca_eig1 <- round(pca$eig[1,2], 2)

pca_eig2 <- round(pca$eig[2,2],2 )

pca_sample <- merge(pca_sample, group,by="sample")

#画图

library(ggplot2)

plot <- ggplot(data = pca_sample, aes(x = Dim.1, y = Dim.2)) + geom_point(aes(color = type), size = 2) + scale_color_manual(values = c('red', 'green')) + theme(panel.grid = element_blank(), panel.background = element_rect(color = 'black', fill = 'transparent'), legend.key = element_rect(fill = 'transparent')) + labs(x = paste('PCA1:', pca_eig1, '%'), y = paste('PCA2:', pca_eig2, '%'), color = '')+ stat_ellipse(aes(color = type), level = 0.95, show.legend = FALSE)

plot

本文首发于“生信大碗”公众号,转载请注明出处

—END—

相关文章

网友评论

      本文标题:R语言——最常用的线性降维方法——PCA(主成分分析)你了解吗?

      本文链接:https://www.haomeiwen.com/subject/jwubcdtx.html