378_单细胞转录因子活性推断
一句话说明
转录因子(TF)活性推断就是从基因表达数据里"反推"哪些转录因子在这个细胞里是活跃的——不直接测TF本身,而是看TF的靶基因是否集体上调。
核心知识点
要点1:为什么不直接看TF基因表达
- 很多TF蛋白靠翻译后修饰(磷酸化)激活,mRNA水平不代表活性
- TF的mRNA表达量往往很低,单细胞数据中dropout率高
- 靶基因集体变化比TF本身mRNA更能反映TF的真实活性
要点2:主流方法分类
| 方法 | 思路 | 工具 |
|---|
| 基因集打分 | TF靶基因集的综合表达分数 | viper/SCENIC |
| ATAC联合 | 开放染色质+基因调控网络 | SCENIC+ |
| 贝叶斯模型 | 用靶基因活性推断TF活性 | DoRothEA+viper |
| 深度学习 | 序列特征预测TF结合 | DeepBind |
要点3:DoRothEA + VIPER 框架
- DoRothEA:人工整理的TF-靶基因调控网络,按证据等级分A-E(A级最可靠)
- VIPER(Virtual Inference of Protein-activity by Enriched Regulon analysis):
- 把TF的靶基因集看作一个"基因组"
- 用NES(Normalized Enrichment Score)计算靶基因集的富集程度
- NES高 → 靶基因整体上调 → TF活跃
要点4:SCENIC 框架
- SCENIC(Single-Cell rEgulatory Network Inference and Clustering)
- 三步:①GRNBoost2推断候选调控关系 → ②RcisTarget筛选含TF结合位点的靶基因 → ③AUCell计算每个细胞的regulon活性
- 优点:直接从数据推断网络,不依赖预先构建的TF-靶基因数据库
要点5:pySCENIC(Python 版本)
- SCENIC的Python实现,速度更快
- 分三步运行:
pyscenic grn → pyscenic ctx → pyscenic aucell - 与 Scanpy/AnnData 无缝整合
实战代码
DoRothEA + VIPER(R)
library(viper) # TF活性推断
library(dorothea) # TF-靶基因调控网络数据库
library(Seurat) # 单细胞分析
library(dplyr)
# 步骤1:加载 DoRothEA 调控网络(取A-C级,高可信度)
data(dorothea_hs) # 人类TF网络(hs=human sapiens)
# 小鼠用:data(dorothea_mm)
# 只保留高可信度的A-C级调控关系
regulons <- dorothea_hs %>%
filter(confidence %in% c("A", "B", "C")) # 过滤低可信度(D、E级证据弱)
cat("保留的TF-靶基因对数:", nrow(regulons), "\n")
cat("涉及TF数:", length(unique(regulons$tf)), "\n")
# 步骤2:准备表达矩阵(需要Z-score标准化的数据)
# VIPER需要normalized + scaled的表达矩阵
expr_matrix <- GetAssayData(seurat_obj, layer = "scale.data") # 使用scaled data
# 步骤3:将 DoRothEA 格式转换为 VIPER 的 regulon 格式
regulon_list <- df2regulon(regulons) # dorothea提供的转换函数
# 步骤4:用 VIPER 计算 TF 活性
tf_activity <- viper(
eset = expr_matrix, # 基因表达矩阵(基因×细胞)
regulon = regulon_list, # TF调控网络
nes.method = "none", # NES计算方法
method = "scale", # 标准化方法
minsize = 4, # TF至少需要4个靶基因才计算(过滤孤立TF)
eset.filter = FALSE,
cores = 4, # 多线程
verbose = FALSE
)
# tf_activity: TF × 细胞矩阵,值为NES(正值=活跃,负值=抑制)
# 步骤5:将TF活性整合为 Seurat 对象的新Assay
seurat_obj[["dorothea"]] <- CreateAssayObject(data = tf_activity)
DefaultAssay(seurat_obj) <- "dorothea" # 切换到TF活性assay
# 可视化:UMAP上某个TF的活性
FeaturePlot(seurat_obj,
features = "TP53", # 查看TP53的活性
reduction = "umap",
order = TRUE # 高活性细胞显示在前景
)
# 热图:各细胞类型的TF活性差异
# 先切回RNA assay找到差异TF
DefaultAssay(seurat_obj) <- "dorothea"
viper_diff_tf <- FindMarkers(
seurat_obj,
ident.1 = "T cells", # 组1细胞类型
ident.2 = "B cells", # 组2细胞类型
min.pct = 0.1
)
# 查看Top差异TF
head(viper_diff_tf[order(viper_diff_tf$avg_log2FC, decreasing = TRUE), ])
pySCENIC 流程(Python)
import os
import pandas as pd
import numpy as np
import scanpy as sc
from pyscenic.utils import load_motifs
from pyscenic.transform import df2regulons
from pyscenic.aucell import aucell
# ============================================================
# pySCENIC 三步法(完整流程)
# 前两步建议用命令行运行(计算量大)
# ============================================================
# 步骤1:推断基因调控网络(GRN)
# 命令行运行:
os.system("""
pyscenic grn \
--num_workers 8 \
--output adj.csv \
--method grnboost2 \
filtered_loom.loom \
human_TFs.txt
""")
# adj.csv: TF-靶基因候选对及重要性分数
# 步骤2:用顺式调控元件筛选靶基因(pruning)
os.system("""
pyscenic ctx \
adj.csv \
hg38_10kbp_up_10kbp_dw_full_tx_v10_clust.genes_vs_motifs.rankings.feather \
--annotations_fname motifs-v10nr_clust-nr.hgnc-m0.001-o0.0.tbl \
--expression_mtx_fname filtered_loom.loom \
--mode "dask_multiprocessing" \
--output regulons.csv \
--num_workers 8
""")
# regulons.csv: 经过motif验证的高可信TF-靶基因调控单元
# 步骤3:计算每个细胞的 regulon 活性(AUCell)
adata = sc.read_h5ad("preprocessed.h5ad")
regulons_df = pd.read_csv("regulons.csv", index_col=0)
# 转换为regulon格式
regulons = df2regulons(regulons_df)
# AUCell:对每个细胞计算每个regulon的AUC分数
auc_mtx = aucell(
adata.X, # 表达矩阵(细胞×基因)
regulons, # TF调控单元
num_workers=4, # 多线程
seed=42 # 随机种子
)
# auc_mtx: 细胞×TF矩阵,值为AUC(0-1,越高TF越活跃)
# 整合结果到 adata
adata.obsm["X_aucell"] = auc_mtx.values # 存储AUC矩阵
adata.uns["regulon_names"] = auc_mtx.columns.tolist() # 存储TF名称
print(f"计算完成:{auc_mtx.shape[0]} 细胞,{auc_mtx.shape[1]} 个regulon")
# 可视化:用 heatmap 展示细胞类型和TF活性
sc.pl.heatmap(
adata,
var_names=auc_mtx.columns[:20].tolist(), # Top20 TF
groupby="cell_type", # 按细胞类型分组
use_raw=False,
layer=None,
save="_scenic_tf_activity.pdf"
)
面试常问点
- 为什么不直接用TF的mRNA表达量? TF活性主要受磷酸化等翻译后修饰调控,mRNA和活性可以完全脱钩
- DoRothEA置信度分级是什么意思? A级=多种实验方法确认的直接靶基因,B级=ChIP-seq等,E级=计算预测,可信度递减
- SCENIC比DoRothEA的优势是什么? SCENIC从数据中重新推断网络,不依赖预先构建的数据库,可发现新的调控关系
速查表
| 工具 | 需要参考数据库 | 速度 | 推荐场景 |
|---|
| DoRothEA+VIPER | 是 | 快 | 快速分析,专注已知TF |
| SCENIC | 否(motif库) | 慢 | 发现新调控网络 |
| pySCENIC | 否(motif库) | 较快 | Python流程,大规模数据 |