本系列开启 R 中单细胞RNA-seq数据分析教程[1],持续更新,欢迎关注,转发!
前面提到的两种方法虽然简单明了,但这种简单性也限制了它们的表现。在这些方法中,签名列表中的每个基因都被同等对待,但实际上,这些基因在区分细胞类型时的作用可能大不相同。如果忽视了这些基因重要性的差异,那么分析结果很难达到最佳效果。因此,你可能需要尝试一些更高级的方法,而不仅仅是简单地计算相关性。
接下来,我们介绍目前最常用的标签转移方法——Seurat 中实现的基于锚点的标签转移。这种方法的原理并不复杂。它首先将参考数据集中使用的降维方法(例如 PCA)应用于查询数据。然后,它会在两个数据集之间寻找所谓的“锚点”。所谓锚点,是指参考数据集中的一个细胞和查询数据集中的一个细胞,它们在经过降维变换后的数据中互为最近邻。这些锚点还会经过进一步筛选,要求它们在原始基因表达空间中具有一定相似性。之后,会构建一个权重矩阵,用来定义每个查询细胞与每个锚点之间的关系。最后,通过这个权重矩阵,将锚点细胞的标签或值传递给查询细胞。
这些步骤已经在 Seurat 中实现了两个函数:FindTransferAnchors
和 TransferData
。以下是将这些方法应用于我们的参考和查询脑类器官数据集的示例脚本。
anchors <- FindTransferAnchors(reference = seurat_ref, query = seurat_DS1, dims = 1:30, npcs = 30)
predictions <- TransferData(anchorset = anchors, refdata = seurat_ref$celltype, dims = 1:30)
seurat_DS1$celltype_transfer <- predictions$predicted.id
plot1 <- UMAPPlot(seurat_DS1, label=T)
plot2 <- UMAPPlot(seurat_DS1, group.by="celltype_transfer", label=T)
plot1 | plot2
TransferData
函数的输出不仅包括预测标签,还包含更多相关信息。对于需要转移的分类信息(比如细胞类型标签),输出数据框中还记录了每个细胞对不同参考细胞类型的预测分数。这些分数可以理解为每个查询细胞属于不同细胞类型的估计概率。因此,我们可以通过汇总这些分数到查询细胞簇中,来进行进一步的比较分析。
pred_scores_sum2cl <- t(sapply(levels(seurat_DS1@active.ident), function(cl)
colMeans(predictions[which(seurat_DS1@active.ident == cl),-c(1,ncol(predictions))]) ))
heatmap.2(pred_scores_sum2cl, scale="none", trace="none", key=F, keysize=0.5, margins=c(15,17),
labRow = colnames(avg_expr_ds1), labCol = unique(seurat_ref$celltype), cexRow=0.8, cexCol=0.8,
col=colorRampPalette(rev(c("#b2182b","#d6604d","#f4a582","#fddbc7","#f7f7f7","#d1e5f0","#92c5de","#4393c3","#2166ac")))(30))