SCENIC 教程
摘要: SCENIC 可从单细胞数据推断转录因子(TF)活性。使用 pySCENIC 进行 Python/CLI 工作流。关键步骤:GRN(共表达)、CTX(基序富集)和 AUCell(活性评分)。
什么是 SCENIC?
Single-Cell rEgulatory Network Inference and Clustering(单细胞调控网络推断与聚类)。
大多数 scRNA-seq 分析关注基因表达(mRNA 水平)。SCENIC 则关注调控子活性(TF 及其靶基因是否激活?)。
为何使用它?
- 识别驱动细胞状态的主调控因子。
- 对数据缺失稳健(通过靶基因聚合信号)。
- 跨物种适用(人、小鼠、果蝇)。

第一部分:安装(正确方式)
pySCENIC 的依赖管理可能较为棘手。为避免常见错误(如 np.object 弃用),请使用以下精确的 conda 设置:
# 创建环境
conda create -y -n pyscenic python=3.10
# 激活
conda activate pyscenic
# 安装主包
pip install pyscenic scanpy loompy matplotlib seaborn
# 关键依赖修复
pip install "numpy<1.24" "pandas<2.0"
验证安装:
pyscenic --help
第二部分:准备输入数据
1. 表达矩阵 (.loom)
将您的 Seurat/Scanpy 对象导出为 .loom 格式。
从 Seurat (R):
library(Seurat)
library(SeuratDisk)
# 加载对象
obj <- readRDS("seurat_obj.rds")
# 转换为 loom
as.loom(obj, filename = "input.loom", verbose = FALSE)
从 Scanpy (Python):
import scanpy as sc
adata = sc.read("adata.h5ad")
adata.write_loom("input.loom")
2. 下载数据库
您需要从 cisTarget 资源库 下载三种类型的文件:
A. TF 列表:
wget https://resources.aertslab.org/cistarget/tf_lists/allTFs_hg38.txt
B. 基序排序(基于基因):
警告:大文件(1GB+)
# 人类 10kb 上游/下游
wget https://resources.aertslab.org/cistarget/databases/homo_sapiens/hg38/refseq_r80/mc_v10_clust/gene_based/hg38_10kbp_up_10kbp_down_full_tx_v10_clust.genes_vs_motifs.rankings.feather
C. 基序注释:
wget https://resources.aertslab.org/cistarget/motif2tf/motifs-v10nr_clust-nr.hgnc-m0.001-o0.0.tbl
第三部分:运行流程(CLI)
在 screen 或 tmux 会话中运行这些步骤(耗时数小时)。
步骤 1:GRN(基因调控网络)
推断共表达模块。
pyscenic grn \
--num_workers 12 \
--output adj.tsv \
--method grnboost2 \
input.loom \
allTFs_hg38.txt
步骤 2:CTX(顺式靶点富集)
基于基序富集修剪模块以保留直接靶点。
pyscenic ctx \
adj.tsv \
hg38_10kbp_up_10kbp_down_full_tx_v10_clust.genes_vs_motifs.rankings.feather \
--annotations_fname motifs-v10nr_clust-nr.hgnc-m0.001-o0.0.tbl \
--expression_mtx_fname input.loom \
--output regulons.csv \
--mask_dropouts \
--num_workers 12
步骤 3:AUCell(活性评分)
对每个细胞的调控子活性进行评分。
pyscenic aucell \
input.loom \
regulons.csv \
--output output_scenic.loom \
--num_workers 12
第四部分:在 Python 中可视化
将结果加载到 Scanpy 中进行可视化。
import scanpy as sc
import loompy as lp
import pandas as pd
# 加载原始数据
adata = sc.read_loom("input.loom")
# 加载 SCENIC 结果(AUCell 矩阵)
lf = lp.connect("output_scenic.loom", mode='r', validate=False)
auc_mtx = pd.DataFrame(lf.ca.RegulonsAUC, index=lf.ca.CellID)
lf.close()
# 添加到 AnnData
adata.obsm['X_aucell'] = auc_mtx
1. 基于调控子的 UMAP
基于 TF 活性而非基因表达对细胞进行聚类。
# 在 AUCell 矩阵上计算邻居
sc.pp.neighbors(adata, use_rep='X_aucell')
sc.tl.umap(adata)
sc.pl.umap(adata, color='celltype', title='基于调控子的 UMAP')
2. 可视化特定 TF
# 将特定调控子评分复制到 .obs 以便绘图
regulon = 'PAX5(+)'
adata.obs[regulon] = auc_mtx[regulon]
sc.pl.umap(adata, color=regulon, cmap='viridis')
3. 调控子特异性
# 每个簇的 top 调控子矩阵图
sc.pl.matrixplot(adata,
var_names=['PAX5(+)', 'EBF1(+)', 'TCF3(+)'],
groupby='celltype',
use_raw=False)
故障排除
"AttributeError: module 'numpy' has no attribute 'object'"
原因: NumPy 1.24+ 弃用了 np.object。
修复: 降级 NumPy:
pip install "numpy<1.24"
"TypeError: Must supply at least one delayed object"
原因: dask 版本不兼容。
修复:
pip install dask==2023.5.0 distributed==2023.5.0
"loompy.connect validate=False error"
原因: 新版 loompy 验证严格。
修复: 如果可能,使用 scanpy 而非 SeuratDisk 重新生成 loom 文件,或在 Python 脚本中使用 validate=False 标志。
资源
- 官方文档: scenic.aertslab.org
- pySCENIC 仓库: github.com/aertslab/pySCENIC
- Nature 实验手册: Aibar et al. (2017)
另请参阅: