科学研究的可重复性:实用指南
科学研究的可重复性(Reproducibility)是指独立研究人员在给定相同数据、代码和计算环境的情况下,能够获得相同结果的能力——这一标准由美国国家科学院于 2019 年正式制定,并通过版本控制、容器化和持久标识符等实践来实施。可重复性与可复制性(Replicability)不同,后者需要重新收集数据。
什么是科学研究的可重复性?
科学研究中的可重复性在经常被混淆的一系列相关概念中占有特定的地位。2019 年美国国家科学院的报告《科学中的可重复性与可复制性》(Reproducibility and Replicability in Science)提出了一个已被广泛采用的区别:科学研究的可重复性是指从相同的输入中计算出相同的结果,而可复制性是指通过使用新数据的新研究获得一致的结果。第三个术语“可重复执行性”(Repeatability)描述了同一分析师对相同数据重新运行相同的分析。
对于计算科学家来说,这种分类很重要,因为失效模式不同。无法重复的分子动力学 (MD) 模拟通常是由于环境原因失败的——例如不同的 GROMACS 或 LAMMPS 构建版本、不同的力场参数文件、不同的 GPU 架构或未记录的随机种子。而无法复制的研究则是由于科学原因失败的——例如不同的样本、不同的仪器或无法泛化的真实效应。
这种区别对于记录工作的方式具有实际影响。可重复性要求您捕获整个计算来源链(provenance chain):输入数据、代码版本、依赖项版本、硬件、编译器标志以及执行的命令序列。可复制性则要求您足够详细地描述实验或采样方案,以便其他人可以设计一项等效的研究。
为什么可重复性在实践中会失败
科学研究中的可重复性失败通常集中在少数几个反复出现的原因中,且大多数是琐碎原因而非欺诈行为。了解这些原因是预防它们的第一步。
**环境漂移(Environment drift)**是计算工作中最常见的罪魁祸首。一个在 2021 年正确运行的 Python 分析可能会在 2024 年失败,因为 NumPy 更改了默认行为,或者某个传递依赖项从 PyPI 中被删除,亦或是系统 BLAS 库升级了。代码没有改变,但其底层的环境发生了变化。
Related: — Project-based data-science paths with a guided terminal and real datasets.
未记录的随机性会影响模拟和机器学习。使用 Langevin 或 Andersen 恒温器的 MD 运行会从随机数生成器中取值,而这些种子经常未被记录。一个在统计上看起来相同的轨迹,在几皮秒后可能在每个原子坐标上都有所不同。
隐藏状态和手动步骤——例如乱序执行的笔记本单元、手动编辑的电子表格、在 GUI 中调整的参数——会打破输入和输出之间的链条。如果一个步骤仅存在于某人的记忆中,那么它就是不可重复的。
数据版本控制缺失导致关于哪个数据集生成了哪个图表的歧义。Zenodo 和 Figshare 等公共存储库会为冻结的快照分配 DOI,但许多项目仍然引用可变的 URL 或本地路径。
Worth a look: — One subscription for university-backed Python and data-science certificates.
硬件和数值库的元数据不足比许多研究人员预期的更重要。浮点结果可能因 CPU 架构、GPU 型号甚至编译器优化级别而异,这就是为什么“逐位可重复性”(bit-for-bit reproducibility)比“统计可重复性”更严格的目标。
使工作可重复的核心实践
一个具有可重复性的科学研究计算项目基于几种相互增强的实践。单独使用其中任何一项都不足够,但结合起来可以弥补上述大部分差距。
代码和文本的版本控制
Git 仍然是源代码、分析脚本以及用 Markdown 或 LaTeX 编写的手稿的默认选择。关键的纪律是经常提交(commit)并为与发布结果相对应的版本打标签(tag)。例如 v1.0-paper 这样的标签可以让读者检出某个图表背后的确切代码状态。
依赖关系和环境捕获
环境捕获已相当成熟。Conda 环境文件、带有固定版本的 pip requirements、R 的 renv 以及许多语言生态系统的锁定文件(lockfiles)等工具记录了准确的依赖版本。使用 Docker、Podman 或 Singularity/Apptainer 进行容器化则更进一步,捕获了操作系统、系统库和编译器。对于无法使用 Docker 的 HPC 环境,Apptainer(原 Singularity)是常见选择,因为它无需守护进程即可运行,并能与 Slurm 等调度程序集成。
工作流管理器和来源追踪
Snakemake、Nextflow 和 Make 等工作流管理器对输入和输出之间的依赖图进行编码,因此单个命令即可重新生成每个派生工件。它们还记录了运行了哪些步骤以及运行顺序。为了获得更细粒度的来源追踪,Data Version Control (DVC) 等工具可以在 Git 中同步跟踪数据和模型版本以及代码。
持久标识符和归档
通过 Zenodo、Figshare 或机构存储库使用 DOI 归档快照,可确保确切的工件在实验室网站失效后依然存在。DOI 还为审稿人和未来的读者提供了稳定的引用目标。
参数和种子的文档记录
记录随机种子、恒温器和恒压器设置、积分时间步长、截断半径和力场版本对于 MD 工作至关重要。一个简短的 README 或结构化的元数据文件(例如 JSON sidecar)列出这些值,可以将不透明的轨迹转变为可重复的轨迹。
选择可重复性工具的标准列表
不同的项目对科学研究可重复性的严谨程度要求不同。以下标准可帮助您决定投入多少基础设施。
| 标准 | 轻量化选择 | 重量级选择 |
|---|---|---|
| 环境捕获 | 固定版本的 requirements 文件 | 完整容器镜像 |
| 数据版本控制 | Git LFS 或手动快照 | DVC 或带有 DOI 的数据存储库 |
| 工作流编排 | Shell 脚本或 Makefile | Snakemake 或 Nextflow |
| 来源追踪 | 提交消息和 README | 自动化来源日志 |
| 归档 | GitHub release | Zenodo DOI 快照 |
| 随机性 | 在配置中记录种子 | 带有状态日志的种子 RNG |
权衡很简单:较重的工具会增加设置时间和维护成本,但当项目必须经受人员流动、期刊审查或多年后的复制尝试时,这种投资就会产生回报。单作者的探索性分析很少需要容器;而一个支撑三篇论文和一篇学位论文的实验室流水线通常需要。
分子动力学和数值流水线的可重复性
研究软件工程中的分子动力学提出了一个特别苛刻的可重复性问题,因为结果同时取决于软件和硬件。由于浮点缩减顺序和快速数学(fast-math)优化的差异,相同的 GROMACS 输入文件在不同代 GPU 上可能会产生略有不同的轨迹。
实际的缓解措施包括显式固定随机种子、记录确切的构建版本(编译器、CUDA 版本、SIMD 标志)以及报告结果是逐位可重复还是统计可重复。许多期刊和审稿人接受统计可重复性(误差线内的系综平均值和热力学量)作为 MD 的适当标准,因为跨异构硬件的逐位可重复性通常无法实现。
对于 NumPy 和 HDF5 流水线,类似的问题在于数组排序、dtype 精度和 HDF5 库版本。一个在某台机器上写入 float32 数组并在另一台机器上将其读取为 float64 的流水线可能会悄悄地改变结果。记录 dtype 并在 I/O 边界使用显式转换可以防止此类 bug。
科学研究中的可重复性:标准、期刊和激励措施
对科学研究可重复性的制度压力稳步增长。2016 年在 Scientific Data 上发表的 FAIR 原则(可查找 Findable、可访问 Accessible、可互操作 Interoperable、可重用 Reusable)为数据管理提供了一个被广泛引用的框架。包括 Nature、Science 和许多领域专业期刊在内的出版物现在要求或强烈鼓励提供数据和代码可用性声明。
Center for Open Science 和 ReproNim 项目为可重复的神经影像及其他领域提供培训和工具。由 Alan Turing Institute 维护的 The Turing Way 是一本涵盖跨学科可重复研究实践的社区手册。
激励措施仍然不完善。共享代码和数据需要花费时间,而这些时间在招聘或晋升中很少得到回报,审稿人也很少检查存储库是否能实际运行。尽管如此,NIH 和 NSF 等资助机构越来越多地要求提供数据管理计划,一些期刊现在还聘请了专门的可重复性审稿人来执行提交的代码。
常见的反对意见和诚实的警告
可重复性的倡导者有时会夸大科学研究可重复性的目标。有几点诚实的警告值得说明。
逐位可重复性并不总是可以实现或必需的。 在异构硬件中,浮点非确定性是客观事实。现实的目标是具有记录公差的统计可重复性。
专有软件和许可数据限制了可共享的内容。 当工具或数据集无法重新分发时,记录版本、参数和访问程序是目前最好的替代方案。
可重复性并不保证正确性。 一个有 bug 的分析也可以是完美可重复的。可重复性是值得信赖的科学的必要条件,但非充分条件。
开销是真实存在的。 将一个小脚本容器化可能比分析本身花费的时间还长。请根据工作的重要程度和预期寿命来匹配投资。
关键要点
- 可重复性是指从相同的数据、代码和环境中获得相同的结果;可复制性是指从新数据中获得一致的结果——美国国家科学院于 2019 年正式确定了这一区别。
- 环境漂移、未记录的随机性、隐藏的手动步骤和缺失的元数据是导致计算科学研究可重复性失败的主要原因。
- 版本控制、固定依赖项、容器、工作流管理器和 DOI 归档快照构成了核心工具包;请选择与项目重要程度相匹配的严谨程度。
- 分子动力学和数值流水线面临依赖硬件的非确定性,因此具有记录公差的统计可重复性通常是现实的标准。
- FAIR 原则、期刊数据可用性政策和资助者要求正在稳步提高对共享、可运行工件的基线期望。
资料来源与进一步阅读
- Scientific method — Wikipedia:科学方法是一种通过仔细观察、严格怀疑、假设检验和实验验证来获取知识的经验方法……
常见问题
什么是科学研究的可重复性?
科学研究中的可重复性是指能够从相同的数据、代码和计算环境中重新计算研究结果的能力。它与可复制性不同,可复制性涉及收集新数据并测试发现是否具有普遍性。2019 年美国国家科学院的报告将该术语确立为科学研究可重复性的广泛使用标准。
可重复性与可复制性有何不同?
可重复性关注相同的输入产生相同的输出,通常用于计算工作。可复制性关注当使用新数据或新样本重复研究时,发现是否依然成立。两者都很重要,但它们失败的原因不同,且需要不同的文档记录。
哪些工具有助于使计算研究具有可重复性?
常用工具包括用于版本控制的 Git、用于捕获依赖项的 Conda 或 pip 锁定文件、用于容器化的 Docker 或 Apptainer、用于工作流编排的 Snakemake 或 Nextflow、用于数据版本控制的 DVC,以及用于 DOI 归档快照的 Zenodo 或 Figshare。正确的组合取决于项目规模和预期寿命。
为什么分子动力学很难精确重复?
分子动力学取决于随机种子、力场版本、积分设置和特定于硬件的浮点行为。不同的 GPU 代和编译器优化可能会改变缩减顺序,因此跨机器的逐位可重复性通常无法实现。在记录的误差线内实现统计可重复性是实用标准。
期刊要求提供可重复的代码和数据吗?
许多期刊(包括 Nature 和 Science)要求或强烈鼓励提供数据和代码可用性声明,有些期刊还聘请了可重复性审稿人。要求因出版商和领域而异,因此在提交前请检查特定期刊的政策。NIH 和 NSF 等资助机构也越来越多地要求提供数据管理计划。
可重复的研究仍然可能出错吗?
是的。可重复性确保分析可以被重新执行,而不是确保它是正确的。一个有缺陷的方法或有 bug 的脚本也可以是完美可重复的。可重复性是值得信赖的科学的必要基础,但必须与合理的方法论和同行评审相结合。
Frequently asked questions
什么是科学研究的可重复性?
科学研究中的可重复性是指从相同的数据、代码和计算环境中重新计算研究结果的能力。它与可复制性不同,可复制性涉及收集新数据并测试发现是否具有普遍性。 2019 年美国国家科学院报告将该术语确立为广泛使用的科学研究再现性标准。
再现性与可复制性有何不同?
再现性涉及相同的输入产生相同的输出,通常在计算工作中。可重复性涉及当使用新数据或新样本重复研究时,结果是否成立。两者都很重要,但它们因不同的原因而失败,并且需要不同的文档。
哪些工具有助于使计算研究具有可重复性?
常见工具包括用于版本控制的 Git、用于捕获依赖项的 Conda 或 pip 锁定文件、用于容器化的 Docker 或 Apptainer、用于工作流程编排的 Snakemake 或 Nextflow、用于数据版本控制的 DVC 以及用于 DOI 存档快照的 Zenodo 或 Figshare。正确的组合取决于项目规模和预期寿命。
为什么分子动力学很难精确再现?
分子动力学取决于随机种子、力场版本、积分设置和特定于硬件的浮点行为。不同的 GPU 代和编译器优化可能会改变缩减顺序,因此跨机器的按位再现性通常是无法实现的。记录误差线内的统计再现性是实用标准。
期刊是否需要可重复的代码和数据?
许多期刊,包括《自然》和《科学》,都要求或强烈鼓励数据和代码可用性声明,有些期刊还雇用可重复性审稿人。要求因出版商和领域而异,因此在提交前请检查特定期刊的政策。 NIH 和 NSF 等资助者也越来越需要数据管理计划。
可重复的研究还会出错吗?
是的。再现性确保分析可以重新执行,而不是确保分析是正确的。有缺陷的方法或有问题的脚本可以完美地重现。可重复性是值得信赖的科学的必要基础,但它必须与合理的方法论和同行评审相结合。
Learn Python by coding in your browser
Interactive Python and data-science courses you code directly in the browser