如何确保我的模拟结果和论文中的结果始终保持同步?

计算科学 软件 文件 再现性
2021-11-27 20:04:56

在我的一篇论文中,除了一些数字之外,我还列出了一些数值结果。我想做的是确保我论文中的数值结果始终与代码一致。现在,我只是将模拟输出的数值结果直接复制到论文中,这非常简单,技术含量低,但容易出错,因为我可能会错误复制结果,或者忘记将论文结果与代码输出。

有没有一种好方法可以使我在论文中引用的数值结果与我的代码生成的结果保持同步?(在这里,我假设每当我想更新我的论文时,执行代码都很容易且实用。)这些数值结果不一定适合表格形式。有时,我的手稿中有表格,但更常见的是,我将模拟参数列为方程式中的数字。一个例子是这样的:

y=(y1,,yn)

我想用我在模拟中使用的实际参数替换初始条件的元素,该模拟对常微分方程组进行数值积分。使用一个表格来存储像这个例子这样的一次性数据似乎有点矫枉过正,而且墨水比必要的要多。y

我认为数字是一个更简单的情况:每当“构建”文档时(来自 LaTeX 源、Markdown、RST 等),通过执​​行代码开始构建过程。但是,如果人们有更好的建议让我的模拟生成的数字与我的论文保持同步,我很想听听他们的意见。

4个回答

您要的是“可执行论文”的 Elsivier 大挑战。尽管已经尝试了许多方法,但没有一个像作者可能建议的那样令人信服。以下是一些使用的技术示例。

Madagascar Project采用您的方法,在 make 脚本中运行模拟,同时生成图形和纸张。

IPython Notebook提供了一个文档,您可以在阅读和生成您心中的数字时执行该文档。(我见过以相同方式使用的 word 插件、Mathematica 和许多其他解决方案)

VisTrails使用面向服务的架构方法并提供“providence”或“workflow”管理器。基本上,您将挂钩注册到代码,然后设计一个工作流程或实验来重现您的工作。它已用于许多类型的代码,甚至是 HPC 集群。使用这种方法,您将有办法重播实验。

那里有很多这样的解决方案,但我印象深刻的只有这三个。这是一个难题,我相信我们真的还没有接近解决。我们甚至不能让人们在他们的论文中发布他们的代码,我们怎么能指望他们重现结果 =P

正如一些评论所暗示的那样,这种方法长期以来一直在 R 社区中通过构建Sweave以及最近开发的knitr. 显然,这种方法目前具有特定于语言的缺点,但其优点是它经常用于学术论文中。

在实际出版物中使用 Sweave

  • Journal of Biostatistics鼓励这些投稿,并在可重复性编辑器能够运行代码和数据并获得这些结果的学术论文上放置一个风筝标志字母“R”。
  • R-Journal中的所有出版物基本上都是基于 Sweave 构建的。

当然,更常见的 Sweave/knitr 用户只向大多数期刊提交最终输出,个人相信这些方法确实重现了结果。同样,sweave 经常用于为专业演讲等创建幻灯片。

有用的功能

为了在实践中有用,这样的系统应该具有某些特征。拥有大量用户,其中许多在knitr. 几个亮点:

  • 缓存。以必须编译以查看输出的格式(例如 markdown 或 latex)进行编写,使得当结果无法缓存时,包括代码在内的这一点是不可能的。聪明的缓存knitr实际上使得调试密集型代码比在 pure 中工作更容易R,因为没有必要重新运行成功的块。

  • 切换代码显示。在正式出版物中,人们可能不希望任何底层代码在输出中可见。同时,当您希望读者准确地看到您正在输入的内容时,显示以输出格式生成结果的(格式良好、语法高亮的)代码通常很有价值。

  • 社区。与自制解决方案相比,这种方法最引人注目的优势可能是熟悉该模型并试图改进它的人的数量。

  • 在knitr 网页演示中可以找到许多其他功能的不错示例,包括用于“轻量级发布”或在网络上共享的工具。其中许多功能有助于使这种方法与一个人的一般工作流程更加兼容,而不是仅在撰写手稿时才做的事情。

历史脚注。

顾名思义,虽然植根于 Knuth 的“文学编程”,但重点是完全不同的,因为文学编程侧重于连接软件代码和文档(在 R 社区中,这个角色由Roxygen. “文学编程树”)。

超越

原则上,我们可能会对动态文档提出更多要求,例如读者无需编辑和重新编译整个文档即可更改输入和查看输出的能力,例如,使用交互式在线平台。 XDynDocs可能是朝这个方向迈出的一步。

其他方法

  • 可能要关注dexy.it
  • 采用稍微不同的方法:越来越多的经济学论文托管与http://www.runmycode.org/上的出版物相关的代码,这将在云上重新运行分析,并允许自定义输入参数或自定义输入数据。

在使用其他人的解决方案来解决这个问题方面,我并没有取得很大的成功。我通常只想要一些对我有用并完成工作的简单的东西。为此,我通常会尝试编写一个 python 脚本来负责运行所有结果、解析输出以及构建图形/表格。

我编写代码来生成包含某种文本格式结果的数据文件。您可以通过首先测试输出文件的存在来避免在脚本中重新运行这些结果(例如在 python 中使用 os.path.isfile() )。如果要重新运行结果,只需删除数据文件。如果数据文件存在,那么我运行这些文件的解析器。为此,用于正则表达式的 python 模块非常有用(重新)。

然后从解析的输出中创建图形或表格。对于乳胶中的表格,您可以编写代码以将表格生成到单独的文件中(我使用 .tbl 扩展名),然后将其包含到您的乳胶文件中。他们对我来说关键是使用 1 个 python 脚本。如果我有很多,那么我稍后会想知道哪个是哪个以及他们做什么。如果这个描述太模糊,我可以给你一些例子。

在我看来,更重要的是确保你能弄清楚如何在一个月或一年内从头开始重新生成所有结果(例如,当裁判要求你添加或修改某些内容时)。为此,我所做的是包含一个文本文件,其中包含有关如何重现所有结果的非常详细的说明。最好让其他人(如合著者)试用它们来测试它们。我建议您也将这些说明(以及您的所有代码)提供给裁判和读者。

这是一个示例(实际上是由我的合著者 Aron Ahmadia 准备的)。