作者按

本章节主要讲解了基于marker的自动注释方法,一般来说,我会先自动注释,再手动去确认marker,这是因为,对于一个陌生的组织,我对marker是不了解的,自动注释可以帮助我快速熟悉细胞类型。本教程首发于单细胞最好的中文教程,未经授权许可,禁止转载。

全文字数|预计阅读时间: 5000|5min

——Starlitnightly(星夜)

1. 背景

我们在3-2的教程中,详细介绍了如何根据marker对细胞进行手动注释的方法。但是随着时代的发展,越来越多的组织,器官被人们注释完。很多初学者对marker的不熟悉,使得其手动注释的准确率较低。这时候,我们就在想,是否可以基于现有的注释数据,构建一个全面的注释图谱,使得我们只需要输入单细胞数据,就能自动输出注释结果。

在这里,我将自动注释算法分为需要GPU的深度学习模型以及不需要GPU的统计学模型两种,我们在(一)中先介绍不需要GPU的统计学模型自动注释。我们在此介绍的算法是SCSA,SCSA可以根据簇特异性marker,查询数据库中每一种细胞类型的marker,选出吻合度最高的一类细胞,如果差异性不够大,那么则选出两类细胞,这时可以被认为是Unknown细胞。

import omicverse as ov
print(f'omicverse version: {ov.__version__}')
import scanpy as sc
print(f'scanpy version: {sc.__version__}')
ov.ov_plot_set()

2. 加载数据

在这里,我们使用手动注释好的所用到的人类骨髓数据进行注释,使用注释好的数据可以方便我们比较手动注释与自动注释的准确率。

adata = ov.read('s4d8_manual_annotation.h5ad')
adata

3. 聚类

与手动注释类似,我们使用SCSA模型也需要对单细胞测序数据先进行聚类,在这里,我们的resolution=2可以设置地更大一些。

sc.pp.neighbors(adata, n_neighbors=15,
n_pcs=30,use_rep='scaled|original|X_pca')
sc.tl.leiden(adata, key_added="leiden_res1", resolution=2.0)

我们观察不同类别在UMAP图上的分布情况

adata.obsm["X_mde"] = ov.utils.mde(adata.obsm["scaled|original|X_pca"])

--

ov.utils.embedding(adata,
basis='X_mde',
color=[ "leiden_res1"],
title=['Clusters'],
palette=ov.palette()[:],
show=False,frameon='small',)

4. SCSA自动注释

4.1 Cellmarker注释

很多paper里,将SCSA作为一个benchmark,认为其注释准确率较低,但实际这跟SCSA所依赖的数据库有关,作者一直将CellMarker数据库停留在1.0版本,直到今年omicverse将SCSA整合,并更新数据库后,这个19年发表的算法也更新了CellMarker数据库。而在omicverse中,我还添加了panglaodb作为第二个参考数据库供读者选择。

我们在这里详细介绍函数ov.single.pySCSA的参数:

  • foldchange: 这是我们每个簇相对于别的簇的差异倍数,一般设置1.5即可,设置地越高用到的marker越少
  • pvalue: 与foldchange对应,我们在计算差异倍数的时候会进行统计学差异显著性分析,通常由于细胞数的原因,pvalue会出现膨胀,所以p值都非常小,我们设置一个常见阈值0.01即可
  • celltype: 这个参数包括了normalcancer两个参数,当我们设置成cancer的时候,我们可以注释出来自cancersea数据库的12种肿瘤细胞亚型
  • target: 我们要使用的目的数据库,目前pySCSA中存放了cellmarker, cancersea, panglaodb三个数据库
  • tissue: 我们可以使用scsa.get_model_tissue()列出所有支持的组织,默认是使用全部tissue
  • model_path: 这里可以设定我们使用的数据库,默认为'',将自动从figshare下载omicverse专用数据库,当然你也可以手动下载

注意事项:

celltype='cancer',target='cancersea'需要同时设定

数据库:

pySCSA_2023_v2_plus.db

scsa=ov.single.pySCSA(adata=adata,
foldchange=1.5,
pvalue=0.01,
celltype='normal',
target='cellmarker',
tissue='All',
model_path='temp/pySCSA_2023_v2_plus.db'
)

正式开始注释的环节,我们这里有三个参数

  • clustertype: 注释依据的簇名,存放在adata.obs
  • cluster: 需要注释的cluster,可以设置为list: ['1','2']表示只注释簇1和簇2
  • rank_rep: 是否需要重新计算差异表达基因,由于当细胞数量上去后,差异表达基因的计算会较慢,如果我们已经运算了sc.tl.rank_genes_groups,我们可以设置成False停止重复计算
adata.uns['log1p']['base']=10
res=scsa.cell_anno(clustertype='leiden_res1',
cluster='all',rank_rep=True)
res.head()

我们可以使用cell_anno_print来打印自动注释的结果

scsa.cell_anno_print()
Cluster:0	Cell_type:Natural killer cell|T cell	Z-score:13.273|9.396
Nice:Cluster:1 Cell_type:B cell Z-score:17.404
Cluster:2 Cell_type:Natural killer cell|T cell Z-score:11.593|6.514
Cluster:3 Cell_type:Natural killer cell|T cell Z-score:12.76|8.216
Nice:Cluster:4 Cell_type:B cell Z-score:12.598
Cluster:5 Cell_type:Natural killer cell|T cell Z-score:9.54|8.235
Nice:Cluster:6 Cell_type:B cell Z-score:17.663
Nice:Cluster:7 Cell_type:Natural killer cell Z-score:14.884
Cluster:8 Cell_type:T cell|CD4+ T cell Z-score:11.135|5.887
Nice:Cluster:9 Cell_type:Natural killer cell Z-score:11.839
Cluster:10 Cell_type:T cell|Natural killer cell Z-score:8.536|5.758
Nice:Cluster:11 Cell_type:Monocyte Z-score:14.702
Nice:Cluster:12 Cell_type:Natural killer T (NKT) cell Z-score:16.376
Cluster:13 Cell_type:Monocyte|Natural killer T (NKT) cell Z-score:14.982|12.323
Cluster:14 Cell_type:T cell|Naive CD4+ T cell Z-score:4.286|3.828
Nice:Cluster:15 Cell_type:B cell Z-score:15.455
Cluster:16 Cell_type:Natural killer T (NKT) cell|B cell Z-score:16.348|14.152
Cluster:17 Cell_type:Natural killer T (NKT) cell|T cell Z-score:12.837|11.628
Cluster:18 Cell_type:T cell|Natural killer cell Z-score:12.177|9.216
Nice:Cluster:19 Cell_type:Red blood cell (erythrocyte) Z-score:12.92
Nice:Cluster:20 Cell_type:B cell Z-score:15.318
Nice:Cluster:21 Cell_type:B cell Z-score:13.077
Cluster:22 Cell_type:Monocyte|Natural killer T (NKT) cell Z-score:12.582|6.915
Nice:Cluster:23 Cell_type:B cell Z-score:16.847
Cluster:24 Cell_type:Hematopoietic stem cell|Natural killer T (NKT) cell Z-score:10.647|10.385
Nice:Cluster:25 Cell_type:Red blood cell (erythrocyte) Z-score:2.196
Nice:Cluster:26 Cell_type:Natural killer cell Z-score:14.092
Nice:Cluster:27 Cell_type:B cell Z-score:14.312
Nice:Cluster:28 Cell_type:B cell Z-score:15.943
Cluster:29 Cell_type:T cell|Naive CD8+ T cell Z-score:7.808|6.713
Cluster:30 Cell_type:Monocyte|Macrophage Z-score:12.19|8.303
Nice:Cluster:31 Cell_type:Natural killer cell Z-score:11.614

我们使用cell_auto_anno将分数最高的细胞类型注释上,但这个函数不会区分非Nice的细胞注释结果,还存在一些误差。

scsa.cell_auto_anno(adata,clustertype='leiden_res1',
key='scsa_celltype_cellmarker')
...cell type added to scsa_celltype_cellmarker on obs of anndata

我们发现自动注释中多注释出了Hematopoietic stem cell,这类细胞可能是注释偏差,其对应的簇为24,我们发现其z-score没有高于第二类两倍,10.647|10.385。此外,我们自动注释没有注释出neuron,neuron对应的是胶质细胞,这是自动注释的局限性

ov.utils.embedding(adata,
basis='X_mde',
color=[ "major_celltype","scsa_celltype_cellmarker",],
title=['Cell type'],
palette=ov.palette()[15:],
show=False,frameon='small',wspace=0.45)

4.2 panglaodb注释

我们还可以尝试panglaodb数据库来注释

scsa=ov.single.pySCSA(adata=adata,
foldchange=1.5,
pvalue=0.01,
celltype='normal',
target='panglaodb',
tissue='All',
model_path='temp/pySCSA_2023_v2_plus.db' )
res=scsa.cell_anno(clustertype='leiden_res1',
cluster='all',rank_rep=True)
res.head()
scsa.cell_auto_anno(adata,clustertype='leiden_res1',
key='scsa_celltype_panglaodb')
...cell type added to scsa_celltype_panglaodb on obs of anndata
ov.utils.embedding(adata,
basis='X_mde',
color=[ "scsa_celltype_panglaodb","scsa_celltype_cellmarker",],
title=['Cell type'],
palette=ov.palette()[15:],
show=False,frameon='small',wspace=0.45)

有趣的是,panglaodb注释出了Reticulocytes,Erythroid-like两种红细胞,T cells,T memory cells两种T细胞亚群。虽然看起来更准确了,但实际上我们在大类注释时不需要将细胞类型精细化。我们还提供了一个函数get_celltype_marker获取指定细胞类型的marker基因

marker_dict=ov.single.get_celltype_marker(adata,clustertype='scsa_celltype_cellmarker')
marker_dict.keys()

--

dict_keys(['B cell', 'Hematopoietic stem cell', 'Monocyte', 'Natural killer T (NKT) cell', 'Natural killer cell', 'Red blood cell (erythrocyte)', 'T cell'])

--

marker_dict['B cell']
array(['AFF3', 'BACH2', 'CD74', 'EBF1', 'BANK1', 'RALGPS2', 'IGHM', 'LYN',
'FCHSD2', 'ZCCHC7', 'PAX5', 'MEF2C', 'UBE2E2'], dtype=object)

我们可以查询所有支持的tissue,目前支持两种物种:Human与Mouse。我们在后续的更新中会陆续加入斑马鱼,植物等数据库

scsa.get_model_tissue(species='Human')

单细胞测序最好的教程(八): 细胞类型自动注释-1|基于marker的自动注释的更多相关文章

  1. 基于单细胞测序数据构建细胞状态转换轨迹(cell trajectory)方法总结

    细胞状态转换轨迹构建示意图(Trapnell et al. Nature Biotechnology, 2014) 在各种生物系统中,细胞都会展现出一系列的不同状态(如基因表达的动态变化等),这些状态 ...

  2. 单细胞测序技术(single cell sequencing)

    单细胞测序技术(single cell sequencing) 2018-03-02 11:02   来源: 一呼百诺  点击次数:6587关键词:   前言 单细胞生物学最近几年是非常热门的研究方向 ...

  3. 单细胞测序|单细胞基因组|单细胞转录组|Gene editing|

    单细胞测序 单细胞基因组学 测量理由是单细胞的时间空间特异性. Gene expression&co-expression 比较正常cell与疾病cell,正常organ与疾病organ,看出 ...

  4. Laravel教程 八:queryScope 和 setAttribute

    Laravel教程 八:queryScope 和 setAttribute 此文章为原创文章,未经同意,禁止转载. Laravel Eloquent Database 直接就是按照上一节所说的那样,我 ...

  5. RabbitMQ入门教程(八):远程过程调用RPC

    原文:RabbitMQ入门教程(八):远程过程调用RPC 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.cs ...

  6. 答读者问(1):非模式物种找marker;如何根据marker定义细胞类型

    下午花了两个小时回答读者的疑问,觉得可以记录下来,也许能帮到一部分人. 第一位读者做的是非模式物种的单细胞. 一开始以为是想问我非模式物种的marker基因在哪儿找,读者朋友也提到了blast 研究的 ...

  7. CRL快速开发框架系列教程八(使用CRL.Package)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  8. Json.Net系列教程 2.Net类型与JSON的映射关系

    原文 Json.Net系列教程 2.Net类型与JSON的映射关系 首先谢谢大家的支持和关注.本章主要介绍.Net类型与JSON是如何映射的.我们知道JSON中类型基本上有三种:值类型,数组和对象.而 ...

  9. 黄聪:Microsoft Enterprise Library 5.0 系列教程(八) Unity Dependency Injection and Interception

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(八) Unity Dependency Injection and Interception 依赖注入容器Uni ...

  10. Solidity教程系列1 - 类型介绍

    现在的Solidity中文文档,要么翻译的太烂,要么太旧,决定重新翻译下,再加上代码事例讲解. 写在前面 Solidity是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解, 如果 ...

随机推荐

  1. Vue——基本使用

    Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统.我们不再和 HTML 直接交互了.一个 Vue 应用会将其挂载到一个 DOM 元素上 (对于这个例子是 #app ...

  2. 在Rainbond上部署高可用Apollo集群

    一.背景信息 当前文档描述如何通过云原生应用管理平台 Rainbond 一键安装高可用 Apollo 集群.这种方式适合给不太了解 Kubernetes.容器化等复杂技术的用户使用,降低了在 Kube ...

  3. ReplayKit2采用端口转发数据时不能终止的问题

    一.现象描述 测试发现在进行USB连接数据投屏中,如果点击屏幕红条进行结束ReplayKit2投屏或者通知栏点击停止录制按钮,大概率出现已经停止录屏,但是通知栏中的录屏按钮还在继续录制的问题 这个现象 ...

  4. 调试YOLOv3/YOLOv5过程中遇到的问题汇总

    今日立冬 yolov1 yolo1论文 https://www.bilibili.com/video/BV15w411Z7LG yolo2论文 https://www.bilibili.com/vid ...

  5. Qt--ui的简单使用(1)

    1  说明 本文主要介绍Qt ui界面的简单使用. 参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=22 2  工程创建 创建工程时,把创建界面给 ...

  6. vue移动端 滚动

    better-scroll: https://better-scroll.github.io/docs/zh-CN/guide/ 影院列表数据使用better-scroll来完成数据的展示,此插件对于 ...

  7. 剑指Offer-52.正则表达式匹配(C++/Java)

    题目: 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式. ...

  8. Vue CLI 4与项目构建实战指南

    title: Vue CLI 4与项目构建实战指南 date: 2024/6/9 updated: 2024/6/9 excerpt: 这篇文章介绍了如何使用Vue CLI优化项目构建配置,提高开发效 ...

  9. 双网卡、多网卡指定IP分别访问网卡(windows添加静态路由)

    有两块网卡,网关分别是 128.0.100.198 和 192.168.10.2,128.0.100.198,网速10M.192.168.10.2,网速100M.平时上网用192.168.10.2,访 ...

  10. 3个月搞定计算机二级C语言!高效刷题系列进行中

    前言 大家好,我是梁国庆. 计算机二级应该是每一位大学生的必修课,相信很多同学的大学flag中都会有它的身影. 我在大学里也不止一次的想要考计算机二级office,但由于种种原因,备考了几次都不了了之 ...