跳转至

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正值=模块活跃