跳到正文
百沐一下百沐一下
本节目录

可复现方法拆解

跟完这篇,您能拿一篇论文的方法部分(Methods),把它逐句拆成一份能照着做的分析步骤清单,给每一步标出「能不能复现」,并把作者没写清的窟窿单独列成一张明确的缺信息清单——而不是读完一遍云里雾里,动手时处处卡壳。

复现一段分析,最难的往往不是跑代码,而是读懂论文到底做了什么、又漏说了什么。方法部分常常一句话带过好几步,参数藏在附录里,版本号只字未提。这篇不绑定某一种分析,教您一套通用的拆解办法:把一段文字变成一串动作,再逐个动作判断底气够不够。

先把 Methods 逐句拆成动作

动手之前,先把方法部分从头到尾读一遍,边读边把每一句话翻译成一个具体动作:这一步做什么、吃什么输入、吐什么输出、用什么工具。别急着理解「为什么」,先把「做了什么」按顺序抄下来。

建议做成一张表,一行一个动作。以一段常见的转录组方法描述为例,拆出来大致是这样:

顺序论文原话(示意)拆成的动作输入 → 输出工具
1reads were aligned to GRCh38比对到参考基因组fastq → bam未写明
2gene-level counts were quantified按基因统计 read 数bam → counts 矩阵featureCounts?
3differential expression was assessed跑差异分析counts → 差异表DESeq2
4genes with padj < 0.05 were considered significant按阈值筛差异基因差异表 → 显著基因阈值筛选
5a volcano plot was generated画火山图差异表 → 图未写明

拆的时候把握三点:

  1. 一句话可能藏着好几步。 「reads were processed and aligned」其实包含去接头、质控、比对至少三步,别让它们挤在一行里。
  2. 把工具那一列如实填「未写明」。 拆解阶段不要脑补,作者没说用什么就空着或打问号——这些问号正是下一步要评估的重点。
  3. 顺着数据流走。 每一步的输出,应该正好是下一步的输入。如果两步之间的数据形态对不上,多半是中间漏抄了一步。

给每一步标一个可复现等级

动作清单列完,逐行给它评一个「可复现等级」。判断标准很朴素:照着论文写的,您能不能不猜就把这一步做出来。 分三档就够用:

等级含义判断依据
🟢 可直接复现照抄就能做数据可得、工具与版本明确、关键参数写全
🟡 缺参数、可按惯例补主体清楚,个别信息要补工具明确但漏了某个参数,能用公认默认值补上并注明
🔴 信息不全、无法忠实复现照论文做不出来数据不公开、关键步骤没写、或用了未公开的自研脚本

把上一节那张表加一列,逐行打分。评完您会得到一张清晰的「地形图」:绿的照做,黄的补默认值并记一笔,红的单独拎出来重点处理。

几条打分时的经验:

  • 「未写明工具」不必然是红灯。 如果这一步有唯一的行业标准做法(比如「按基因统计 read 数」几乎都用 featureCounts 或 HTSeq),可以标黄,选一个主流工具并注明这是您的假设。
  • 阈值缺失多数是黄灯。 padj < 0.05|log2FC| > 1 这类是文献里的常用惯例,作者没写您也能按惯例补——但要清楚这是惯例、按数据调、不是铁律,且要写明您补的是哪一套。
  • 数据拿不到,直接红灯。 再清楚的方法,没有数据也复现不了。数据可得性是所有绿灯的前提,下一节专门盘它。

盘点数据与代码能不能拿到

复现能不能起步,先看两样东西到底公不公开:数据代码。论文里通常各有一段专门的声明,先把它们找出来。

数据可得性(Data availability)。 一般在正文末尾或附录,找里面的登录号(accession),它决定您去哪儿取数据:

登录号形态对应数据库说明
GSExxxxxGEO转录组等,常附处理好的表达矩阵
PRJNAxxxxx / SRRxxxxxSRA原始测序 reads(fastq)
E-MTAB-xxxxArrayExpress表达数据
PXDxxxxxPRIDE蛋白质组质谱数据
EGAxxxxxEGA受控访问,需申请授权

看到 GSE 编号,优先去它页面底部找 Supplementary file 里有没有现成的表达矩阵——有的话能跳过比对定量,复现难度骤降。怎么找、怎么下,见 GEO 数据库检索入门

代码可得性(Code availability)。 越来越多论文会给一个代码仓库,有它复现事半功倍。留意这几样,价值从高到低:

  1. 完整仓库 + 环境文件:GitHub 链接里若带 Dockerfileenvironment.yml(conda)、renv.lock(R)或 Snakemake/Nextflow 流程文件,说明作者把环境也固化了,这是最理想的情况。
  2. 只有脚本、没有环境:能看懂流程和参数,但版本要自己对齐,标黄。
  3. 写着「code available upon request」:等于暂时没有,标红,能否拿到看后续联系。

一句务实的话:能用作者公开的数据和代码,就别自己从零重搭。 复现的价值在于验证结论,不在于炫技。作者铺好的路,走就是了。

把关键参数一项项抠出来

绿灯和黄灯的步骤,接下来要把能左右结果的参数一项项抠出来,抄进一张「参数清单」。方法部分写参数往往东一句西一句,甚至塞在图注和附表里,要主动去翻。

常见且要紧的几类:

参数类别举例漏了会怎样
参考版本GRCh38 vs GRCh37、Ensembl release 号基因 ID 与表达量对不上,是复现失败的高发根源
软件与版本DESeq2 1.40.x、Seurat v5不同版本默认行为可能变,结果有出入
分组与比较方向treated vs. control,谁是对照方向写反,上下调整体镜像
筛选阈值padj < 0.05、`log2FC
过滤 / 质控标准低表达过滤、线粒体比例上限保留的特征不同,下游全变
关键开关是否做 lfcShrink() 收缩、是否校正批次影响数值范围与显著性

抠参数时提醒两点:

  • 阈值要照抄、别优化。 复现阶段忠实还原比「跑得更好」重要,作者用 padj < 0.05 您就用 0.05。这些阈值是常用惯例、按数据调、不是铁律,但判断它合不合理是原作者的事,不是复现要解决的问题。
  • p < 0.05 到底指校正前还是校正后,务必抠清。 有的论文写 p 其实指 padj,口径差一个字,显著基因数量级就变。拿不准时以「校正后」为准更稳妥,并在复现说明里注明您的选择。

缺信息的地方怎么办

抠到最后,总有些窟窿:某个参数没写、某步工具没提、某个样本被剔除却没说清。把这些单独列成一张缺信息清单——这是这篇的核心产出之一,它让「哪里靠猜」一目了然。

缺什么影响大小处理办法
低表达过滤的具体阈值按惯例(如 counts 行和 ≥ 10)补,注明是假设
是否做了 log2FC 收缩两种都试,看哪种更贴原图,记下选择
参考注释的确切 release 号中高用论文提到的基因组版本对应的常见 release,注明
剔除了哪些样本核对样本数;对不上时回查附表 characteristics
自研脚本、未公开无法忠实复现,只能按方法描述近似,明确标注

处理缺信息的三条原则:

  1. 能按惯例补的,补上并明确注明是假设。 别把猜测当成论文原文,每一处「我补的」都要留痕,方便别人(和将来的您)分辨。
  2. 影响大的窟窿,考虑联系作者。 通讯作者邮箱通常在文末。礼貌问清一两个关键参数,常常比自己反复试更省时。
  3. 补不上的,就诚实写「无法复现这一步」。 这不是失败。把边界讲清楚——「因缺少 X,此步按 Y 惯例近似」——本身就是有价值、负责任的产出。

关于数据本身残缺、信息不全时的更多应对,见 数据不全怎么办

按依赖顺序重排成能跑的流程

评级、抠参、补窟窿都做完,最后把动作清单按依赖顺序重排成一条能跑的流程。原则很简单:每一步只依赖它前面已经产出的东西。

推荐把流程拆成编号的模块,一个脚本干一件事,中间产物落盘。这样任何一步出问题,能从那一步重跑,不必从头再来:

# 按编号顺序执行,每步读上一步的产物、写自己的产物
Rscript 01_download.R     # 取数据 → data/counts.tsv
Rscript 02_qc.R           # 质控过滤 → data/counts_filtered.tsv
Rscript 03_diff.R         # 差异分析 → results/deg.csv
Rscript 04_figure.R       # 出图 → figures/volcano.pdf

每个脚本内部保持「读入 → 处理 → 写出」的清爽结构,把抠出来的参数集中放在开头,方便核对与调整:

# 03_diff.R —— 差异分析这一步

# ——— 参数区:全部照论文抄,缺的按惯例补并注明 ———
p_cut   <- 0.05   # 论文原文
lfc_cut <- 1      # 论文原文
ref_lvl <- "control"   # 论文的对照组

counts  <- read.csv("data/counts_filtered.tsv", ...)   # 读上一步产物
# …按论文口径跑差异…
write.csv(res, "results/deg.csv")                       # 写出,供下一步用

差异分析这一段的完整口径(建对象、跑流程、读结果、定阈值),见 DESeq2 差异表达分析怎么做对。一个具体到底的复现实例——从取数据到复刻火山图——见 跟着论文复现一张火山图

记下环境,写清偏差

流程能跑通之后,别忘了做两件让复现「站得住」的收尾:记录环境写清偏差

记录环境。 把您用的软件版本固化下来,既方便自己回溯,也是将来别人复现您结果的依据:

sessionInfo()        # 记下 R 与 DESeq2、ggplot2 等的版本号
# 若用 renv 管理依赖,可一并锁定
# renv::snapshot()   # 生成 renv.lock,精确固化每个包的版本

写清偏差。 把您和论文不一致的地方,逐条记成一份简短说明:哪些参数是照抄的、哪些是按惯例补的、哪些步骤因缺信息做了近似。这份说明和缺信息清单合在一起,就是您这次复现的「诚实档案」。

最后摆正对「复现」的期待:

复现追求的是趋势一致、结论可重现,不是像素级、小数点级的完全相同。尤其从原始 fastq 出发想和几年前的论文分毫不差,往往做不到——当年的软件版本、参考注释可能已难完整还原。只要主要结论能重现、差异能解释清楚,就是成功。

区分两个常被混用的词也有帮助:**复现(reproduce)**是用原数据、原方法得到一致结果;**重复(replicate)**是用新数据验证同一结论。这篇讲的是前者——把一篇论文的方法忠实地走一遍,并诚实标出哪里走不通。

在平台上跑一遍

上面这套「拆方法 → 评等级 → 抠参数 → 补窟窿 → 重排流程」,在 百沐一下 不写代码也能落地:把论文的方法段落和拿到的数据交给平台,用一句话说清「按 treated vs. control 跑 DESeq2、阈值照论文用 padj<0.05 且 |log2FC|>1」,平台会零代码替您跑完,并连同可复现的代码与用到的包版本一起交付,方便您和原文逐项比对,把「哪里对上了、哪里靠假设」看得清清楚楚。完整流程见 组学智能体 · 使用指南

相关