在上一篇文章里我们聊到为什么要进行doublet检测以及DoubletFinder的基本原理。在这篇文章里,我们就来聊聊另一个doublet检测工具——scrublet的基本算法、它和DoubletFinder的使用比较,以及使用这两个工具的代码范例。

上图是上篇文章聊到的DoubletFinder的算法示例图,scrublet的核心思想和DoubletFinder非常相近。它们的主要的区别在于第五步,即对于每一个细胞邻近细胞中人工模拟的doublet细胞分布的描述上。

scrublet的作者认为当我们的数据中出现doublet时,有两种情况。一种称之为Embedded errors,在这种情况下,doublet和真正存在的某种细胞类型有相似的基因表达,doublet会和这些细胞被聚类到一起,同时在分群结果中占某一个群的一小部分,不会对最终的分析结果产生严重的影响。另一种情况称之为Neotypic errors,在这种情况下,doublet会构成一个和现有的细胞类型基因表达非常不同的群,而这个新的群会严重影响到后续的分析结果。但不管在什么情况下,作者都假定doublet只占样本数据中很小的一部分。

基于上面的假设,scrublet对于第五步获得的每个细胞邻近细胞中人为模拟的doublet的分布用一个作者自定义的公式去进行拟合,如下图所示。其中Pobs为观察到的分布,PD代表是doublet的可能性,PS代表是单细胞的可能性,PD和PS的和为1。在算出蓝框内的值之后,我们可以将其与1比较。如果远大于1,则说明doublet的影响要远大于单细胞,即属于Neotypic errors。如果远小于1,则说明单细胞的起主要影响,属于Embedded errors。如果约等于1,则不属于doublet的两种情况,为真正存在的生物学发现。

DoubletFinder和scrublet实操比较

1. scrublet是基于python的。尽管它有非常详尽的tutorial,对于没有python基础的同学,还是有些许挑战。而DoubletFinder则是基于R的,使用R对于很多做scRNA-seq生信分析的同学来说,还是比较自然。

2. 因为scrublt是基于python的,相较于DoubletFinder,它的速度也要快很多。一个10x的样本只需要几分钟到十几分钟就能跑完,而DoubletFinder则需要几十分钟到一个多小时。

3. 最重要的一点是scrublet比DoubletFinder要准确得多。DoubletFinder最终的结果受设定的pANN阈值的影响,结果稳定性不高。小L曾经有一次得到超过90%数据都是doublet的结果。而scrublet的结果则要稳定得多,也符合我们的预期。

DoubletFinder代码范例

总结完毕,下面就是具体的实操了。正如小L在上篇推送中分析的,DoubletFinder的使用应该是针对每一个sample进行单独分析,并在用seurat对数据进行任何处理之前进行。同时因为DoubletFinder非常占用内存,我们需要及时保留我们需要的信息,即每个细胞的预测结果以及pANN值,并把不需要的部分删除。其中大写字母的部分需要大家根据自己的需求进行替换。

library(tidyverse)
library(Seurat)
library(DoubletFinder)sampleV = c('SAMPLE1', 'SAMPLE2', 'SAMPLE3')
dataL = list()
## create seurat object for all samples
for (sample in sampleV) {file_name = str_c('DATA_FOLDER', sample, '_cellranger/outs/filtered_feature_bc_matrix')seuratObj_counts <- Read10X(data.dir = file_name)seuratObj = CreateSeuratObject(counts = seuratObj_counts, project = str_c(sample, "1"))dataL[[sample]] <- seuratObj
}for (idx in 1:length(dataL) {## preprocessingdata <- NormalizeData(dataL[[idx]])data <- ScaleData(data, verbose = FALSE)data <- FindVariableFeatures(data, verbose = FALSE)data <- RunPCA(data, npcs = 30, verbose = FALSE)data <- RunUMAP(data, reduction = "pca", dims = 1:30)data <- FindNeighbors(data, reduction = "pca", dims = 1:30)data <- FindClusters(data, resolution = 0.5)sweep.res.list <- paramSweep_v3(data, PCs = 1:30, sct = FALSE)sweep.stats <- summarizeSweep(sweep.res.list, GT = FALSE)bcmvn <- find.pK(sweep.stats)## Homotypic Doublet Proportion Estimate -------------------------------------------------------------------------------------annotations <- data@meta.data$ClusteringResultshomotypic.prop <- modelHomotypic(annotations)           ## ex: annotations <- sample14@meta.data$ClusteringResultsnExp_poi <- round(0.075*nrow(data@meta.data))  ## Assuming 7.5% doublet formation rate - tailor for your datasetnExp_poi.adj <- round(nExp_poi*(1-homotypic.prop))## Run DoubletFinder with varying classification stringencies ----------------------------------------------------------------data <- doubletFinder_v3(data, PCs = 1:30, pN = 0.25, pK = 0.09, nExp = nExp_poi, reuse.pANN = FALSE, sct = FALSE)## save resultsdataL[[idx]]$doubFind_res = data@meta.data %>% select(contains('DF.classifications'))dataL[[idx]]$doubFind_score = data@meta.data %>% select(contains('pANN'))
}

经过上述处理后,dataL就是由所有sample得到的seurat对象构成的list。其中每一个seurat对象的metadata里包含了pANN值(doubFind_score)以及DoubletFinder的预测结果(doubFind_score)。用dataL,我们就可以根据seurat的教程进行后续的filtering、integration等操作了。需要注意的是,如果sample的数量太多,我们可以通过改for循环里idx的范围,每次只处理3-5个sample并及时保存,来避免内存不够等问题。

scrublet代码范例

scrublet的安装可以在这里找到(https://github.com/swolock/scrublet),使用指南则在这里(https://github.com/swolock/scrublet/blob/master/examples/scrublet_basics.ipynb)。需要注意的是scrublet使用的是解压后的matrix.mtx文件和genes.tsv文件,而cellranger产生的是压缩文件,我们需要先提前解压一下。

在使用指南中更改好matrix.mtx和genes.tsv文件对应的位置之后,我们就可以按照里面的步骤一步步跑下来,得到doublet_scores和predicted_doublets。因为后续小L是用seurat对数据进行处理,所以就将doublet_scores和predicted_doublets单独保存下来,再放进seurat对象的metadata里。其中scrublet_res是scrublet的判断结果而scrublet_score是scurblet得到判断所基于的分数。


## 保存doublet_scores和predicted_doublets (python)
d = {'score': doublet_scores, 'prediction': predicted_doublets}
df = pd.DataFrame(data=d)
df.to_csv(DATA_FOLDER2 + sample + '_doublet.csv', index=False)## 导入seurat对象的metadata里 (R)
library(tidyverse)
library(Seurat)
library(DoubletFinder)sampleV = c('SAMPLE1', 'SAMPLE2', 'SAMPLE3')
dataL = list()
## create seurat object for all samples
for (sample in sampleV) {file_name = str_c('DATA_FOLDER', sample, '_cellranger/outs/filtered_feature_bc_matrix')seuratObj_counts <- Read10X(data.dir = file_name)seuratObj = CreateSeuratObject(counts = seuratObj_counts, project = str_c(sample, "1"))doublet_info = read.csv(str_c('DATA_FOLDER2', sample, '_doublet.csv'))seuratObj$scrublet_res = doublet_info$predictionseuratObj$scrublet_score = doublet_info$scoredataL[[sample]] <- seuratObj
}

不管是使用DoubletFinder还是scrublet,我们最终都获得了一个分数和一个基于分数得到的判断结果。之后的步骤就是大家看一看doublet的分布,和在每一个细胞类型中的比例,来判断doublet的检测结果是否可靠,以及是要移除整一个细胞群还是移除被判定是doublet的细胞了。

祝大家吃好喝好睡好,科研快乐~

欢迎关注微信公众号 “小L的读博日常”,第一时间获得更多和生物信息学相关的小tips。

Ref:

[1] Wolock, Samuel L., Romain Lopez, and Allon M. Klein. "Scrublet: computational identification of cell doublets in single-cell transcriptomic data." Cell Systems 8.4 (2019): 281-291.

[scRNA-seq]doublets检测——DoubletFinder scrublet (下)相关推荐

  1. [scRNA-seq]doublets检测——DoubletFinder scrublet (上)

    现今最常用的单细胞RNA测序技术是通过形成一个个液滴,让一个液滴内包含一个细胞,对细胞进行裂解,释放mRNA,添加barcode再逆转录成cDNA最后进行批量测序的一个过程.在这一过程中,我们会给同一 ...

  2. Yolo:实时目标检测实战(下)

    Yolo:实时目标检测实战(下) YOLO:Real-Time Object Detection After a few minutes, this script will generate all ...

  3. Python 递归检测文件夹下的文件

    Python 递归检测文件夹下的文件. 怕自己忘记记录一下: import os# 查找指定文件夹下所有相同名称的文件 def search_file(dirPath, fileName):dirs ...

  4. python如何检测是否按下ESC键

    你可以使用 Python 的 msvcrt 模块来检测是否按下了 ESC 键. import msvcrtdef check_esc_key():if msvcrt.kbhit():key = msv ...

  5. java空格键_Java KeyPressed-如果其他键也太旧,则无法检测是否按下了空格键

    如标题所示,在我的Java游戏中,无法检测是否同时按下空格键和其他键. 例如,空格键是射击键,而箭头键则使玩家移动.如果我按下向上箭头键,向左箭头键和空格键,那么它应该向左上方发射子弹. 但是,在使用 ...

  6. matlab 噪声检测,噪声环境下的信号检测及其matlab仿真 signal detection and matlab simulation in noise environment.pdf...

    噪声环境下的信号检测及其matlab仿真 signal detection and matlab simulation in noise environment 电子产品可靠性与环境试验 vol25N ...

  7. 【点云3D目标检测】OpenPCDet下Spconv1.x与Spconv2.x的安装问题及解决方法

    目录 前言 一.spcon2.x版本的安装 1.安装spcon2.x版本所需要求 2.创建虚拟环境并安装相应的pytorch.torchvision 3.安装spcon2.x 4.测试spcon2.x ...

  8. usb设备检测linux,Linux下USB设备检测全教程(转)

    Linux下USB设备检测全教程(转)[@more@] USB设备检测也是通过/proc目录下的USB文件系统进行的.为了使一个USB设备能够正常工作,必须要现在系统中插入USB桥接器模块.在检测开始 ...

  9. linux usb检测工具,Linux下USB设备检测全教程

    USB设备检测也是通过/proc目录下的USB文件系统进行的.为了使一个USB设备能够正常工作,必须要现在系统中插入USB桥接器模块.在检测开始时,一般要先检测是否存在/proc/bus/usb目录, ...

最新文章

  1. 智能物联网(AIoT,2020年)(下)
  2. app获取个人信息是否合法_APP隐私合规介绍和实施方案
  3. sqlserver删除指定列失败
  4. Houdini技术体系大纲
  5. BS7799、ISO/IEC 17799、ISO/IEC 27001 的关系
  6. 华为云计算hcip证书有效期_华为云计算HCIP V4.0认证要发布了!
  7. 两级运放积分器的带宽分析
  8. [6.15] 心态 信念
  9. spark入门名词解释
  10. 史上最短命!由于BUG微软撤回Win10更新
  11. TCP/IP网络通信协议
  12. xorg方式在无图形环境安装oracle,告别静默安装
  13. 【笑小枫的SpringBoot系列】【十七】SpringBoot文件上传下载
  14. 查看、修改数据库和表的编码格式
  15. 操作Linux软链接引起的各种问题
  16. maya批量操作mel_MAYA运行单个MEL命令方法图文介绍
  17. 成为一名高级软件工程师
  18. 筑牢企业数字化转型的“底盘”,浪潮云ERP呈现出怎样的全景图?
  19. Android开源项目汇总【转】
  20. java计算机毕业设计汽车维修服务系统源代码+数据库+系统+lw文档

热门文章

  1. 有识别水果的软件吗?快把这些软件收好
  2. bioinformatics databases
  3. python多分支结构_3.1.3 多分支结构
  4. c语言中的无符号字符指什么,深入分析C语言中的有符号和无符号
  5. 计算机对教育的影响雅思听力,【雅思听力】电脑教育(2/3)
  6. 阿里云服务器IP地址在哪查看?公网IP和私有IP地址查询
  7. 2020年高教社杯全国大学生数学建模C题中小微企业信贷决策(Matlab代码)
  8. Google protocal Buffers Python API简单使用
  9. 超级计算机预测南方下雪,超算算出京津冀要下雪?确实有征兆但并不完全确定...
  10. 全志r528编译搭建之“秘籍”