聚类算法之PCA与tSNE

  前 · 言  

第二单元第六讲:聚类算法之PCA与tSNE

还是之前文章附件的图片,其中b图是选取两个主成分做的PCA图,c图是tSNE图:

几个常用函数的转置t(transpose),傻傻分不清? 计算距离介绍过dist()函数,它是按行为操作对象,而聚类是要对样本聚类,因此要先将我们平时见到的表达矩阵(行为基因,列为样本)转置;同样PCA也是对行/样本进行操作,也是需要先转置;另外归一化的scale()函数虽然是对列进行操作,但它的对象是基因,因此也需要转置

关于PCA的学习,之前写过:

  • StatQuest-PCA学习:https://www.jianshu.com/p/b83ac8f7f5a7

  • StatQuest--在R中拆解PCA:https://www.jianshu.com/p/8a74508c3737

先构建一个非常随机的测试数据

# 设置随机种子,可以重复别人使用的随机数
set.seed(123456789)
library(pheatmap)
library(Rtsne)
library(ggfortify)
library(mvtnorm)
# 设置两个正态分布的随机矩阵(500*20)
ng=500
nc=20
a1=rnorm(ng*nc);dim(a1)=c(ng,nc)
a2=rnorm(ng*nc);dim(a2)=c(ng,nc)
a3=cbind(a1,a2)
> dim(a3)
[1] 500  40
# 添加列名
colnames(a3)=c(paste0('cell_01_',1:nc),
              paste0('cell_02_',1:nc))
# 添加行名
rownames(a3)=paste('gene_',1:ng,sep = '')
# 先做个热图
pheatmap(a3)

没有体现任何的基因差异或者样本聚类(热图中的聚类是自然层次聚类),可以看到样本名都是无规律的交叉显示

如果做PCA呢?

# 先转置一下,让行为样本
>  a3=t(a3);dim(a3)
[1]  40 500

# prcomp()主成分分析
pca_dat <- prcomp(a3, scale. = TRUE)
p=autoplot(pca_dat) + theme_classic() + ggtitle('PCA plot')
print(p)

可以看到每组的20个细胞都分不开,但每组具体有哪些样本还是看不出来,因此这里为每组加上颜色来表示

# 先在原来数据的基础上添加样本分组信息(别忘了a3是一个矩阵,先转换成数据框)
df=cbind(as.data.frame(a3),group=c(rep('b1',20),rep('b2',20)))
autoplot(prcomp( df[,1:(ncol(df)-1)] ), data=df,colour = 'group')+theme_bw()

另外看下tsne

利用了一个核心函数Rtsne()

set.seed(42)
tsne_out <- Rtsne(a3,pca=FALSE,perplexity=10,theta=0.0)
# 结果得到一个列表
> str(tsne_out)
List of 14
$ N                  : int 40
$ Y                  : num [1:40, 1:2] -36.7 -28 -168 -33.4 22.4 ...
$ costs              : num [1:40] 0.00348 -0.00252 0.01496 0.01646 0.00951 ...
# 其中在Y中存储了画图坐标
> head(tsne_out$Y,3)
          [,1]     [,2]
[1,]  -36.72621 -78.03709
[2,]  -28.00151  33.30229
[3,] -167.98560 -80.26850

tsnes=tsne_out$Y
colnames(tsnes) <- c("tSNE1", "tSNE2") #为坐标添加列名
# 基础作图代码
ggplot(tsnes, aes(x = tSNE1, y = tSNE2))+ geom_point()
# 在此基础上添加颜色分组信息,首先还是将tsnes这个矩阵变成数据框,然后增加一列group信息,最后映射在geom_point中
tsnes=as.data.frame(tsnes)
group=c(rep('b1',20),rep('b2',20))
tsnes$group=group
ggplot(tsnes, aes(x = tSNE1, y = tSNE2))+ geom_point(aes(col=group))

构建一个有规律的测试数据

ng=500
nc=20
a1=rnorm(ng*nc);dim(a1)=c(ng,nc)
# 和之前的区别就在a2这里,都加了3
a2=rnorm(ng*nc)+3;dim(a2)=c(ng,nc)
a3=cbind(a1,a2)
colnames(a3)=c(paste0('cell_01_',1:nc),paste0('cell_02_',1:nc))
rownames(a3)=paste('gene_',1:ng,sep = '')
pheatmap(a3)

热图已经能看出来差异了,再看看PCA

a3=t(a3);dim(a3)
df=cbind(as.data.frame(a3),group=c(rep('b1',20),rep('b2',20)))
autoplot(prcomp( df[,1:(ncol(df)-1)] ), data=df,colour = 'group')+theme_bw()

tsne也是如此

set.seed(42)
tsne_out <- Rtsne(a3,pca=FALSE,perplexity=10,theta=0.0)
tsnes=tsne_out$Y
colnames(tsnes) <- c("tSNE1", "tSNE2")
tsnes=as.data.frame(tsnes)
group=c(rep('b1',20),rep('b2',20))
tsnes$group=group
ggplot(tsnes, aes(x = tSNE1, y = tSNE2))+ geom_point(aes(col=group))

 真实数据演练 

载入RPKM数据

rm(list = ls())
options(stringsAsFactors = F)
load(file = '../input_rpkm.Rdata')
# 表达量信息
> dat[1:2,1:3]
             SS2_15_0048_A3 SS2_15_0048_A6 SS2_15_0048_A5
0610007P14Rik              0              0       74.95064
0610009B22Rik              0              0        0.00000
# 样本属性
> head(metadata,3)
              g plate  n_g all
SS2_15_0048_A3 1  0048 3065 all
SS2_15_0048_A6 2  0048 3036 all
SS2_15_0048_A5 1  0048 3742 all
#所有数据的聚类分组信息
group_list=metadata$g
#批次信息
plate=metadata$plate
> table(plate)
plate
0048 0049
384  384

对数据进行PCA

# 操作前先备份
dat_back=dat
# 先对表达矩阵进行转置,然后转换成数据框,就可以添加批次信息了
dat=dat_back
dat=t(dat)
dat=as.data.frame(dat)
dat=cbind(dat,plate )

> dim(dat_back)
[1] 12689   768
> dim(dat)
[1]   768 12690

library("FactoMineR")
library("factoextra")
dat.pca <- PCA(dat[,-ncol(dat)], graph = FALSE)
fviz_pca_ind(dat.pca, # repel =T,
            geom.ind = "point", # 只显示点,不显示文字
            col.ind = dat$plate, # 按分组上色
            #palette = c("#00AFBB", "#E7B800"),
            addEllipses = TRUE, # 添加晕环
            legend.title = "Groups"

可以看到两个批次之间分不开,说明没有批次效应

(0)

相关推荐

  • 我从Science中,偷学到这个聚类分析技能!真舍不得分享

    大家好,我是风.欢迎来到风风的从零开始单细胞系列.前面我们已经学习了数据下载.构建分析对象和数据质控.如果你的scater出现了一些警告内容,提示函数被替代,那也不用着急.正如其他内容一样,scate ...

  • 【機器學習】聚类算法使用小结

    聚类算法使用小结 k-means 原理 优点 缺点 sklearn 调参 凝聚聚类 原理 优点 缺点 DBSCAN 原理 优点 缺点 sklearn 调参 高斯混合聚类 原理 优点 缺点 MeanSh ...

  • R语言GEO数据处理(五)

    # 4. PCA分析 ---------------------------------------------------------------- library(FactoMineR) libr ...

  • 一个完整的K-means聚类算法指南!

    来源:海豚数据科学实验室 著作权归作者所有,本文仅作学术分享,若侵权,请联系后台删文处理 假设您想根据内容和主题对数百(或数千)个文档进行分类,或者您希望出于某种原因将不同的图像组合在一起.或者更重要 ...

  • spectral-cluster聚类算法详解

    spectral clustering,称之为谱聚类算法,和近邻传播AP算法一样,也是基于图论的算法,都是将样本点两两相连,构成图这一数据结构,不同的是,谱聚类是通过切图的方式来划分不同的cluste ...

  • 到底什么是谱聚类算法?

    谱聚类算法是目前最流行的聚类算法之一,其性能及适用场景优于传统的聚类算法如k-均值算法. 本文对谱聚类算法进行了详细总结,内容主要参考以下论文,若对谱聚类算法有不理解的地方,欢迎交流. 论文名称: & ...

  • Affinity Propagation聚类算法详解

    Affinity Propagation简称AP, 称之为近邻传播算法, 是一种基于图论的聚类算法.将所有样本点看做是一个网络中的节点,图示如下 在样本点构成的网络中,每个样本点都是潜在的聚类中心,同 ...

  • OPTICS聚类算法详解

    DBSCAN算法对于邻域半径eps和最小样本数minPoints这两个参数比较敏感,不同的参数取值会产生不同的聚类效果.为了降低参数设置对聚类结果造成的不稳定性,在DBSCAN算法的基础上,提出了OP ...

  • DBSCAN聚类算法详解

    DBSCAN全称如下 Density-Based Spatial Clustering of Applications with Noise 是一种基于密度的聚类算法,所谓密度,就是说样本的紧密程度对 ...

  • 10 种 Python 聚类算法完整操作示例(附代码说明)

    聚类或聚类分析是无监督学习问题.它通常被用作数据分析技术,用于发现数据中的有趣模式,例如基于其行为的客户群.有许多聚类算法可供选择,对于所有情况,没有单一的最佳聚类算法.相反,最好探索一系列聚类算法以 ...

  • BIRCH聚类算法详解

    BIRCH算法全称如下 Balanced Iterative Reducing and Clustering Using Hierarchies 属于树状结构的层次聚类算法的一种,其树状结构的构建是自 ...