01 质谱结果表与实验设计
01 质谱结果表与实验设计
这一章的目标是让读者在动手做差异蛋白分析之前,先搞清楚"手上拿到的是什么格式的表、每一列代表什么、实验设计怎么对应到分析里"。
质谱数据处理的起点
蛋白质组学的原始数据是质谱仪产出的 .raw / .mzML 文件。这些文件需要经过数据库搜索(DDA)或者谱图库匹配(DIA)才能得到蛋白鉴定和定量结果。常用的处理工具:
| 工具 | 适用 | 输出 |
|---|---|---|
| MaxQuant | DDA | proteinGroups.txt、evidence.txt |
| FragPipe | DDA | combined_protein.tsv |
| DIA-NN | DIA | report.pg_matrix.tsv |
| Spectronaut | DIA | 自定义导出表 |
BioF3 的蛋白组教程从这些工具的输出表开始,不涉及原始质谱数据处理。
MaxQuant proteinGroups.txt 的关键列
MaxQuant 是目前最常用的 DDA 处理工具。它的 proteinGroups.txt 是一张宽表,每行一个蛋白组(protein group),关键列:
| 列名 | 含义 |
|---|---|
Protein IDs |
UniProt accession,多个用分号分隔 |
Gene names |
基因名(用于可视化和富集) |
LFQ intensity XXX |
每个样本的 Label-Free Quantification 强度 |
iBAQ XXX |
另一种定量方式(绝对丰度估计) |
Razor + unique peptides |
用于该蛋白定量的肽段数 |
Reverse |
是否匹配到反向库(应过滤掉) |
Potential contaminant |
是否是常见污染物(应过滤掉) |
Only identified by site |
是否仅通过修饰位点鉴定(通常过滤掉) |
读入后第一件事:过滤掉 Reverse == "+" 和 Potential contaminant == "+" 的行。这些不是真正的样本蛋白。
实验设计表
和 bulk RNA-seq 一样,蛋白组分析也需要一张样本表把"哪个列对应哪个条件"说清楚。DEP 包要求的格式:
label condition replicate
Sample1 Control 1
Sample2 Control 2
Sample3 Control 3
Sample4 Treatment 1
Sample5 Treatment 2
Sample6 Treatment 3
label要和proteinGroups.txt里LFQ intensity列名的后缀对得上condition是分组变量(后面做差异分析的对比就基于它)replicate是生物学重复编号
缺失值:蛋白组的核心难题
和转录组最大的区别:蛋白组的缺失值非常多。一个蛋白在某些样本里完全没有信号(LFQ = 0 或 NA),原因可能是:
- MNAR(Missing Not At Random):蛋白丰度太低,低于检测限 → 这种缺失和真实丰度有关
- MCAR(Missing Completely At Random):随机的技术波动 → 和丰度无关
两种缺失的处理策略不同:MNAR 通常用"从分布左尾采样"(MinProb)来插补;MCAR 可以用 KNN 或均值插补。DEP 默认用 MinProb,适合大多数蛋白组场景。
从 proteinGroups.txt 到 DEP 对象
DEP 包把上面这些步骤封装成几个函数:
library(DEP)
# 1. 读入 MaxQuant 结果
data <- read.delim("proteinGroups.txt")
# 2. 过滤污染和反向库
data <- data[data$Reverse != "+", ]
data <- data[data$Potential.contaminant != "+", ]
# 3. 确保蛋白名唯一
data_unique <- make_unique(data, "Gene.names", "Protein.IDs", delim = ";")
# 4. 构建 SummarizedExperiment
lfq_cols <- grep("LFQ.intensity.", colnames(data_unique))
data_se <- make_se(data_unique, lfq_cols, experimental_design)
make_se 之后得到的是一个标准的 Bioconductor SummarizedExperiment 对象,后续的过滤、归一化、插补、差异分析都在这个对象上操作。
下一步
常见坑
坑 1:把 LFQ intensity = 0 当作"表达量为 0"
MaxQuant 输出中 LFQ intensity = 0 表示"未检测到",不是"蛋白不存在"或"丰度为零"。直接 log2(0) 会产生 -Inf。正确做法是把 0 替换为 NA,后续用缺失值插补策略处理。
坑 2:用 counts(肽段数)做差异分析
Spectral count 或 peptide count 虽然和丰度正相关,但不适合做精确的定量比较——它是离散的、非线性的,且受蛋白长度影响。差异分析应该用 intensity-based 定量(LFQ、TMT ratio),counts 只适合粗略筛选。
坑 3:归一化方式选错
蛋白组常用中位数归一化或 VSN。如果数据已经是 log2 转换后的,再跑 VSN 会产生奇怪的方差结构。确认输入数据的 scale(原始 intensity vs log2 intensity),再选归一化方法。DEP 的 normalize_vsn 内部会自动 log2 转换。
坑 4:实验设计表的 label 和 LFQ 列名对不上
DEP 要求 experimental_design$label 精确匹配 LFQ.intensity. 后面的后缀。如果 MaxQuant 里样本名有空格或特殊字符,R 读入后会被替换成点号,导致匹配失败。建议一开始就用简单的 alphanumeric 命名。
下一步
接着深入:
- 02 DEP 差异蛋白分析 — 完整的差异分析管线
- 05 缺失值的两种来源与策略对比 — 深入理解 MNAR vs MCAR
横向延伸:
- bulk RNA-seq 01 数据获取与质控 — 类似的"实验设计 → QC → 下游"框架
- 多组学整合 02 数据清洗与特征对应 — 蛋白组数据如何对齐到基因坐标