Seurat -> RunPrestoAll 替代FindAllMarkers 加速DE 搜索

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 本文分享了一种在Seurat 流程里面加速大型数据集执行 DE 分析的方法 RunPrestoAll 的用法示例,以供参考学习

$\,\,\,\,\,\,$Seurat 提供了一个 FindAllMarkers 方法用于在单细胞RNA测序数据中寻找差异表达基因。然而,对于大型数据集的DE分析,使用Seurat软件包的FindAllMarkers方法 在数据集的全部细胞上执行DE搜索将变得非常缓慢。即使开启了future并行,速度也并不会显著提升,因为多线程模式只能在某些特定的计算环节中发挥作用,而在其他计算环节中仍然需要使用单线程模式。在加速搜索差异基因, FindAllMarkers 函数本身提供了对基因或细胞进行预过滤的参数,特别是设置 max.cells.per.ident 对每个类别进行降采样,使其中用于比较的细胞数量不超过设置的阈值。虽然通常会出现一定的性能损失,但速度增加会比较显,并且差异表达最高的基因可能仍会排列在最前面。

如果计算平台允许,并不推荐使用 FindAllMarkers(max.cells.per.ident = *) 通过降采样加速来执行DE 搜索,而是推荐基于 Rcpp 实现的 SeuratWrappers::RunPrestoAll 方法,具有与 Seurat::FindAllMarkers 一样的功能,并提供更迅速的搜索。

1、FindAllMarkers 降采样DE搜索 --性能损失评估

降采样DE搜索代码示例

pacman::p_load(Seurat,dplyr,ggplot2,patchwork,future.apply)
plan(multisession(workers = 10));options(future.globals.maxSize = 100 * 1024^4)

### load data
cur_seu <- readRDS("</USER FILE/>")
Idents(cur_seu) <- "</USER CODE/>"

### 提交异步任务 
R_bg.1 <- callr::r_bg(function(obt){FindAllMarkers(obt,only.pos = T)},args = list(cur_seu),package = c("Seurat"))

### 提交并行任务
future_lapply(c(30,50,70,seq(100,1000,by = 100)), function(sm.size){print(sm.size)
    degs <- FindAllMarkers(cur_seu,only.pos = T,max.cells.per.ident = sm.size,verbose = F)
    degs$sm.size = sm.size
    return(degs)
}) %>% bind_rows() %>% saveRDS("downsample.Rds")

### 等待异步任务完成写出数据
while(R_bg.1$is_alive()){Sys.sleep(.2)}; R_bg.1$get_result() %>% saveRDS("sourcedata.Rds")

性能损失评估
将每个细胞身份降采样到500 进行DE分析的时候,大部分细胞类型的 top_10,30,50,100 差异基因开始显示出比较全细胞集的DEs较高的一致性。然而,即使将采样水平提到1k,一些可能受到批次等实验技术影响的细胞类型的 top50和100 差异基因仍会表现出比较全细胞较低的一致性(最差的一致性下探到 $\sim$90%)。因此,对于需要考虑较多差异基因数量的分析中,有必要注意慎用 降采样的DE搜索方式。

#### 汇总
downsample.rslt <- readRDS("downsample.Rds")
sourcedata.rslt <- readRDS("sourcedata.Rds")
lapply(setNames(c(10,30,50,100),c("top.10","top.30","top.50","top.100")), function(top_n){
    temp_dat <- data.frame()
    for (batch in c(30,50,70,seq(100,1000,by = 100))) {
        for (i in as.vector(unique(dat.fullcells$cluster))) {
            y = sourcedata.rslt %>% filter(cluster == i) %>% slice_max(order_by = avg_log2FC,n = top_n,with_ties = F) %>% pull(gene) %>% unique()
            x = downsample.rslt %>% filter(sm.size == batch) %>% filter(cluster == i) %>% slice_max(order_by = avg_log2FC,n = top_n,with_ties = F) %>% pull(gene) %>% unique()
            temp_dat <- rbind(temp_dat,data.frame(cell=i, overlap_score = length(intersect(x,y))/top_n, sample.size = batch))
        }
    }
    return(temp_dat)
}) -> summary_rslt

lapply(1:length(summary_rslt), function(i){
    summary_rslt[[i]] %>% ggplot() + 
        geom_boxplot(aes(x = factor(sample.size), y = overlap_score,group = sample.size,fill = factor(sample.size))) + 
        theme_bw() + labs(title = sprintf("%s consistance",names(summary_rslt)[i]), x = "max.cells.per.ident") + NoLegend()
}) -> plt
(plt[[1]] |plt[[2]])/(plt[[3]] |plt[[4]])

----

2、RunPrestoAll 加速DE 搜索

SeuratWrappers::RunPrestoAllSeurat::FindAllMarkers 基于 Presto 的实现,功能参数和输出与 Seurat::FindAllMarkers 基本一致,由于 Presto 底层是基于 Rcpp 重编译的,可以非常迅速的进行 Wilcoxon 秩和检验。

实测在【Intel Core Processor (Broadwell) Linux】 平台上,6w 细胞量23类细胞类型的数据集上,开启10线程后,Seurat::FindAllMarkers 函数完成搜索耗时约 40min,而 SeuratWrappers::RunPrestoAll 最快可以在 10min 内完成搜索。

推荐代码

pacman::p_load(Seurat,SeuratWrappers,dplyr,future);
plan(multisession(workers = 10));sprintf("FUTURE CURRENT WORKERS = %s", nbrOfWorkers())

### First Load Your Seurat Object : cur_seu
SeuratWrappers::RunPrestoAll(cur_seu,only.pos = T,verbose =0)

![RunPrestoAll输出格式]


Reference

scRNA_workshop_part3_differential_expression (compbiocore.github.io)
How can we speed up FindMarkers · satijalab/seurat · Discussion #4433 (github.com)
RunPresto: A Presto-based implementation of FindMarkers that runs... in satijalab/seurat-wrappers: Community-Provided Methods and Extensions for the Seurat Object (rdrr.io)

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6月前
|
机器学习/深度学习 并行计算 PyTorch
百度搜索:蓝易云【Pytorch和CUDA版本对应关系】
请注意,上述版本对应关系只是示例,并非详尽无遗。实际上,PyTorch的每个版本通常会支持多个CUDA版本,而具体支持的CUDA版本也可能因操作系统、硬件配置等因素而有所不同。因此,在使用PyTorch时,建议参考PyTorch官方文档或社区支持的信息,以获取最准确和最新的PyTorch与CUDA版本对应关系。
165 2
|
6月前
UITextField shouldChangeCharactersInRange获取实时数据并执行联想搜索和搜索
UITextField shouldChangeCharactersInRange获取实时数据并执行联想搜索和搜索
48 0
|
11月前
|
前端开发 JavaScript
Select2(4.0.6)城市搜索
实现了城市列表的前端搜索,输入汉字、拼音首字母均可搜索,前端搜索。
906 0
Select2(4.0.6)城市搜索
|
SQL Java
白话Elasticsearch04- 结构化搜索之使用terms query搜索多个值以及多值搜索结果优化
白话Elasticsearch04- 结构化搜索之使用terms query搜索多个值以及多值搜索结果优化
526 0
|
SQL JSON 自然语言处理
白话Elasticsearch01- 结构化搜索之使用term query来搜索数据
白话Elasticsearch01- 结构化搜索之使用term query来搜索数据
300 0
|
存储 并行计算 算法
秒懂算法 | 搜索基础
本篇介绍了BFS和DFS的概念、性质、模板代码。
157 0
秒懂算法 | 搜索基础
|
人工智能 自然语言处理 数据库
联合搜索:搜索中的所有需求
现如今各行各业内容和数据量逐年增长,内容碎片化已成为现实问题。各大公司在众多平台上每个方向都有内容。当有如此多的搜索选项时,如何确保用户获得他们想要的信息? 在本文中了解业务方向(在客户服务、营销或运营方面)如何集中搜索以减少客户和团队的搜索工作,并简化内容源之间的可查找性。
235 0
|
前端开发
【TP5】对于广告分类跟搜索的解决方案
【TP5】对于广告分类跟搜索的解决方案
127 0
【TP5】对于广告分类跟搜索的解决方案
|
测试技术
solr&lucene spatial search 大规模地理搜索性能堪忧
假期重新把之前在新浪博客里面的文字梳理了下,搬到这里。最早发布时间2013年的时候。以下内容非最新版本的性能表现。
129 0
|
机器学习/深度学习 算法 文件存储
ICCV 2019 | 四小时搜索NN结构,厦大提出快速NAS检索方法
ICCV 2019 将于 10.27-11.2 在韩国首尔召开,本次会议总共接受 1077 篇,总提交 4303 篇,接收率 25%。厦门大学媒体分析与计算实验室共有 6 篇论文接受其中两篇为 oral。
172 0
ICCV 2019 | 四小时搜索NN结构,厦大提出快速NAS检索方法
下一篇
无影云桌面