跳转到主要内容
ActivePapers 将您的数据存储为可重新计算的文档,确保任何发布的结果均可重新运行、验证并永久保存。

本站部分链接为联盟营销链接:如果您通过这些链接购买,我们可能会获得佣金,且不会增加您的成本。这绝不会影响我们的推荐建议。详情请参阅我们的联盟披露声明。 联盟营销披露.

研究不可重复?实用指南

当一个独立的小组在给定相同的数据、代码和所描述的方法的情况下无法获得相同的结果时,就会出现不可重复的研究,这是跨学科记录的问题,计算科学家可以直接解决,因为软件(而不是湿实验室技术)通常是失败点。 2019 年美国国家科学院报告科学中的再现性和可重复性等标准定义了工作词汇,而实际的修复则是具体的:版本控制、固定依赖项、容器化和构建自动化。

  • 再现性和可复制性是不同的:再现性意味着对“相同”数据重新运行“相同”分析并获得相同的数字;可复制性意味着新的研究得出一致的结论。
  • 大多数计算研究无法重现四个原因:缺失或变异的代码、未固定的软件环境、未记录的数据来源和隐藏的手动步骤。
  • 可重现构建是从源输入到输出的确定性转换 - 与应用于分析管道的软件打包中的可重现构建相同的想法。
  • 最小可行的修复是一个带有锁定文件的存储库、单个入口点(“make”、Snakemake 或脚本)以及一个陌生人可以遵循的自述文件,而无需询问您问题。
  • 容器(Docker、Apptainer/Singularity、Conda 环境)解决环境漂移问题;它们不解决未记录的数据清理或不确定性算法。
  • 可重复性是一个范围,而不是二元——目标是“一个有能力的陌生人可以重新生成你的图表”,而不是完美。

“可重现”的实际含义是什么(以及它不是什么)

可重复研究是打包研究的实践,以便独立研究人员可以从原始数据和代码中重新生成其结果。这个词具有与日常用法不同的特定技术含义:在字典意义上,“可再现”仅仅意味着能够再次产生,但在计算科学中,它意味着决定论、出处和足够的文档,表明再生不依赖于原始作者所持有的隐性知识。

研究中的再现性属于经常被混淆的一系列相关术语。 2019 年美国国家科学院共识研究将计算再现性(相同的数据、相同的代码、相同的结果)与可复制性(新数据、一致的发现)区分开来。统计学家增加了可重复性,这意味着同一位分析师两次得到相同的结果。一项研究可以是可重现的,但不可复制——代码忠实地重新生成了新实验未能确认的结果——这种区别在诊断故障时很重要。

变体拼写“reproducable”经常出现在搜索查询和非正式写作中,但标准英语使用“reproducible”。后缀以“-ible”的形式附加到词根“reproduce”上,对应于“producible”和“deducible”。风格指南和词典只列出“reproducible”;将“reproducable”视为拼写错误,即使您会在旧论坛帖子和非母语英语手稿中遇到它。

为什么研究不可重复:四种失败模式

代码缺失或变异是导致复制尝试失败的主要原因。常见情况:已发表的文章描述了一项分析,通讯作者已离开实验室,并且存储库不存在、包含过时的版本或引用了私有数据集。 “在我的机器上运行”但没有版本历史记录的代码无法审核,并且如果没有提交哈希,就无法知道哪个版本生成了已发布的图表。

未固定的软件环境会默默地阻碍重现。使用版本 1.20 编写的 NumPy 管道可能会在 2.x 下产生不同的浮点结果、弃用警告或彻底错误。当编译器标志、FFT 库或并行分解发生变化时,使用一种 GROMACS 或 LAMMPS 构建生成的分子动力学轨迹可能与另一种不同。解决方法是保存确切的版本——带有哈希值的“requirements.txt”、“conda env export”、R 的“renv.lock”或容器镜像摘要——而不仅仅是包名称列表。

Related: — Project-based data-science paths with a guided terminal and real datasets.

未记录的数据来源是第三种故障模式。原始仪器输出、仿真重启文件和 HDF5 存档通常会经历多个清理和转换步骤,这些步骤从未在方法部分中显示。如果协作者手动过滤电子表格中的异常值,则此步骤是不可见且不可重现的。来源意味着记录每个输入的来源、应用的转换以及转换的顺序。

隐藏的手动步骤是第四个。单击 GUI 导出绘图、手动重命名文件或在工具之间复制数字都会破坏自动化。测试很简单:一个从未见过你的人可以在不打电话的情况下端到端地运行你的管道吗?如果答案是否定的,那么手动步骤就是问题所在。

如何使研究具有可重复性:实用的工作流程

版本控制是基础。 Git(或现有项目的 Mercurial)跟踪对代码、手稿和小型配置文件所做的每个更改。尽早提交,撰写有意义的提交信息,并标记与提交的文章匹配的确切提交。对于大型二进制工件(轨迹、HDF5 文件、经过训练的模型权重),请使用带有 DOI 的 Git LFS、DVC 或 Zenodo/figshare 存储库,而不是向存储库提交千兆字节。

Worth a look: — One subscription for university-backed Python and data-science certificates.

接下来是固定依赖项。 Python 项目必须提供锁定文件(pip-compile、Poetry 或 uv); R项目应该使用“renv”; Julia 项目有“Project.toml”和“Manifest.toml”。固定传递依赖项,而不仅仅是直接依赖项,因为三个级别的深度变化可以改变数字输出。记录影响结果的操作系统、编译器和任何特定于硬件的库(BLAS、CUDA)。

单个入口点将脚本文件夹转变为管道。经典的工具是“make”:“Makefile”声明目标、依赖项和命令,“make”仅重建更改的内容。这是使用 Make 进行可重复研究的本质——构建图记录工作流程并强制执行顺序。现代替代方案包括 Snakemake、Nextflow 和 Targets(针对 R)。这些工具都优于自述文件,其中写着“运行 script1.py,然后 script2.py,然后…”。

容器化捕获整个环境。 Docker 镜像、Apptainer/Singularity 镜像(在 Docker 不可用的 HPC 集群上很常见)和 Conda 环境都解决了环境漂移问题。具有固定摘要的容器是您的分析在笔记本电脑、集群和审阅者计算机上以相同方式运行的最有力保证。权衡是镜像大小和构建时间;精益的基础镜像和多阶段构建使两者都易于管理。

文档又回到了原点。自述文件应指出软件要求、重现每个图形的确切命令、预期执行时间和预期结果。 “CITATION.cff”文件或“codemeta.json”可帮助其他人正确引用软件。当某个步骤真正具有交互性时,请对其进行足够具体的描述,以便读者可以重复它。

R 的可重复研究:具体示例

R 拥有最成熟的可重复性生态系统之一,这就是为什么“R 中的可重复性研究”是一个常见的搜索。 renv 包将包版本快照到锁定文件中,因此 renv::restore() 会重建项目开发所针对的确切库。 R Markdown 和 Quarto 将代码、输出和散文编织成一个文档,该文档在编织时会重新生成,从而消除分析和手稿之间的复制粘贴错误。

最小的 R 项目结构如下所示:用于依赖项的“renv.lock”、用于函数的“R/”目录、用于摄取脚本的“data-raw/”目录、用于处理对象的“data/”目录以及用于协调构建的“Makefile”或“_targets.R”。 targets 包将 make 式的依赖跟踪扩展到 R,跳过输入未更改的步骤。如需更深入的处理,Christopher Gandrud 的《Reproducible Research with R and RStudio*》一书是标准参考书,Roger Peng 的《数据科学 R 编程》和约翰霍普金斯大学的可重现性课程材料涵盖了从开始到结束的工作流程。

Related: — A deep technical library of scientific-computing books, videos and live training.

同样的原则也适用于 Python。具有固定依赖项的“pyproject.toml”、“Makefile”或 Snakemake 工作流程以及 Quarto 或 Jupyter Book 手稿为您提供了相当于 R 堆栈的功能。工具不同;纪律没有。

什么是可重复构建?

可重复构建是一种软件工程实践,其中使用相同的工具链编译相同的源代码会产生逐字节相同的二进制文件。这个概念起源于自由软件世界——Debian 和 Tor 项目开创了它——现在是由 Reproducible Builds 项目维护的正式标准。动机是信任:如果任何人都可以重建二进制文件并获得相同的哈希值,他们就可以验证分布式二进制文件是否与发布的源匹配并且不包含隐藏的修改。

与科学管道的类比是直接的。可重复的分析构建采用源输入(原始数据、代码、配置)并确定性地生成输出(图形、表格、统计数据)。不确定性打破了这一点,使得研究不可重现:随机种子不固定、以不同顺序求和的并行归约、输出文件中嵌入的时间戳以及依赖于线程计数的浮点运算都会导致运行之间的变化。修复种子、在缩减之前排序以及剥离时间戳是标准补救措施。

If you are shopping: — Interactive Python and data-science courses you code directly in the browser.

并非所有非决定论来源都可以消除。由于不同的浮点舍入,采用 GPU 加速的分子动力学可能会在不同的硬件上产生略有不同的轨迹,而蒙特卡罗方法本质上是随机的。诚实的方法是记录预期的变化,报告它,并确保科学结论对其是稳健的——而不是声称您无法提供的位级身份。

判断研究是否可重复的标准

标准弱强
代码可用性“可根据要求提供”带有标记版本和 DOI 的公共存储库
环境仅包名称锁定文件或带有固定摘要的容器
切入点编号脚本,手动排序make、Snakemake 或 targets 工作流程
数据来源方法段记录的摄取脚本和校验和
决定论无种子随机性固定种子,记录预期变化
文档假设作者具备相关知识陌生人可以重新生成每个图表

在提交之前将其用作自我审核,以确保您的研究并非不可重复。大多数期刊和资助者现在都要求提供数据和代码可用性声明,其中一些期刊(包括一些 AGU、PLOS 和 Nature 旗下期刊)要求将代码存放在带有 DOI 的存储库中。遇到“强”专栏越来越成为发表的条件,而不是加分项。

常见的反对意见和诚实的权衡

时间成本是最常被提及的反对意见,而且这是真实的。对于一个已经“完成”的项目来说,正确包装管道可能需要几天的时间。反驳的观点是,“不”这样做的成本是后来付出的,通常是由学生或合作者花费数周时间对分析进行逆向工程来支付的。务实的中间路径:立即投资于版本控制和锁定文件,并且仅容器化您希望其他人重用的项目。

敏感或受限数据使共享变得困难。临床、专有和某些仪器数据不能公开发布。在这些情况下,可重复性意味着发布代码、模式和合成或去识别化的样本,以及访问过程的清晰描述。目标是具有合法访问权限的合格研究人员可以重新生成结果。

遗留代码是另一个限制。 20 世纪 90 年代的 Fortran 和 C 模拟可能无法在没有补丁的现代系统上编译。使用旧工具链将它们包装在容器中通常比重写它们更容易,并且它保留了原始数字。记录您应用了哪些补丁以及原因。

最后,可重复性并不等于正确性。管道可以完美地重现,但仍然是错误的——忠实重现的错误仍然是错误。可重复性是审查的先决条件,而不是替代品。同行评审、独立重复和敏感性分析仍然是必要的,以确保研究不会仅在错误中重复。

常见问题

研究不可重复是什么意思?

当独立研究人员使用相同的数据和代码无法重新生成已发表的结果时,研究就不可重复。原因通常是缺少代码、未固定的软件环境、未记录的数据处理或从未自动化的手动步骤。这是研究产物的属性,而不是对原作者诚实性的判断。

再现性和可复制性有什么区别?

再现性意味着对相同的数据重新进行相同的分析并获得相同的结果。可重复性意味着进行新的研究——新数据、新样本——并得出一致的结论。 2019 年美国国家科学院报告将这些概念视为独立的概念,一项研究即使无法被复制,也可以是可再现的。

如何使我的研究具有可再现性?

从版本控制 (Git) 开始,并标记与您的文章相对应的提交。使用锁定文件或容器映像固定依赖项。提供单个入口点,例如“Makefile”、Snakemake 或“targets”工作流程。在自述文件中记录数据来源和预期结果。提交之前在干净的机器上测试所有内容。

“reproducable”是正确的拼写吗?

不。标准英语拼写“reproducible”这个词,由“reproduce”加上后缀“-ible”组成。字典和风格指南仅列出“reproducible”。变体“reproducable”出现在非正式写作和一些非英语母语文本中,但在正式科学写作中不被接受。

科学计算中的可重复构建是什么?

可重复构建是从相同输入产生相同输出的构建,这是由软件打包的可重复构建项目正式制定的标准。在科学中,同样的原理也适用于分析流水线:固定随机种子、确定性约简和固定工具链允许准确地重新生成结果。当硬件相关的浮点变化不可避免时,请记录预期范围。

再现性是否需要共享我的所有数据?

并非总是如此。可以通过发布代码、模式和合成样本以及记录的访问程序来处理受限数据、临床数据或专有数据。许多资助者和期刊需要数据可用性声明而不是开放数据。测试的是具有合法访问权限的合格研究人员是否可以重新生成您的结果。

进一步阅读和工具

美国国家科学院的《科学的再现性和可重复性》(2019 年)是研究不可再现时的权威概念参考。 Reproducible Builds 项目记录了软件工程标准。有关工作流工具,请参阅 GNU Make、Snakemake、Nextflow、“targets”、“renv” 和 Quarto 的文档。图灵之路是一本开放的社区手册,涵盖跨学科的可重复研究实践,软件可持续性研究所为研究软件工程师发布了实用指南。

Frequently asked questions

当研究不可重复时意味着什么?

当独立研究人员使用相同的数据和代码无法重新生成已发表的结果时,研究就不可重复。原因通常是缺少代码、未固定的软件环境、未记录的数据处理或从未自动化的手动步骤。这是文物的属性,而不是对原作者诚实性的判断。

再现性和可复制性有什么区别?

再现性意味着对相同的数据重新进行相同的分析并获得相同的结果。可重复性意味着进行新的研究——新数据、新样本——并得出一致的结论。 2019 年美国国家科学院报告将这些概念视为独立的概念,一项研究即使无法重复,也可以重复。

如何使我的研究具有可重复性?

从版本控制 (Git) 开始,并标记与您的文章相对应的提交。使用锁定文件或容器映像固定依赖项。提供单个入口点,例如“Makefile”、Snakemake 或“目标”工作流程。在自述文件中记录数据来源和预期结果。提交之前在干净的机器上测试所有内容。

“可重现”的拼写正确吗?

不会。标准英语拼写“reproducible”这个词,由“reproduct”加上后缀“-ible”组成。字典和风格指南仅列出“可复制”。变体“可再现”出现在非正式写作和一些非英语母语文本中,但在正式科学写作中不被接受。

科学计算中的可重复构建是什么?

可重复构建是从相同输入产生相同输出的构建,这是由软件打包的可重复构建项目正式制定的标准。在科学中,同样的原理也适用于分析管道:固定随机种子、确定性约简和固定工具链允许准确地重新生成结果。当硬件相关的浮点变化不可避免时,请记录预期范围。

再现性是否需要共享我的所有数据?

并非总是如此。可以通过发布代码、模式和合成样本以及记录的访问程序来处理受限数据、临床数据或专有数据。许多资助者和期刊需要数据可用性声明而不是开放数据。测试的是具有合法访问权限的合格研究人员是否可以重新生成您的结果。进一步阅读和工具 美国国家科学院的《科学的再现性和可复制性》(2019)是当研究不可再现时的权威概念参考。 Reproducible Builds 项目记录了软件工程的立场


Learn Python by coding in your browser

Interactive Python and data-science courses you code directly in the browser