
1、GeneKI简介
GenKI是一款旨在仅利用野生型(WT)样本的单细胞RNA测序(scRNA-seq)数据进行虚拟敲除的工具,在没有KO样本的情况下预测基因功能,这与scTenifoldKnk(还来得及!虚拟敲除(1)-scTenifoldKnk包scRNA数据单基因虚拟敲除【详细解释】)是类似的,目的很明确简单,不同的是scTenifoldKnk是基于R语言的工具,GeneKI是基于python的工具。GeneKI工具2023年发表在Nucleic Acids Res杂志。按照原文说法及结论,GeneKI是吊打scTenifoldKnk的同类工具。
GenKI的设计目标是在完全不使用任何真实KO样本信息的前提下,以无监督方式捕捉由KO扰动引起的基因调控变化模式,为基因功能研究提供一个可扩展的框架。为实现这一目标,GenKI采用variational graph autoencoder(VGAE)模型,从输入的WT scRNA-seq数据和衍生的单细胞基因调控网络(scGRN)中学习基因的潜在表征以及基因间的相互作用。随后,通过计算方式从scGRN中移除待敲除基因(即拟进行功能研究的基因)的所有连边,从而生成虚拟KO数据。
论文原文(引用):Yang Y, Li G, Zhong Y, Xu Q, Chen BJ, Lin YT, Chapkin RS, Cai JJ. Gene knockout inference with variational graph autoencoder learning single-cell gene regulatory networks. Nucleic Acids Res. 2023 Jul 21;51(13):6578-6592. doi: 10.1093/nar/gkad450. PMID: 37246643; PMCID: PMC10359630.
GeneKI官网:https://github.com/yjgeno/GenKI/tree/master


#创建环境
#安装GenKI
#GenKI requires Python ≥ 3.10.
conda create -n geneki python=3.10
conda activate geneki
#安装
pip install scanpy -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install GenKI -i https://pypi.tuna.tsinghua.edu.cn/simpleimport os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import scanpy as scimport GenKI as gk
from GenKI.preprocessing import build_adata
from GenKI.dataLoader import DataLoader
from GenKI.train import VGAE_trainer
from GenKI import utils#读入数据
adata = build_adata("./microglial_seurat_WT.h5ad")
adata = adata[:, :].copy()
adataadata.obs['celltype'] = 'microglial'#后续需要使用多线程,需要先安装:
pip install "GenKI[ray]"# load data — build the GRN and prepare WT / virtual-KO graph data
data_wrapper = DataLoader(
adata, # AnnData object,前面处理好的表达矩阵anndata
target_gene=["TREM2"], # KO gene name(s),需要敲除的任意基因名称
target_cell=None, # obs label for cell-type subset; None = all cells
#也即是说,你的anndata是所有celltype的时候,可以设置需要分析的celltype
#无需提取数据,这里因为是提取的数据,都是一种celltype,所以设置None
obs_label="ident", # adata.obs column for cell-type labels,细胞注释列
GRN_file_dir="GRNs", # folder for cached GRN .npz,储存GRN .npz的文件夹名称
rebuild_GRN=True, # build GRN if not cached
n_cpus=8, # Ray sharding; needs `pip install "GenKI[ray]"`
)
data_wt = data_wrapper.load_data()
data_ko = data_wrapper.load_kodata()#初始化并配置一个VGAE模型的训练器,用于在WT数据上训练模型
hyperparams = {"epochs": 100,
"lr": 7e-4,
"beta": 1e-4,
"seed": 8096}
log_dir=None
sensei = VGAE_trainer(data_wt,
epochs=hyperparams["epochs"],
lr=hyperparams["lr"],
log_dir=log_dir,
beta=hyperparams["beta"],
seed=hyperparams["seed"],
verbose=True,
)#模型训练
sensei.train()#保存训练模型
#sensei.save_model('model_example')# get distance between wt and ko
z_mu_wt, z_std_wt = sensei.get_latent_vars(data_wt)
z_mu_ko, z_std_ko = sensei.get_latent_vars(data_ko)
dis = gk.utils.get_distance(z_mu_ko, z_std_ko, z_mu_wt, z_std_wt, by="KL")
print(dis.shape)#根据扰动得分对基因进行排序,排名较前的说明敲除目标基因后收到的扰动越大
res_raw = utils.get_generank(data_wt, dis, rank=True)
res_raw.head()
#permutation test
null = sensei.pmt(data_ko, n=100, by="KL")
res = utils.get_generank(data_wt, dis, null,
save_significant_as = 'MC_KOgenes'#将扰动基因保存到文件
)
res
得到扰动基因列表,可以使用各种方式探究其功能,这里我们使用gseapy演示富集分析,参考我们之前的教程介绍:GSEApy【1】:广泛适用-python版差异基因富集分析
import pandas as pd
import gseapy as gp
import matplotlib.pyplot as pltgene_list = res.index.to_list()
enr = gp.enrichr(gene_list=gene_list, # gene形式需要与数据库保持一致
gene_sets=['GO_Biological_Process_2025','KEGG_2021_Human'],#需要分析的基因集,可以同时分析GO、KEGG两个gene set
organism='human', #物种
outdir=None)from gseapy import barplot, dotplot# categorical scatterplot
ax = dotplot(enr.results,#分析结果
column="Adjusted P-value",#按照adj pvalue展示结果
x='Gene_set', # set x axis, so you could do a multi-sample/library comparsion
size=10,#点大小
top_term=10,#展示的top5terms
figsize=(3,5),#图长宽
title = "Enrichment",#标题
xticklabels_rot=45, # rotate xtick labels
show_ring=False, # set to False to revmove outer ring
marker='o',#plot图形形式,参照https://matplotlib.org/stable/api/markers_api.html
)
# categorical barplot
ax = barplot(enr.results,
column="Adjusted P-value",
group='Gene_set', # set group, so you could do a multi-sample/library comparsion
size=10,
top_term=10,
figsize=(3,5),
color = {'GO_Biological_Process_2025': 'salmon','KEGG_2021_Human':'darkblue'}
)
虚拟敲除本身就有一定的“虚拟”性,所以结果并不总是特别可靠,结合实际理性看待!觉得我们分享有用的点个赞再走呗!