745. 单细胞代谢通量分析scFBA¶
一句话概述:将代谢模型和单细胞转录组数据结合,估算每个细胞的代谢状态——就像给每个细胞做一次"代谢体检",看它在消耗什么、产生什么、能量代谢如何。
核心知识点速查表¶
| 概念 | 白话解释 | 关键工具 |
|---|---|---|
| scFBA | 单细胞通量平衡分析 | compass, scFEA |
| FBA | 通量平衡分析(经典方法) | COBRApy |
| Compass | 用代谢模型+转录组推断代谢活性 | Python/R |
| scFEA | 用神经网络预测单细胞代谢通量 | PyTorch |
| Recon3D | 人类全基因组代谢模型 | GEM数据库 |
| 代谢通量 | 代谢反应中物质的流动速率 | mol/cell/h |
一、原理(白话版)¶
1.1 为什么在单细胞水平做代谢分析?¶
传统的代谢分析是在"一群细胞"上做的(bulk),但实际上: - 同一个肿瘤里,有的细胞在做糖酵解(无氧),有的在做氧化磷酸化(有氧) - 免疫细胞激活前后代谢状态完全不同 - 干细胞分化时代谢方式会切换
scFBA的目标:为每个单细胞推断其代谢状态。
1.2 两种主要方法¶
方法一:Compass(基于优化)
表达矩阵 → 约束代谢模型的反应上界 → FBA优化 → 代谢通量
方法二:scFEA(基于深度学习)
表达矩阵 → 神经网络直接预测 → 代谢物平衡约束 → 代谢通量
对比:
Compass更有理论基础(基于GEM),但慢
scFEA更快,但依赖训练数据
二、Compass分析流程¶
2.1 安装与运行¶
# ===== 安装Compass =====
pip install compass-sc # 安装Compass
# 准备输入数据
# 需要:归一化的表达矩阵(TSV格式,行=基因,列=细胞)
# 运行Compass
compass --data expression_matrix.tsv \ # 输入:表达矩阵
--num-processes 8 \ # 并行进程数
--output-dir compass_output/ \ # 输出目录
--species human \ # 物种(human或mouse)
--media media.json # 培养基条件(可选)
# 输出文件
# compass_output/
# ├── reactions.tsv # 每个细胞每个反应的"代谢惩罚分数"
# ├── secretions.tsv # 代谢物分泌能力
# └── uptake.tsv # 代谢物摄入能力
2.2 结果分析¶
# ===== 分析Compass结果 =====
import pandas as pd # 导入pandas
import numpy as np # 导入numpy
import scanpy as sc # 导入scanpy
import matplotlib.pyplot as plt # 导入绑图
import seaborn as sns # 导入seaborn
# 读取Compass结果
reactions = pd.read_csv("compass_output/reactions.tsv", sep="\t", index_col=0)
# 行=反应ID,列=细胞barcode
# 值=代谢惩罚分数(越低=该反应越活跃)
# 转换:惩罚分数 → 活性分数
activity = -reactions # 取负号,值越高=越活跃
# 将结果添加到AnnData对象
adata = sc.read_h5ad("processed.h5ad") # 读取已处理的单细胞数据
# 匹配细胞
common_cells = activity.columns.intersection(adata.obs_names)
activity_matched = activity[common_cells].T # 转置:行=细胞
# 感兴趣的代谢通路(手动挑选关键反应)
glycolysis_rxns = [ # 糖酵解相关反应
"HEX1", "PFK", "PGK", "PYK", "LDH_L"
]
oxphos_rxns = [ # 氧化磷酸化相关反应
"NADH2_u10m", "FADH2ETC", "ATPS4m"
]
fatty_acid_rxns = [ # 脂肪酸合成
"FAS80COA", "FAS100COA", "FAS120COA"
]
# 计算通路水平活性(取反应活性的均值)
for pathway_name, rxn_list in [
("Glycolysis", glycolysis_rxns),
("OxPhos", oxphos_rxns),
("FattyAcid", fatty_acid_rxns)
]:
available = [r for r in rxn_list if r in activity_matched.columns]
if available:
adata.obs[pathway_name] = activity_matched[available].mean(axis=1).values
# 可视化代谢活性
fig, axes = plt.subplots(1, 3, figsize=(18, 5))
for i, pathway in enumerate(["Glycolysis", "OxPhos", "FattyAcid"]):
sc.pl.umap(adata, color=pathway, cmap="RdYlBu_r", ax=axes[i],
title=f"{pathway} Activity", show=False)
plt.tight_layout()
plt.savefig("metabolic_activity_umap.png", dpi=300)
plt.show()
# 分细胞类型比较
fig, axes = plt.subplots(1, 3, figsize=(18, 6))
for i, pathway in enumerate(["Glycolysis", "OxPhos", "FattyAcid"]):
sns.boxplot(data=adata.obs, x="cell_type", y=pathway, ax=axes[i])
axes[i].set_xticklabels(axes[i].get_xticklabels(), rotation=45, ha="right")
axes[i].set_title(f"{pathway} by Cell Type")
plt.tight_layout()
plt.savefig("metabolic_by_celltype.png", dpi=300)
plt.show()
三、scFEA分析流程¶
# ===== 安装scFEA =====
git clone https://github.com/changwn/scFEA.git # 克隆仓库
cd scFEA
pip install -r requirements.txt # 安装依赖
# 运行scFEA
python src/scFEA.py \
--data_dir data/ \ # 数据目录
--input_dir input/ \ # 输入目录(含表达矩阵)
--output_dir output/ \ # 输出目录
--moduleGene_file module_gene_m168.csv \ # 代谢模块-基因对应关系
--stoichiometry_matrix cmMat_c70_m168.csv \ # 化学计量矩阵
--sc_imputation True \ # 是否做缺失值填补
--cName_file cName_c70.csv # 代谢物名称文件
# ===== 分析scFEA结果 =====
import pandas as pd
# 读取scFEA输出的代谢通量
flux = pd.read_csv("output/flux.csv", index_col=0) # 行=细胞,列=代谢模块
balance = pd.read_csv("output/balance.csv", index_col=0) # 代谢物平衡
# flux矩阵:正值=该模块活跃,负值=不活跃
# balance矩阵:各代谢物的净产生/消耗量
print(f"代谢模块数: {flux.shape[1]}")
print(f"分析的细胞数: {flux.shape[0]}")
# 查看关键代谢物的平衡
print("\n=== 代谢物平衡(正=净产生,负=净消耗)===")
print(balance.mean().sort_values(ascending=False).head(10))
四、常见报错与解决¶
| 报错信息 | 原因 | 解决方案 |
|---|---|---|
Compass: solver infeasible | 代谢模型约束不可行 | 放松培养基约束或使用默认media |
Compass: memory error | 细胞数太多 | 下采样或分批运行 |
Gene names not matched | 基因名格式不一致 | 统一用HUGO symbols |
scFEA: loss not converging | 训练不收敛 | 调整学习率或增加epoch |
No metabolic activity | 基因表达太低 | 过滤掉基因检出率<5%的细胞 |
五、面试高频问题¶
Q1: 单细胞代谢分析的最大挑战是什么?¶
A: ①基因表达≠酶活性(转录后调控、蛋白修饰);②单细胞数据稀疏(dropout);③代谢模型假设稳态,但细胞可能不在稳态;④缺乏单细胞水平的代谢组学验证数据。
Q2: Compass和scFEA的区别?¶
A: Compass基于传统FBA+GEM,理论基础好但速度慢;scFEA用深度学习直接预测通量,速度快但可解释性差。Compass更适合机理研究,scFEA更适合大规模筛选。
六、速查表¶
# ===== 单细胞代谢分析速查 =====
# Compass
pip install compass-sc
compass --data expr.tsv --num-processes 8 --output-dir output/ --species human
# scFEA
python scFEA.py --input_dir input/ --output_dir output/
# 关键代谢通路反应ID(Recon3D)
# 糖酵解: HEX1, PFK, PGK, PYK, LDH_L
# TCA循环: CSm, ACONTm, ICDHxm, AKGDm, SUCOASm
# 氧化磷酸化: NADH2_u10m, FADH2ETC, ATPS4m
# 脂肪酸合成: FAS80COA, FAS100COA
# 结果解读
# Compass: 惩罚分数低=活跃,取负号后高=活跃
# scFEA: flux正值=模块活跃