在前一篇文章《单细胞测序分析(五)降维聚类&数据整合》中,我们深入探讨了单细胞RNA测序数据的降维聚类方法,以及如何整合不同实验或数据来源的数据,为后续分析提供了坚实的基础。本期,我们将进一步走进单细胞数据分析的另一个关键步骤——过滤双细胞。
什么是双细胞?在单细胞RNA测序中,我们希望对每个单独的细胞进行测序分析。然而,在样本制备过程中,可能会出现多个细胞聚集在一起的现象,形成所谓的“双细胞”或“多细胞”。双胞的存在可能会对下游分析(如聚类、差异表达等)产生误导,因此在分析过程中识别和过滤双胞是一个重要的步骤。
为什么需要过滤双细胞?双细胞会导致以下几个问题:
数据误差:两个细胞的基因表达信号混合,结果可能不代表任何一个单独细胞的真实情况。降维聚类干扰:在降维和聚类分析中,双细胞的表达信息不稳定,会影响聚类结果,进而影响后续的细胞类型注释和功能分析。增加噪音:双细胞会带来不必要的噪音,影响数据的清晰度和分析的精确度。DoubletFinder是一个用于在单细胞 RNA-seq 数据中检测双胞(doublets)的 R 包。它基于 Seurat 对象进行分析,并使用最近邻图(KNN)来识别潜在的双胞。以下是如何在 Seurat 对象 seob 上使用 DoubletFinder 的详细步骤。
实操安装DoubletFinder首先,从 GitHub 安装 DoubletFinder 包:
devtools::install_github('chris-mcginnis-ucsf/DoubletFinder')
拆分样本过滤双胞需要对每个样本单独处理
seob_list <- SplitObject(seob, split.by ="samples")s <- seob_list[[1]]
估算双胞比例在实际数据集中,双胞的比例可以通过实验设置或经验进行估算。通常的经验比例是 0.01(1%)到 0.1(10%)之间,具体取决于实验设计
# 估算双胞比例nExp_poi <- round(0.08 * nrow(s@meta.data))# 假设双胞比例为 8%# 计算同类细胞的双胞比例homotypic.prop <- modelHomotypic(s$seurat_clusters)# 使用聚类信息nExp_poi.adj <- round(nExp_poi * (1 - homotypic.prop))# 调整后的预估双胞数量
选择最佳的 pK 参数DoubletFinder 依赖于一个称为 pK 的参数,它决定了在 KNN 图中选择双胞的敏感度。为了找到最佳的 pK 参数,可以进行参数扫描:
# 扫描不同的 pK 参数sweep.res.list <- paramSweep(s, PCs = 1:20, sct = TRUE)sweep.stats <- summarizeSweep(sweep.res.list, GT = FALSE)bcmvn <- find.pK(sweep.stats)# 可视化选择最佳 pKlibrary(ggplot2)ggplot(bcmvn, aes(x = pK, y = BCmetric)) + geom_bar(stat="identity")pK <- as.numeric(as.vector(bcmvn$pK[which.max(bcmvn$BCmetric)]))
运行 DoubletFinder使用确定的 pK 和之前估算的双胞比例运行 DoubletFinder。根据可视化选择的最佳 pK,例如 pK = 0.09
# 假设选择的 pK 为 0.09options(future.globals.maxSize = 2048 * 1024^2)s <- doubletFinder(s, PCs = 1:30, pN = 0.25, pK = pK, nExp = nExp_poi.adj, reuse.pANN = FALSE, sct = TRUE)
查看并标注双胞DoubletFinder 会为每个细胞生成一个概率分数,并根据这些分数标注细胞为 Singlet 或 Doublet。这些信息存储在 seob 的元数据中。
# 查看双胞分类结果table(s$DF.classifications_xxx)
数量统计table(seob_list$ctrl$DF.classifications_xxx)table(seob_list$stim$DF.classifications_xxx)
过滤双胞DoubletFinder.class <- c(seob_list$ctrl$DF.classifications_xxx, seob_list$stim$DF.classifications_xxx)Singlets <- names(DoubletFinder.class[DoubletFinder.class =="Singlet"])seob_singlets <- subset(seob, cells = Singlets)
过滤双细胞后重新降维聚类
