跳转至

404_多组学通路分析


一句话说明

多组学通路分析就是把基因、蛋白、代谢物等多层数据都投影到同一张通路地图上,找哪条路出了问题。


核心知识点

单组学 vs 多组学通路分析

方面单组学多组学
输入差异基因列表差异基因+蛋白+代谢物
视角mRNA层面从基因到代谢产物全链路
可信度高(多证据支持)
工具KEGG/GO富集Pathview, IMPaLA, OmicsNet

主要分析方法

  1. ORA(超几何检验):差异特征列表 vs 通路基因集
  2. GSEA:利用全部特征的排序列表,无需设阈值
  3. 网络传播:在蛋白互作网络(PPI)上传播信号
  4. 联合富集(Joint pathway analysis):同时输入多组学特征

重要数据库

数据库内容网址
KEGG代谢/信号通路kegg.jp
Reactome反应通路reactome.org
WikiPathways社区维护通路wikipathways.org
MetaboAnalyst代谢通路专用metaboanalyst.ca

实战代码

import pandas as pd
import numpy as np
from scipy import stats

# ========== 1. 准备多组学差异分析结果 ==========
# 模拟转录组差异基因
rna_results = pd.DataFrame({
    "gene": [f"GENE_{i}" for i in range(200)],
    "log2FC": np.random.normal(0, 1.5, 200),  # 对数倍数变化
    "padj": np.random.uniform(0.001, 0.5, 200)  # 校正后p值
})

# 模拟蛋白组差异蛋白
protein_results = pd.DataFrame({
    "protein": [f"GENE_{i}" for i in range(0, 150)],  # 前150个与基因重叠
    "log2FC": np.random.normal(0, 1.0, 150),
    "padj": np.random.uniform(0.001, 0.3, 150)
})

# 筛选显著差异特征
sig_rna = rna_results[
    (rna_results["padj"] < 0.05) & (rna_results["log2FC"].abs() > 1)
]["gene"].tolist()

sig_protein = protein_results[
    (protein_results["padj"] < 0.05) & (protein_results["log2FC"].abs() > 0.5)
]["protein"].tolist()

print(f"显著差异基因数: {len(sig_rna)}")
print(f"显著差异蛋白数: {len(sig_protein)}")

# ========== 2. 模拟KEGG通路基因集 ==========
# 实际应用中使用 KEGGREST 或 msigdbr 包获取
pathways = {
    "hsa00010_Glycolysis": [f"GENE_{i}" for i in range(0, 30)],
    "hsa04151_PI3K_Akt": [f"GENE_{i}" for i in range(20, 70)],
    "hsa04010_MAPK": [f"GENE_{i}" for i in range(50, 110)],
    "hsa00190_Oxidative_phosphorylation": [f"GENE_{i}" for i in range(80, 130)],
    "hsa04110_Cell_cycle": [f"GENE_{i}" for i in range(100, 160)],
}

# ========== 3. 超几何检验(ORA) ==========
def ora_test(query_genes, pathway_genes, total_genes=20000):
    """
    超几何检验:检验query_genes在pathway_genes中的富集情况
    就像从牌堆中随机抽牌,统计抽到红心的概率
    """
    k = len(set(query_genes) & set(pathway_genes))  # 交集数量(抽到红心数)
    M = total_genes     # 总基因数(牌堆总数)
    n = len(pathway_genes)  # 通路基因数(红心总数)
    N = len(query_genes)    # 查询基因数(抽牌数)

    if k == 0:
        return 1.0, k  # 没有交集,不显著

    # 超几何检验:计算至少k个基因在通路中的概率
    p_value = stats.hypergeom.sf(k - 1, M, n, N)
    return p_value, k

# 对每条通路做ORA
print("\n===== RNA组学通路分析 =====")
rna_enrichment = []
for pathway_name, pathway_genes in pathways.items():
    p_val, overlap = ora_test(sig_rna, pathway_genes)
    rna_enrichment.append({
        "pathway": pathway_name,
        "overlap": overlap,
        "pathway_size": len(pathway_genes),
        "p_value": p_val,
        "odds_ratio": (overlap / len(sig_rna)) / (len(pathway_genes) / 20000)
    })

rna_enrich_df = pd.DataFrame(rna_enrichment).sort_values("p_value")

# 多重检验校正(Benjamini-Hochberg方法)
from scipy.stats import rankdata
p_values = rna_enrich_df["p_value"].values
n_tests = len(p_values)
ranks = rankdata(p_values)  # 从小到大排序获得名次
fdr = p_values * n_tests / ranks  # BH校正
fdr = np.minimum(fdr, 1.0)  # FDR不超过1
rna_enrich_df["FDR"] = fdr
print(rna_enrich_df[["pathway", "overlap", "p_value", "FDR"]].to_string(index=False))

# ========== 4. 多组学联合富集 ==========
print("\n===== 多组学联合通路分析 =====")
# 策略:要求通路在RNA和蛋白两个层次都富集
protein_enrichment = []
for pathway_name, pathway_genes in pathways.items():
    p_val, overlap = ora_test(sig_protein, pathway_genes)
    protein_enrichment.append({
        "pathway": pathway_name,
        "p_value_protein": p_val,
        "overlap_protein": overlap
    })

protein_enrich_df = pd.DataFrame(protein_enrichment)

# 合并两组学的富集结果
joint_enrichment = rna_enrich_df.merge(
    protein_enrich_df, on="pathway"
)

# 联合显著性:两个p值的乘积(Fisher合并法)
joint_enrichment["joint_p"] = (
    joint_enrichment["p_value"] * joint_enrichment["p_value_protein"]
)
joint_enrichment = joint_enrichment.sort_values("joint_p")

print("\n多组学联合富集结果(按联合p值排序):")
print(joint_enrichment[["pathway", "overlap", "overlap_protein", "joint_p"]].to_string(index=False))

# ========== 5. Pathview可视化(R语言) ==========
r_pathview_code = """
library(pathview)  # 在KEGG通路图上叠加表达量数据

# 准备基因数据(Entrez ID为行名,log2FC为值)
gene.data <- setNames(rna_results$log2FC, rna_results$entrez_id)

# 准备代谢物数据(KEGG化合物ID为行名)
cpd.data <- setNames(metabolite_results$log2FC, metabolite_results$cpd_id)

# 绘制Glycolysis通路图,颜色代表上调(红)/下调(绿)
pathview(
    gene.data = gene.data,
    cpd.data = cpd.data,
    pathway.id = "hsa00010",  # KEGG通路ID
    species = "hsa",           # 人类
    out.suffix = "multiomics", # 输出文件后缀
    kegg.native = TRUE         # 使用KEGG原始通路图
)
"""
print("\nR-Pathview代码(需R环境运行):")
print(r_pathview_code)

面试常问点

  1. Q: ORA和GSEA的本质区别? A: ORA需要先设阈值定义差异基因,用超几何检验;GSEA不需要阈值,利用全部基因的排序分数(ES score),更敏感但更慢。

  2. Q: 多重检验校正为什么重要? A: 同时检验5000条通路,按p<0.05阈值会有250个假阳性。FDR(BH法)控制假阳性比例,q<0.05是通用标准。

  3. Q: 代谢物如何映射到KEGG通路? A: 代谢物需要转换为KEGG Compound ID(C号),可用HMDB、PubChem接口转换,MetaboAnalyst有自动映射功能。


速查表

工具类型特点
clusterProfilerR ORA/GSEA生信标准工具
PathviewR 可视化KEGG通路图着色
IMPaLAWeb 多组学同时分析基因+代谢物
MetaboAnalystWeb 代谢组代谢通路专用
OmicsNetWeb 多组学网络整合分析