跳转至

蛋白组与转录组联合分析


一句话说明

蛋白组与转录组联合分析就是"把基因的RNA表达量和蛋白表达量放在一起比较"——mRNA告诉你基因"被读了多少遍",蛋白告诉你"实际做了多少产品"。两者经常不一致,正是这种不一致揭示了翻译调控等重要机制。


核心知识点

要点1:mRNA-蛋白相关性

  • 整体相关性低:mRNA和蛋白的相关系数通常只有r=0.4-0.6(Pearson)
  • 不一致的原因
  • 翻译效率差异:不同mRNA的翻译速率不同
  • 蛋白半衰期差异:有些蛋白很稳定(几天),有些很快降解(几小时)
  • 翻译后调控:miRNA抑制翻译、蛋白降解通路(泛素-蛋白酶体)
  • 技术偏差:两种组学的检测灵敏度和动态范围不同
  • 面试要点:这个不一致本身就是生物学信息,不是错误

要点2:联合分析策略

  • 四象限分析
  • 第一象限(RNA↑蛋白↑):一致性上调,经典转录调控
  • 第二象限(RNA↑蛋白↓):翻译抑制或蛋白降解增强
  • 第三象限(RNA↓蛋白↓):一致性下调
  • 第四象限(RNA↓蛋白↑):蛋白稳定性增强或翻译效率提高
  • 差异基因/蛋白交集:Venn图展示两个层面共同变化的基因
  • 通路层面整合:分别做富集分析,比较两个层面的通路变化
  • 翻译效率推断:蛋白/mRNA比值反映翻译效率

要点3:数据匹配与标准化

  • 基因ID映射:RNA-seq用基因名/Ensembl ID,蛋白组用UniProt ID,需要统一映射
  • 对应关系:一个基因可能对应多个蛋白(剪接异构体),需要确定匹配规则
  • 标准化考量:RNA-seq用TPM/FPKM,蛋白组用iBAQ/LFQ,两者不能直接比绝对值
  • 取交集:只分析两个组学都检测到的基因(通常3000-6000个)

要点4:常用分析工具

  • DESeq2/edgeR:RNA-seq差异表达
  • MaxQuant/DIA-NN:蛋白组定量
  • mixOmics:R包,提供多组学整合方法(PLS、DIABLO)
  • MOFA+:多组学因子分析,发现跨组学的变异因子
  • 绘图工具:四象限散点图、相关性热图、Sankey图

实战代码

# === 转录组-蛋白组联合分析 ===
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import pearsonr, spearmanr

# 1. 读取两组学数据
rna = pd.read_csv("rnaseq_log2fc.csv", index_col=0)  # RNA-seq差异结果
protein = pd.read_csv("proteomics_log2fc.csv", index_col=0)  # 蛋白组差异结果

# 2. 基因ID映射和取交集
# 假设两者都用基因名(Gene Symbol)作为index
common_genes = rna.index.intersection(protein.index)  # 取交集
print(f"RNA检测基因: {len(rna)}, 蛋白检测: {len(protein)}, 交集: {len(common_genes)}")

rna_common = rna.loc[common_genes, "log2FC"]
protein_common = protein.loc[common_genes, "log2FC"]

# 3. 计算整体相关性
r_pearson, p_pearson = pearsonr(rna_common, protein_common)
r_spearman, p_spearman = spearmanr(rna_common, protein_common)
print(f"Pearson r = {r_pearson:.3f} (p={p_pearson:.2e})")
print(f"Spearman rho = {r_spearman:.3f} (p={p_spearman:.2e})")

# 4. 四象限散点图
fig, ax = plt.subplots(figsize=(10, 10))

# 定义四象限颜色
colors = []
for rna_fc, prot_fc in zip(rna_common, protein_common):
    if rna_fc > 0 and prot_fc > 0:
        colors.append("red")       # RNA↑ 蛋白↑
    elif rna_fc > 0 and prot_fc < 0:
        colors.append("blue")      # RNA↑ 蛋白↓ (翻译抑制)
    elif rna_fc < 0 and prot_fc < 0:
        colors.append("green")     # RNA↓ 蛋白↓
    else:
        colors.append("orange")    # RNA↓ 蛋白↑ (蛋白稳定)

ax.scatter(rna_common, protein_common, c=colors, alpha=0.5, s=15)
ax.axhline(0, color="gray", linestyle="--", linewidth=0.5)
ax.axvline(0, color="gray", linestyle="--", linewidth=0.5)
ax.set_xlabel("RNA log2FC", fontsize=12)
ax.set_ylabel("Protein log2FC", fontsize=12)
ax.set_title(f"Transcriptome vs Proteome (r={r_pearson:.3f})", fontsize=14)

# 标注四象限基因数
q1 = sum(1 for c in colors if c == "red")
q2 = sum(1 for c in colors if c == "blue")
q3 = sum(1 for c in colors if c == "green")
q4 = sum(1 for c in colors if c == "orange")
ax.text(0.8, 0.95, f"Q1(↑↑): {q1}", transform=ax.transAxes, color="red")
ax.text(0.8, 0.90, f"Q2(↑↓): {q2}", transform=ax.transAxes, color="blue")
ax.text(0.05, 0.05, f"Q3(↓↓): {q3}", transform=ax.transAxes, color="green")
ax.text(0.05, 0.10, f"Q4(↓↑): {q4}", transform=ax.transAxes, color="orange")

plt.savefig("rna_protein_quadrant.png", dpi=150, bbox_inches="tight")

# 5. 翻译效率分析
# 翻译效率 = 蛋白丰度 / mRNA丰度(取log后做差)
translation_eff = protein_common - rna_common  # log2(蛋白/mRNA)
top_te = translation_eff.nlargest(20)   # 翻译效率最高的20个基因
bottom_te = translation_eff.nsmallest(20)  # 翻译效率最低的20个基因
print("翻译效率最高的基因:", top_te.index.tolist()[:5])

面试常问点

Q1: mRNA和蛋白表达为什么不一致?

参考答案:主要有四个原因:一是翻译效率不同,有些mRNA有特殊的5'UTR结构或uORF,影响核糖体装载效率;二是蛋白半衰期不同,有些蛋白(如结构蛋白)很稳定可以累积,有些(如信号蛋白)很快被降解;三是翻译后调控,miRNA可以抑制翻译,泛素-蛋白酶体系统可以降解蛋白;四是技术因素,两种组学的检测灵敏度和偏好不同。这种不一致本身就是重要的生物学信息。

Q2: 联合分析中四象限图中"RNA上调但蛋白下调"(Q2)的基因有什么生物学意义?

参考答案:这类基因可能受到翻译层面的负调控。可能的原因包括:miRNA介导的翻译抑制(mRNA在但蛋白被压制)、蛋白被泛素化快速降解、蛋白折叠出问题被内质网质量控制清除。这类基因值得深入研究,因为它们揭示了转录之外的调控层。可以进一步查看这些基因是否富集在某些信号通路,以及是否有已知的miRNA靶点。


速查卡片

问题一句话答案
mRNA与蛋白相关性通常多高?Pearson r ≈ 0.4-0.6
不一致的主要原因?翻译效率差异、蛋白半衰期差异、翻译后调控
四象限图横纵轴?横轴=RNA log2FC,纵轴=蛋白log2FC
翻译效率怎么算?log2(蛋白丰度) - log2(mRNA丰度)
多组学整合工具?mixOmics(R), MOFA+
交集基因通常多少?3000-6000个(取决于检测深度)