3. 计算生物典型工作流剖析

计算生物工作流不是一条简单的“输入数据—运行软件—输出结果”直线,而是一条由多个可独立失败、可独立追踪的节点串联而成的链条。理解这条链条的关键,在于识别每个节点上“什么被改变了、改变是否被记录、改变能否被重放”。本节以一条典型的 RNA-seq 差异表达分析工作流为主线,剖析从原始测序数据到最终差异基因列表的完整链条,并标出影响追踪与复现的关键节点与常见陷阱。

一、工作流的五个逻辑阶段

一条完整的 RNA-seq 差异表达工作流通常包含五个逻辑阶段:原始数据获取、质量控制与预处理、比对或定量、统计建模、结果汇总与解释。每个阶段都有明确的输入、输出和可观测的中间状态。追踪与复现的核心,不是记住软件名称,而是记住每个阶段“输入是什么、输出是什么、中间发生了什么变换”。

以示例项目为例:假设我们有一组双端 RNA-seq 数据,6 个样本,分为对照组(Control)和处理组(Treatment),每组 3 个生物学重复。原始数据为 6 个 _R1.fastq.gz 和 6 个 _R2.fastq.gz 文件,参考基因组为 GRCh38,注释版本为 GENCODE v44。这些信息本身就是追踪的起点——如果连样本分组、参考版本、注释版本都没有记录,后续任何结果都无法被可靠复现。

二、关键节点与常见陷阱

节点 1:原始数据完整性。原始 FASTQ 文件一旦被修剪或过滤,就不再是“原始数据”。常见陷阱是把质控后的文件覆盖原文件,导致无法回溯到真正的原始输入。正确做法是保留原始文件只读,所有处理输出写入独立目录,并用校验和(如 MD5)记录原始文件指纹。

节点 2:参考基因组与注释版本。比对和定量都依赖参考序列与注释文件。常见陷阱是只记录“用了 GRCh38”,却没有记录具体补丁版本、下载来源和注释版本。不同注释版本之间基因模型可能变化,直接影响定量结果。建议在项目目录中保存参考文件的来源 URL、下载日期和校验和。

节点 3:软件与参数。同一软件不同版本、同一版本不同参数,都可能产生不同结果。常见陷阱是只记录软件名,不记录版本和完整命令行。例如 fastp 的 --cut_right 与默认模式行为不同,salmon 的 --libType 设置错误会导致链特异性判断失败。追踪要求记录完整命令、版本号和关键参数。

节点 4:中间文件与样本顺序。多样本并行处理时,样本顺序、批次信息和文件对应关系极易出错。常见陷阱是样本表(sample sheet)与文件名不一致,导致分组标签错位。建议在流程开始前生成一份样本清单,明确 sample_id、group、R1、R2 四列,并在后续步骤中始终以 sample_id 为主键。

节点 5:统计建模与结果阈值。差异表达分析中的设计矩阵、对比设置、多重检验校正方法和显著性阈值,都是结果解释的一部分。常见陷阱是只保存最终基因列表,不保存设计矩阵和对比定义,导致无法判断“差异”是针对哪个比较。追踪要求保存设计公式、对比向量和阈值参数。

RNA-seq 差异表达工作流:从原始数据到结果的关键追踪节点 ① 原始数据 6×R1/R2.fastq.gz MD5 校验和 只读保留 ② 质控与修剪 fastp v0.23.4 --cut_right 输出 clean.fastq.gz ③ 比对/定量 Salmon v1.10.2 --libType A quant.sf 表达量 ④ 统计建模 DESeq2 v1.42 ~ group 设计矩阵+对比 ⑤ 结果 差异基因 列表 padj<0.05 追踪层:每个节点必须记录 —— 输入指纹 + 工具版本 + 完整命令 + 输出校验和 样本清单(sample_id / group / R1 / R2)贯穿全流程,作为唯一主键 陷阱 A:覆盖原始文件 修剪后直接覆盖 raw.fastq.gz → 无法回溯原始输入 对策:原始文件只读,输出独立目录 陷阱 B:版本信息缺失 只写“GRCh38”不写补丁/注释版本 → 基因模型变化导致定量差异 对策:记录来源 URL + 下载日期 + 校验和 陷阱 C:样本标签错位 文件名与分组表不一致 → 对照组与处理组颠倒 对策:以 sample_id 为主键,全流程校验 可复现链条:原始数据 → 样本清单 → 工具版本 → 命令与参数 → 中间文件 → 设计矩阵 → 结果阈值 任一环节缺失,都会使“从原始数据到最终结果”的链条断裂,导致结果无法被独立重放 追踪的目标不是保存所有文件,而是保存“足以重建每一步”的最小信息集

三、从链条视角看追踪与复现

把工作流看作链条后,追踪与复现的任务就变得具体:对每个节点,记录输入指纹、工具版本、完整命令和输出校验和。这四类信息构成“足以重建该节点”的最小信息集。如果某个节点缺少其中任何一项,该节点就无法被独立重放,整条链条的可复现性就会在该处断裂。

以示例项目为例,一个可追踪的项目目录可以这样组织:

project/
├── raw/                    # 原始 FASTQ,只读
│   ├── ctrl_1_R1.fastq.gz
│   ├── ctrl_1_R2.fastq.gz
│   └── ...
├── metadata/
│   ├── samples.tsv         # sample_id, group, R1, R2
│   └── reference.txt       # GRCh38 补丁号, GENCODE v44, URL, MD5
├── qc/                     # fastp 输出
├── quant/                  # salmon 输出
├── deseq2/                 # 设计矩阵、对比、结果表
└── logs/
    ├── fastp.cmd
    ├── salmon.cmd
    └── deseq2.R

其中 samples.tsv 是贯穿全流程的主键表,reference.txt 记录参考来源,logs/ 保存完整命令和脚本。这样,即使换一台机器、换一个时间点,只要这些信息完整,就能从原始数据重新生成最终结果。

追踪的最小信息集可以概括为“四件套”:输入指纹、工具版本、完整命令、输出校验和。任何节点缺少其中一项,该节点就不可独立重放。

四、常见陷阱的识别与规避

陷阱 A:覆盖原始文件。修剪后的 FASTQ 直接覆盖原始文件,导致无法回溯真正的原始输入。规避方法是原始目录设为只读,所有处理输出写入独立目录,并在流程开始时计算原始文件 MD5。

陷阱 B:版本信息缺失。只记录“用了 GRCh38”,却没有记录补丁版本、注释版本和下载来源。不同注释版本之间基因模型可能变化,直接影响定量结果。规避方法是在 reference.txt 中记录完整版本号、来源 URL、下载日期和校验和。

陷阱 C:样本标签错位。文件名与分组表不一致,导致对照组与处理组颠倒。规避方法是以 sample_id 为主键,在流程入口和出口各做一次样本清单校验,确保分组标签与文件对应关系一致。

陷阱 D:只保存最终结果。只保留差异基因列表,不保存设计矩阵、对比定义和阈值参数,导致无法判断“差异”是针对哪个比较。规避方法是在 deseq2/ 目录中保存设计公式、对比向量、校正方法和显著性阈值。

五、结果判读与链条完整性检查

当工作流运行完成后,结果判读不应只看最终基因列表,而应沿着链条反向检查:原始数据校验和是否与记录一致?样本清单是否与文件名一一对应?工具版本是否与日志一致?设计矩阵是否与分组表一致?阈值参数是否与结果表一致?只有这些检查全部通过,最终结果才具备可追踪、可复现的基础。

在实际项目中,建议把上述检查固化为一个简单的清单,在每次运行结束后逐项确认。这样,工作流就不再是一次性的“黑箱运行”,而是一条每一步都可被观察、记录和重放的透明链条。