参考https://zhuanlan.zhihu.com/p/469335625
1. DoubletFinder概述
单细胞测序期望每个barcode标签下只有一个真实的细胞,但是实际数据中会有两个或多个细胞共用一个barcode的情况,我们称之为doublets. DoubletFinder 是一个和Seurat包无缝衔接的,鉴定单细胞数据中Doublets的R包。
DoublebletFinder基础原理
单细胞降维后的空间中,表达特征相似的细胞彼此之间距离更近。DoubletFinder生成人工模拟的doublets,并将他们掺入原始单细胞表达数据,原则上人工模拟的doublets会与真实的doublets距离较近。 因此计算每个细胞K最近邻细胞中人工模拟doublets的比例(pANN),就可以根据pANN值对每个barcode的doublets概率进行排序。另外依据泊松分布的统计原理可以计算每个样本中doublets的数量,结合之前的细胞pANN值排序,就可以过滤doublets了。
可以参照下表计算自己的数据中双细胞的比例。
DoubletFinder可以分为4个步骤:
(1)从现有的scRNA-seq数据中生成artificial doublets;
(2)预处理合并的real-artifical data;
(3)执行PCA并使用PC距离矩阵查找每个单元的artificial k 最近邻居(pANN)的比例;
(4)根据预期的doublets数量排序和计算阈值pANN值;
缺点:DoubletFinder对同种类型细胞间的doublets不敏感 - 即从转录相似的细胞状态衍生的doublets。
DoubletFinder主要参数:
2. 代码示例
Step1: 数据预处理: 单细胞数据质控、标准化、降维聚类等
首先这个R包的输入是经过预处理(包括归一化、降维,但不一定要聚类)的 Seurat 对象。这里keloid是我的Seurat对象名称你可以换成你的样本对象名称。
library(DoubletFinder)library(tidyverse)library(Seurat)library(patchwork)rm(list=ls())## Pre-process Seurat object -------------------------------------------------------------------------------------------------keloid<-CreateSeuratObject(keloid.data)keloid<-NormalizeData(keloid)keloid<-ScaleData(keloid,vars.to.regress="nUMI")keloid<-FindVariableGenes(keloid,x.low.cutoff=0.0125,y.cutoff=0.25,do.plot=FALSE)keloid<-RunPCA(keloid,pc.genes=seu_kidney@var.genes,pcs.print=0)keloid<-RunTSNE(keloid,dims.use=1:10,verbose=TRUE)
Step2: 确定参数,寻找最优pK值
## (2)pK Identification ----------------------------------------------------------#这是一个测试最佳参数的过程,运行速度慢sweep.res.list_keloid<-paramSweep_v3(keloid,PCs=1:30,sct=FALSE)#head(sweep.res.list_keloid)sweep.stats_keloid<-summarizeSweep(sweep.res.list_keloid,GT=FALSE)bcmvn_keloid<-find.pK(sweep.stats_keloid)#可以看到最佳参数的点## 所以最佳的参数是:mpK<-as.numeric(as.vector(bcmvn_keloid$pK[which.max(bcmvn_keloid$BCmetric)]))
这是一个测试最佳参数的过程,运行速度慢。mpK是最佳参数点。
Step3: 双细胞比例计算
## (3) Homotypic Doublet Proportion Estimate -------------------------------------annotations<-keloid@meta.data$seurat_clustershomotypic.prop<-modelHomotypic(annotations)DoubletRate=ncol(keloid)*8*1e-6#按每增加1000个细胞,双细胞比率增加千分之8来计算DoubletRate=0.042104#估计同源双细胞比例,根据modelHomotypic()中的参数人为混合双细胞。这里是从seurat_clusters中来混双细胞 nExp_poi<-round(DoubletRate*length(keloid$seurat_clusters))#最好提供celltype,而不是seurat_clusters。# 计算双细胞比例nExp_poi.adj<-round(nExp_poi*(1-homotypic.prop))
Step4: 鉴定双细胞
## (4)最后,使用确定好的参数鉴定Doublets. Run DoubletFinder with varying classification stringencies ----------------------------------------------------------------keloid<-doubletFinder_v3(keloid,PCs=1:10,pN=0.25,pK=mpK,nExp=nExp_poi,reuse.pANN=FALSE,sct=F)keloid<-doubletFinder_v3(keloid,PCs=1:10,pN=0.25,pK=mpK,nExp=nExp_poi.adj,reuse.pANN=FALSE,sct=F)# 使用nExp = nExp_poi和nExp = nExp_poi.adj,分别进行doublets鉴定,以便后续确定哪些细胞是Doublet-High Confidience
Step5: 结果可视化
这里确定了Doublet-Low Confidience, Doublet-High Confidience,Singlet三种细胞类型。
## Plot results ---------------------------------------------------------------------------keloid@meta.data[,"DF_hi.lo"]<-keloid@meta.data$DF.classifications_0.25_0.01_222keloid@meta.data$DF_hi.lo[which(keloid@meta.data$DF_hi.lo=="Doublet"&keloid@meta.data$DF.classifications_0.25_0.01_198=="Singlet")]<-"Doublet-Low Confidience"keloid@meta.data$DF_hi.lo[which(keloid@meta.data$DF_hi.lo=="Doublet")]<-"Doublet-High Confidience"table(keloid@meta.data$DF_hi.lo)# Doublet-High Confidience Doublet-Low Confidience Singlet # 198 24 5041 ## 结果展示,分类结果在pbmc@meta.data中png("./output/2_cell_annotation/2_doubletFinder.png",2500,1800,res=300)DimPlot(keloid,reduction="umap",group.by="DF_hi.lo",cols=c("black","red","gold"))dev.off()saveRDS(keloid,file="./output/sc_keloid_1_seurat_unanno.rds")