2024年12月24日,平安夜,OmicVerse在Github上的🌟刚好500个了!对比传统的scanpy的2k个🌟,我们成功实现了国人在这方面0的突破。OmicVerse可以说是应用层的一个统一接口。

对比刚发表时,OmicVerse已经迭代到了1.6.10版本,迭代了快20个版本。因此,有很多论文中没有介绍的新特性,我们希望能在本推文中向大家介绍一下:

这是一个今年新发表在Nat.Commun上的双细胞检测算法,其性能要超越传统的scrublet。我们在OmicVerse可以通过一行代码简单调用:
%%time
adata=ov.pp.qc(adata,
tresh={'mito_perc': 0.2, 'nUMIs': 500, 'detected_genes': 250},
doublets_method='sccomposite',
batch_key=None)
adata

很多时候,我们从网上下载的数据,只给了标准化和对数化后的数据,部分单细胞算法需要原始矩阵,因此我们根据标准化和对数化后的原理,选取最小的值为1,反演了每一个基因的counts。
X_counts_recovered, size_factors_sub=ov.pp.recover_counts(adata.X, 50*1e4, 50*1e5, log_base=None,
chunk_size=10000)
adata.layers['recover_counts']=X_counts_recovered
adata[:,'CD3D'].to_df(layer='recover_counts').T
在肿瘤上皮细胞中,由于肿瘤细胞的多样性/异质性,常规的marker注释亚群较为困难,因此我们会采用非负矩阵分解的方法如cNMF来进行分析:
import numpy as np
## Initialize the cnmf object that will be used to run analyses
cnmf_obj = ov.single.cNMF(adata,components=np.arange(5,11), n_iter=20, seed=14, num_highvar_genes=2000,
output_dir='example_dg1/cNMF', name='dg_cNMF')
## Specify that the jobs are being distributed over a single worker (total_workers=1) and then launch that worker
cnmf_obj.factorize(worker_i=0, total_workers=4)
cnmf_obj.combine(skip_missing_files=True)
cnmf_obj.k_selection_plot(close_fig=False)

CellANOVA 是一个 Python 软件包,用于批量集成单个单元数据中的信号恢复。它建立在现有的单细胞数据集成方法的基础上,并使用一个对照样本池来量化批量效应,并从不需要的批量变化中分离出有意义的生物变化。
## construct control pool
control_dict = {
'pool1': ['s1d3','s2d1'],
}
ov.single.batch_correction(adata,batch_key='batch',n_pcs=50,
methods='CellANOVA',control_dict=control_dict)
adata

今年在Nature Method上发表了一个利用GPT4进行细胞类型自动注释的算法,该包为R语言撰写的,实际上该算法仅是设计了一个Prompt。因此我们在OmicVerse中重新实现了该算法,并且提供了国产大模型作为接口:
os.environ['AGI_API_KEY'] = 'sk-**' # Replace with your actual API key
result = ov.single.gptcelltype(all_markers, tissuename='PBMC', speciename='human',
model='qwen-plus', provider='qwen',
topgenenumber=5)
result

清华大学张学工课题组10月份在Biorxiv上预印了scMulan,并提供了一个基础大模型的checkpoint以及自动注释的函数,我们也将其整合到了OmicVerse中方便调用
scml = ov.externel.scMulan.model_inference(ckp_path, adata_GS_uniformed)
base_process = scml.cuda_count()
scml.get_cell_types_and_embds_for_adata(parallel=True, n_process = 1)
# scml.get_cell_types_and_embds_for_adata(parallel=False) # for only using CPU, but it is really slow.

对于拟时序分析而言,确定发育的起点是至关重要的,因此我们在OmicVerse中整合了CytoTrace2来预测单细胞数据中每个细胞的分化潜能。
results = ov.single.cytotrace2(adata,
use_model_dir="cymodels/5_models_weights",
species="mouse",
batch_size = 10000,
smooth_batch_size = 1000,
disable_parallelization = False,
max_cores = None,
max_pcs = 200,
seed = 14,
output_dir = 'cytotrace2_results'
)

这是港中文课题组发表的VIA的2.0版本,不过我不太喜欢作者的可视化效果,因此我将其整合进OmicVerse的同时,更新了一系列绘图函数的参数:
from omicverse.externel import VIA
v0 = VIA.core.VIA(data=adata.obsm[use_rep][:, 0:ncomps],
true_label=adata.obs[clusters],
edgepruning_clustering_resolution=0.15, cluster_graph_pruning=0.15,
knn=knn, root_user=root_user, resolution_parameter=1.5,
dataset=dataset, random_seed=v0_random_seed, memory=memory)#, do_compute_embedding=True, embedding_type='via-atlas')
v0.run_VIA()

限制CellPhoneDB应用的一个因素,就是可视化效果不如CellChat,因此我们在OmicVerse中仿CellChat,给出了新的各种不同的可视化图:
ov.pl.cpdb_interacting_heatmap(adata=adata,
celltype_key='cell_labels',
means=cpdb_results['means'],
pvalues=cpdb_results['pvalues'],
source_cells=['dNK1','dNK2','dNK3'],
target_cells=['eEVT','iEVT'],
plot_secret=True,
min_means=3,
nodecolor_dict=None,
ax=None,
figsize=(2,6),
fontsize=10,)

由于空间域的识别一直是空转中一个重要的问题,不同的算法识别的空间域有所区别,我们希望有一个函数,可以一键进行各种不同的空间域分析,于是我们在OmicVerse中设计了ov.space.clusters函数。
methods_kwargs={}
methods_kwargs['GraphST']={
'device':'cuda:0',
'n_pcs':30
}
adata=ov.space.clusters(adata,
methods=['GraphST','CAST','BINARY'],
methods_kwargs=methods_kwargs,
lognorm=1e4)
实际上,我们只需要提供细胞类型的marker,理论上也可以对空转的每一个spot进行解卷积分析,因此我们在OmicVerse中引入了Starfysh。
from omicverse.externel.starfysh import (AA, utils, plot_utils, post_analysis)
from omicverse.externel.starfysh import _starfysh as sf_model
# Run models
model, loss = utils.run_starfysh(visium_args,
n_repeats=n_repeats,
epochs=epochs,
#patience=patience,
device=device
)

单细胞分辨率的空转技术在2024年近一步涌现,RNA Velocity理论上也应该能应用于空间转录组中,今年新发表的STT便实现了空间吸引子和稳态的分析。
STT_obj=ov.space.STT(adata,spatial_loc='xy_loc',region='Region')
STT_obj.stage_estimate()

空间通讯是空间转录组学的研究热点,我们希望能够找到空间通讯的传导过程。在这里,我们介绍了两种集成在一体的方法: COMMOT和flowsig。在 OmicVerse中,我们对 COMMOT 和 Flowsig 算法进行了直接实现:
ov.externel.commot.tl.spatial_communication(adata,
database_name='cellchat',
df_ligrec=df_cellchat_filtered,
dis_thr=500, heteromeric=True,
pathway_sum=True)
commot_output_key = 'commot-cellchat'
# We first construct the potential cellular flows from the commot output
ov.externel.flowsig.pp.construct_flows_from_commot(adata,
commot_output_key,
gem_expr_key = 'X_gem',
scale_gem_expr = True,
flowsig_network_key = 'flowsig_network',
flowsig_expr_key = 'X_flow')

在 OmicVerse,我们提供了一个基于东方美学的颜色系统,具有384个代表性的颜色来自紫禁城。我们将利用这些颜色组合在未来的可视化。
所有的颜色都来自这本书: 《中国传统色彩: 故宫里的色彩美学》(国际标准化组织第9787521716054版)
fb=ov.pl.ForbiddenCity()
from IPython.display import HTML
HTML(fb.visual_color(loc_range=(0,384),
num_per_row=24))

感谢你能阅读到这里,如果你有任何希望我们添加的功能,可以到我们的Github上提交issue (https://github.com/Starlitnightly/omicverse/issues),我们会尽力将其整合进入OmicVerse。我们希望,OmicVerse可以成为一个世界范围内最好用的应用层框架,任何好用的单细胞/空转算法,我们都希望能提供一个简单的函数进行直接使用。最后,再次感谢健明老师的大力宣传与帮助。