现在单细胞图谱动不动就上百万的细胞数,那这些大型图谱是如何整合和注释的呢? 今天学习 scArches(single-cell architectural surgery)方法,2021年发表在Nature Biotechnology杂志上面,文献《Mapping single-cell data to reference atlases by transfer learning》。这个方法还可以对两个数据的注释一致性进行评估。
scArches 简介 参考图谱提供了一个从根本上改变我们目前分析单细胞数据集方式的机会:通过从适当的参考中学习,我们可以 自动化新数据集的注释 ,并轻松地进行跨组织、物种和疾病条件的比较分析。
此外:scArches 与 scanpy 兼容,并提供了针对单细胞数据的所有条件生成模型的高效实现。
图注:
a、 使用公共参考数据集和相应的参考标签对潜在表示进行预训练。
b、 去中心化模型构建:用户下载感兴趣图谱的参数,对模型进行微调,并可选地上传他们更新后的模型供其他用户使用。
scArches 基础模型应用 在三个人类胰腺数据集(CelSeq、InDrop、Fluidigm C1)上训练参考图谱,原始数据的UMAP(c)。
d、e 第一列:预训练参考模型的整合参考UMAP
d、e 第二列:将新的 SS2 数据集查询到整合参考中。使用第五个数据集(CelSeq2)更新细胞图谱。
d、e 第三列:黑色虚线圆圈表示参考数据中不存在的细胞。
使用 scArches 可以实现哪些功能? 构建单模态或多模态(CITE-seq)参考图谱,并分享训练好的模型和数据。 下载感兴趣图谱的预训练模型,使用新数据集对其进行更新,并与合作者分享。 在参考图谱之上投影和整合查询数据集,并利用潜在表示进行下游分析任务,例如:差异检验、聚类、分类。 scArches 有超多模型可以使用,包括: scVI (Lopez et al., 2018): 需要访问原始count数据进行数据整合,并假设数据服从计数分布(NB、ZINB、Poisson)。 trVAE (Lotfollahi et al., 2020): 支持归一化的对数转换数据或count数据作为输入,并应用额外的MMD损失以在潜在空间中实现更好的融合。 scANVI (Xu et al., 2019): 参考数据需要细胞类型标签,查询数据可以是有标签或无标签;对于无标签查询数据,可使用此方法通过参考标签进行分类。 scGen (Lotfollahi et al., 2019): 参考图谱构建和映射均需要细胞类型标签,仅依赖整合的参考图谱,无需微调。 expiMap (Lotfollahi, Rybakov et al., 2023): 利用基因集数据库或用户提供的先验知识,在已知基因程序的背景下分析查询数据。 totalVI (Gayoso et al., 2019): 用于构建多模态CITE-seq参考图谱。 treeArches (Michielsen, Lotfollahi et al., 2022): 构建参考图谱中细胞类型的层次树,映射查询数据时可进行注释,并识别查询数据中存在的新细胞状态和群体。 SageNet (Heidari et al., 2022): 使用一个或多个空间分辨的参考数据集,将解离的单细胞/点(如来自scRNA-seq或Visium数据集)映射到共同坐标框架中,从而构建空间图谱。 mvTCR (Drost et al., 2022): 整合来自多个供体的T细胞受体(TCR,视为序列)和scRNA-seq数据集,形成捕获两种模态信息的联合表示。 scPoli (De Donno et al., 2022): 整合scRNA-seq数据集、基于原型的标签转移和参考映射,同时学习样本嵌入和整合的细胞嵌入,提供数据的多尺度视图,特别适用于需要整合大量样本的情况。 scArches 方法的网址:
https://docs.scarches.org/en/latest/index.html
下面先来学个基础的看看:https://docs.scarches.org/en/latest/trvae_surgery_pipeline.html,看看 scArches怎么使用。
安装 首先是安装:https://docs.scarches.org/en/latest/installation.html
我本来想用教程提供的 yaml 文件,但是创建了conda环境后,各种软件版本不兼容,下面单独安装好了。
#conda env create -f scarches_linux.yamlconda create -n scarches python=3.11 conda activate scarches # 依赖包 pip install ipykernel conda install -y ipython=8.12.2 # 其他依赖: ipython<8.13.0 sphinx>=3.0.3 nbconvert>=5.6.1 nbsphinx>=0.7 sphinx_rtd_theme numpydoc cython pkgconfig furo 安装好后导入模块: import os #os .chdir('../')import warnings warnings.simplefilter(action= 'ignore' , category=FutureWarning) warnings.simplefilter(action= 'ignore' , category=UserWarning) import scanpy as sc import torch import scarches as sca from scarches.dataset.trvae.data_handling import remove_sparsity import matplotlib.pyplot as plt import numpy as np import gdown sc.settings.set_figure_params(dpi=200, frameon=False) sc.set_figure_params(dpi=200) sc.set_figure_params(figsize=(4, 4)) torch.set_printoptions(precision=3, sci_mode=False, edgeitems=7) 设置相关的 anndata.obs 标签和训练时长 condition_key =
'study' cell_type_key = 'cell_type' target_conditions = [ 'Pancreas CelSeq2' , 'Pancreas SS2' ] trvae_epochs = 500 surgery_epochs = 500 early_stopping_kwargs = { "early_stopping_metric" : "val_unweighted_loss" , "threshold" : 0, "patience" : 20, "reduce_lr" : True, "lr_patience" : 13, "lr_factor" : 0.1, } 数据 使用 CelSeq2 和 SS2 研究的数据作为查询数据(query data),而将其他 3 项研究作为参考图谱(reference atlas)。
下载地址:
https://drive.google.com/uc?id=1ehxgfHTsMZXy6YzlFKGJOsBKQ5rrvMnd
下载数据集后并将其拆分为参考数据集和查询数据集:
adata_all = sc.read( 'pancreas_normalized.h5ad' ) adata_all 15681个细胞。
拆分出:查询数据(query data)和参考图谱(reference atlas)
adata = adata_all.raw.to_adata() adata = remove_sparsity(adata)
adata target_conditions = [ 'Pancreas CelSeq2' , 'Pancreas SS2' ] source_adata = adata[~adata.obs[condition_key].isin(target_conditions)] # 参考图谱(reference atlas) target_adata = adata[adata.obs[condition_key].isin(target_conditions)] # 查询数据(query data) source_conditions = source_adata.obs[condition_key].unique().tolist() # 参考图谱(reference atlas) source_adata source_adata.obs[ 'study' ].unique() # 查询数据(query data) target_adata target_adata.obs[ 'study' ].unique() 现在的目的 就是借助 参考图谱(reference atlas)数据,将新的查询数据(query data)整合注释到一起。
创建 TRVAE 模型并在参考数据集上训练 创建 trVAE 模型实例,默认使用 NB 损失。插入 recon_loss='mse' 或 recon_loss='zinb' 来更改重建损失。
hidden_layer_sizes=[128, 128]:
常见配置 :
中等数据集(10k-50k): [128, 128] 大数据集(>50k): [256, 128, 64] 模型训练时长大约2分钟。
trvae = sca.models.TRVAE( adata=source_adata, ## 源数据(参考数据集/训练数据) condition_key=condition_key, # 条件/批次标签所在的列名 conditions=source_conditions, # 指定要使用的具体条件值 hidden_layer_sizes=[128, 128], ) # 训练 trvae.train( n_epochs=trvae_epochs, alpha_epoch_anneal=200, early_stopping_kwargs=early_stopping_kwargs ) 创建anndata对象: adata_latent = sc.AnnData(trvae.get_latent())
adata_latent.obs[ 'cell_type' ] = source_adata.obs[cell_type_key].tolist() adata_latent.obs[ 'batch' ] = source_adata.obs[condition_key].tolist() 计算 UMAP: sc.pp.neighbors(adata_latent, n_neighbors=8) sc.tl.leiden(adata_latent) sc.tl.umap(adata_latent) sc.pl.umap(adata_latent, color=[ 'batch' , 'cell_type' ], frameon=False, wspace=0.6, ) 预训练完成后,可以保存模型以供后续使用。
模型得到三个文件:
ref_path = 'reference_model/' trvae.save(ref_path, overwrite=True)
对参考模型进行surgery操作 这里的 "surgery"(手术操作) 是 scArches 库中的一个核心概念,特指在预训练好的参考模型基础上,通过冻结部分参数、只训练特定层的方式,将模型适配到新的查询数据集上,而不需要重新训练整个模型。
new_trvae = sca.models.TRVAE.load_query_data(adata=target_adata, reference_model=ref_path) new_trvae # 在查询数据集上训练 new_trvae.train( n_epochs=surgery_epochs, alpha_epoch_anneal=200, early_stopping_kwargs=early_stopping_kwargs, weight_decay=0 ) 在查询数据集上训练 adata_latent = sc.AnnData(new_trvae.get_latent()) adata_latent.obs[ 'cell_type' ] = target_adata.obs[cell_type_key].tolist() adata_latent.obs[ 'batch' ] = target_adata.obs[condition_key].tolist() sc.pp.neighbors(adata_latent, n_neighbors=8) sc.tl.leiden(adata_latent) sc.tl.umap(adata_latent) sc.pl.umap(adata_latent, color=[ 'batch' , 'cell_type' ], frameon=False, wspace=0.6, ) 保存 surgery_model 模型:
surg_path = 'surgery_model' new_trvae.save(surg_path, overwrite=True)
获取参考数据集和查询数据集的潜在表示 full_latent = sc.AnnData(new_trvae.get_latent(adata.X, adata.obs[condition_key])) full_latent.obs[ 'cell_type' ] = adata.obs[cell_type_key].tolist() full_latent.obs[ 'batch' ] = adata.obs[condition_key].tolist() 整合后的UMAP sc.pp.neighbors(full_latent, n_neighbors=8) sc.tl.leiden(full_latent) sc.tl.umap(full_latent) sc.pl.umap(full_latent, color=[ 'batch' , 'cell_type' ], frameon=False, wspace=0.6, ) 这样,两个数据集的整合与注释就做好了!
今天分享到这里~