SCENIC 教程

· Tutorials

SCENIC 教程

摘要: SCENIC 可从单细胞数据推断转录因子(TF)活性。使用 pySCENIC 进行 Python/CLI 工作流。关键步骤:GRN(共表达)、CTX(基序富集)和 AUCell(活性评分)。


什么是 SCENIC?

Single-Cell rEgulatory Network Inference and Clustering(单细胞调控网络推断与聚类)。

大多数 scRNA-seq 分析关注基因表达(mRNA 水平)。SCENIC 则关注调控子活性(TF 及其靶基因是否激活?)。

为何使用它?

  • 识别驱动细胞状态的主调控因子。
  • 对数据缺失稳健(通过靶基因聚合信号)。
  • 跨物种适用(人、小鼠、果蝇)。

SCENIC 工作流


第一部分:安装(正确方式)

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 标志。


资源


另请参阅:

Gene Regulatory Network TF Activity