scRNA-seq 双细胞(Doublet)筛选
1. 背景介绍
1.1 什么是双细胞?
在单细胞转录组测序(scRNA-seq)过程中,实验技术的不完美可能会导致两个或多个细胞共享相同的条形码(barcode),形成 双细胞(doublets)。这些细胞会影响数据分析的准确性,导致错误的细胞类型鉴定、伪影(artifacts)和假阳性信号。
1.2 为什么需要去除双细胞?
双细胞的存在会对单细胞分析造成以下影响:
- 扰乱细胞聚类(clustering),影响细胞类型定义
- 影响差异表达基因分析(DEG)
- 误导轨迹推断(trajectory inference)
- 影响肿瘤微环境和免疫细胞的正确解析
1.3 现有的双细胞鉴定工具
目前有多种方法用于双细胞鉴定,例如:
- DoubletFinder(推荐,准确性较高)
- Scrublet(适用于 Python)
- DoubletDetection
- cxds/bcds/hybrid
- DoubletDecon
根据Cell Systems 2021年的研究,DoubletFinder 在准确性上表现最佳,因此本教程采用 DoubletFinder 进行双细胞去除。
2. DoubletFinder 过滤双细胞的流程
DoubletFinder 主要基于 PCA 降维 + KNN 近邻搜索,通过模拟伪双细胞(artificial doublets)来预测真实数据中的双细胞。
2.1 数据预处理
在去除双细胞之前,首先需要对 scRNA-seq 数据进行标准的预处理。
# 读取数据
sc_data = readRDS(file = './tmp/scRNA_qc_list.RDS')
# 合并多个样本
sc_merged <- sc_data[[1]]
for (i in 2:length(sc_data)) {
sc_merged <- merge(sc_merged, y = sc_data[[i]], project = "merged")
}
sc_merged$samples = sc_merged$orig.ident
rm(sc_data)
# 数据标准化和降维
combo <- sc_merged
combo <- SCTransform(combo, vars.to.regress = c("nCount_RNA", "nFeature_RNA", "percent.hb",
"percent.platelet", "percent.heatshock"), verbose = TRUE)
combo <- RunPCA(combo, npcs = 100)
# 选择 PCA 维度
ElbowPlot(combo)
2.2 选择最佳 PCA 维度
使用 ElbowPlot
选择合适的 PCA 维度,通常选择拐点处的维度,例如 前 50-60 个主成分。
combo <- FindNeighbors(combo, reduction = "pca", dims = 1:60)
combo <- FindClusters(combo, resolution = 0.7)
combo <- RunUMAP(combo, reduction = "pca", dims = 1:60, seed.use = 123)
2.3 运行 DoubletFinder
DoubletFinder 需要 计算最佳 pK
值,这是用于识别双细胞的关键参数。
(1) 计算最佳 pK
combo.list <- SplitObject(combo, split.by = "samples")
pkchoose.list <- list()
for (i in 1:length(combo.list)) {
seu_temp <- combo.list[[i]]
sweep.res.list <- paramSweep_v3(seu_temp, PCs = seu_temp@commands$RunUMAP.SCT.pca$dims, sct = TRUE)
sweep.stats <- summarizeSweep(sweep.res.list, GT = FALSE)
# 计算最佳 pK
sweep.stats.pk <- find.pK(sweep.stats)
pK=as.numeric(as.character(sweep.stats.pk$pK))
BCmetric=sweep.stats.pk$BCmetric
pK_choose = pK[which(BCmetric %in% max(BCmetric))]
}
(2) 计算双细胞比例
nExp_poi <- 0.0059 * nrow(seu_temp@meta.data)
(3) 运行 DoubletFinder
seu_temp <- doubletFinder_v3(seu_temp, PCs = seu_temp@commands$RunUMAP.SCT.pca$dims,
sct = TRUE, pN = 0.25, pK = as.numeric(pK_choose), nExp = nExp_poi,
reuse.pANN = FALSE)
combo.list[[i]] <- seu_temp
2.4 整合双细胞结果
doublet.cell.list <- list()
doublet.df <- list()
for (i in names(combo.list)) {
seu_temp <- combo.list[[i]]
doublet.sub <- seu_temp@meta.data[, grepl("DF", colnames(seu_temp@meta.data)), drop = F]
doublet.df[[i]] <- doublet.sub
doublet.cell.list[[i]] <- rownames(doublet.sub)
sc_merged <- AddMetaData(sc_merged, doublet.sub, paste0("Doublet.", i))
}
# 汇总双细胞识别结果
sc_merged$Doublet.Call <- apply(sc_merged@meta.data[, c(9:16)], 1, function(x) x[!is.na(x)][1])
3. 结果可视化
DimPlot(sc_merged, group.by = "Doublet.Call", reduction = "umap") + ggtitle("Doublet Identification")
table(sc_merged$Doublet.Call)
4. 结果保存
saveRDS(sc_merged, file = './tmp/scRNA_qc_withDoublet.RDS')
5. 结论
- 双细胞(doublets)是 scRNA-seq 分析中的常见问题,需要在分析流程中加以去除。
- DoubletFinder 是目前准确性较高的方法,适用于 Seurat 处理的单细胞数据。
- 正确选择
pK
和nExp
计算参数,可以显著提高双细胞检测的准确性。 - 去除双细胞后,数据的聚类、差异分析、轨迹推断的可信度将会更高。