细胞类型重复性验证----MetaNeighbor(1)
单细胞转录组的出现加快了细胞类型多样性的研究,以及一些稀有细胞类型的发现。但是,细胞类型的注释则因为不同数据集以及不同分析方法的原因差异较大。如何来验证细胞类型注释的真伪,以及这些注释又能否在不同的数据集复现,一直是个亟待解决的问题。
Gillis等开发了MetaNeighbor方法来测试不同数据集之间细胞类型的可重复性。
整体来说,理论也比较清晰。在一个单细胞数据集里面,我们根据一系列基因的表达,就可以推算不同cell之间的一个相似度,那么我们就可以构建这个数据集相关的cell network,在这个网络中,用相似度来表示边的强度。然后如果有多个数据集,我们可以把这多个数据集看成一个整体,然后构建这个整体数据集的cell networks,只不过在这个网络中,可以根据数据集的来源分为多个子集罢了。然后,如果我们其中一个子集的细胞类型标签抹掉,通过这个网络中的信息,比如邻近节点的信息来推测抹掉那部分的标签。和真实的标签做对比,我们就能衡量这个网络推断出来的和真实的可靠度。这样的过程,我们可以不断重复,例如不断重复原先的基因集,或者不断重复测试数据集。这样下来,对于每个cell,我们就可以得到一个经典的生信中的ROC曲线,最终利用这个曲线的AUROC(就是面积)来代表不同cell type之间的重复性。
淡然,MetaNeighbor的整个方法和框架是灵活的,还可以适应多种应用。
比如场景一:在无监督模式下,验证不同数据集,细胞类型的可重复性(下图b)。
场景二:通过预训练MetaNeighbor模型,来注释一个新的数据集。
场景三:来测试那个基因集,能更好的重复细胞类型的注释。
下面,我们来测试和应用一下MetaNeighbor。
我们除了参考官方文档,也参考了这个课题组发的protocol。
======MetaNeighbor安装======
官方文档:https://github.com/gillislab/MetaNeighbor/blob/master/Documentation.md#installation
if (!require('devtools')) {
install.packages('devtools', quiet=TRUE)
}
devtools::install_git('https://github.com/gillislab/MetaNeighbor')
========测试数据1============
这个数据演示了如何计算和可视化4个人类胰腺数据集细胞类型的可重复性,SingleCellExperiment格式化数据集,以及如何计算和理解MetaNeighbor得出的AUROC。
library(scRNAseq) #4个数据来自scRNAseq包中
my_data <- list(
baron=BaronPancreasData(),
lawlor=LawlorPancreasData(),
seger=SegerstolpePancreasData(),
muraro=MuraroPancreasData()
)
#如果是seurat的数据,我们需要转化一下,转化成为SingleCellExperiment的数据。
lapply(my_data, function(x){
head(rownames(x),3)}
)
从数据里面的基因名字来看,还不统一,所以我们都统计成为symbol的格式。muraro只需要取前面一部分就行,lawlor需要进行转化,从EMSEMBL格式转化成为symbol。
rownames(my_data$muraro) <- rowData(my_data$muraro)$symbol
my_data$muraro <- my_data$muraro[!duplicated(rownames(my_data$muraro)),]
library(org.Hs.eg.db)
symbols <- mapIds(org.Hs.eg.db,keys=rownames(my_data$lawlor),keytype="ENSEMBL",column="SYMBOL")
keep <- !is.na(symbols) & !duplicated(symbols)
rownames(my_data$lawlor) <- symbols[keep]
下面查看一下我们关心的colname信息。
lapply(my_data, function(x){
colnames(colData(x))}
)
从colname信息来看,我们主要关心的cell type也不统一,所以我们也统一一下。
my_data$baron$"cell type" <- my_data$baron$label
my_data$muraro$"cell type" <- my_data$muraro$label
lapply(my_data, function(x){
names(assays(x))}
)
统一完格式之后,我们下面就开始合并这几个对象。
fused_data =mergeSCE(my_data)
dim(fused_data)
head(colData(fused_data))
table(fused_data$"cell type",fused_data$study_id) #各个cell在不同数据集中的分布
注:从cell的名称来看,其实有一个明显的问题,命名不统一。在自己的数据分析中,一定要注意这一点。
我们把合并的数据给保存了,方便以后直接读取和直接调用。
saveRDS(fused_data,"merged_pancreas.rds")
library(MetaNeighbor)
library(SingleCellExperiment)
pancreas_data <- readRDS("merged_pancreas.rds")
从前面的方法描述中,我们也可以看出,MetaNeighbor将利用用户定义的一组基因Spearman系数来描述细胞-细胞的相似性,从而构建细胞-细胞相似性网络。如果没有用户训练好的基因集的话,我们通过选择在数据集中高度可变的基因来获得最佳结果,这可以使用variableGenes函数来完成。为胰腺数据集选择高度可变的基因。(In our experience, we obtained best performance for gene sets ranging from 200 to 1,000 variable genes,作者paper中的经验是选择的范围在200-1000个效果最佳)
global_hvgs <- variableGenes(dat=pancreas_data,exp_labels=pancreas_data$study_id)
下面,就可以通过调用MetaNeighborUS来获得不同细胞类型之间的相似性。
aurocs <- MetaNeighborUS(var_genes = global_hvgs,
dat = pancreas_data,
study_id = pancreas_data$study_id,
cell_type = pancreas_data$"cell type",
fast_version=TRUE)
可以看出其实返回的结果是一个矩阵,一个cell type---by---cell type的矩阵,其中的数值就是作者paper中定义的AUROC。并且不同数据集的cell type单独来看。
plotHeatmap(aurocs,cex=0.5)
用热图画出来会更清晰。每个正方形的颜色表示一对细胞类型的接近程度,从蓝色(低相似度)到红色(高相似度)。为了将相似的单元格类型分组在一起,plotHeatmap在AUROC矩阵上应用分层聚类。在热图上,我们看到两个大的红色块,表示数据中的层次结构,内分泌细胞类型聚集在一起(例如,α、β、γ),另一侧是非内分泌细胞(例如,无长突、导管、内皮细胞)。注意,每个红色块都由较小的红色块组成,这表明可以以更高的分辨率匹配单元类型。非对角模式(例如,“lawlor|Gamma/PP”、“lawlor | Delta”)的存在表明存在双峰或污染,但热图主要由明显存在的红色块构成,这是细胞类型预测结果可复制性的一个有力指标。
如果想要识别一些可靠的可重复的细胞类型,就通过设置AUROC的阈值(根据paper的经验,0.9cutoff),超过0.9,则认为这个注释是可靠的。
top_hits = topHits(aurocs,
dat = pancreas_data,
study_id = pancreas_data$study_id,
cell_type = pancreas_data$"cell type",
threshold = 0.9)
我们也可以只画彼此之间最好注释的细胞类型,这就相当于除了最接近的2个细胞类型,其它都没有进行测试,所在图上是灰色的。
best_hits<- MetaNeighborUS(var_genes = global_hvgs,
dat = pancreas_data,
study_id = pancreas_data$study_id,
cell_type = pancreas_data$"cell type",
fast_version=TRUE,
one_vs_best=TRUE,
symmetric_output=FALSE)
plotHeatmap(best_hits,cex=0.5)
这种展示方法,有助于我们快速的识别一个细胞类型最接近的细胞类型。也有助于我们发现那些注释的不好,不可重复,尤其是偏离对角线上那些。
另外,paper中,作者建议,当采用1对1最优的模式的时候,可以把相似的细胞类型看成一个metacluster,类似cluster簇的概念。
mclusters <- extractMetaClusters(best_hits,threshold=0.7)
mcsummary <- scoreMetaClusters(mclusters,best_hits)
plotUpset(mclusters)
从汇总情况来看,10几种种细胞类型在至少2个数据集共有。
plotMetaClusters(mclusters,best_hits)
也可以画成热图来展示每个meta cluster。
cluster_graph <- makeClusterGraph(best_hits,low_threshold=0.3)
plotClusterGraph(cluster_graph,pancreas_data$study_id,pancreas_data$"cell type",size_factor=3)
也可以用网络图的形式,来更清晰看出那些细胞类型聚的更近,为什么成为了metacluster。
也可以查看子集的情况:
coi <- "baron|epsilon"
coi <- extendClusterSet(cluster_graph,initial_set=coi,max_neighbor_distance=2)
subgraph <- subsetClusterGraph(cluster_graph,coi)
plotClusterGraph(subgraph,pancreas_data$study_id,pancreas_data$"cell type",size_factor=5)