除了产生错误结果外,科学编程中最糟糕的恐惧之一是无法重现所生成的结果。哪些最佳实践有助于确保您的分析是可重复的?
除了产生错误结果外,科学编程中最糟糕的恐惧之一是无法重现所生成的结果。哪些最佳实践有助于确保您的分析是可重复的?
前两点非常重要,因为使数据集可用允许其他人对相同的数据执行自己的分析,从而提高对自己分析的有效性的信心水平。此外,将数据集在线提供--尤其是如果使用链接数据格式--使网络爬虫能够将您的数据集与其他数据集聚合在一起,从而使大型数据集的分析成为可能 ... 在许多类型的研究中,样本大小有时太小,无法对结果产生真正的信心...但共享您的数据集可以构建非常大的数据集。或者,有人可以使用您的数据集来验证他们对其他数据集执行的分析。
此外,使您的代码开源使同行可以审查代码和过程。通常这种审查会发现缺陷或其他优化和改进的可能性。最重要的是,它允许其他研究人员在不必从头开始实施您已经完成的所有工作的情况下改进您的方法。当研究人员可以专注于改进而不是重新发明轮子时,研究的速度大大加快。
关于随机化...许多算法依赖于随机化来实现它们的结果。随机和蒙特卡罗方法非常常见,尽管已经证明在某些情况下会收敛,但仍有可能得到不同的结果。确保获得相同的结果的方法是,在您的代码中循环调用计算一定次数,并选择最佳结果。如果使用足够的重复次数,您可以期望找到全局或接近全局最优解,而不是陷入局部最优解。另一个可能性是使用预定的种子,尽管这不是我认为最好的方法,因为您可能会选择导致您陷入局部最优解的种子。此外,没有保证不同平台上的随机数生成器将针对该种子值生成相同的结果。
我是一名软件工程师,嵌入在一个地球物理研究团队中,我们一直在努力提高在需求时重现结果的能力。以下是我们从经验中获得的一些要点:
我们目前正在开发一个工作流系统,将记录每个作业运行的细节:使用的输入数据集(包括版本)、输出数据集、程序(包括版本和变体)、参数等,也就是所谓的溯源。一旦这个系统投入使用,唯一发布结果的方式就是使用工作流系统。任何输出数据集都将包含其自身的溯源详情,但我们还没有对此进行详细设计。
我们对于重现数字结果的最低有效数字相当宽松(也许有点太宽松了)。我们工作的基础科学以及基本数据集测量误差不支持超过2或3个有效数字的任何数字结果的有效性。
我们肯定不会为同行评审发布代码或数据,我们在石油业务中。
已经有很多好的建议了。我会加上一些(都是从痛苦的经验中得出的——在发布之前,谢天谢地!)
如果不稳定,那么工作还没有结束。
发表上述测试的结果(或者至少保留证据并提到你已经进行过测试)。
是的,你可能会在小样本中开发方法,然后处理整个混乱的数据。在这个过程中也要时不时地查看中间结果。更好的方法是,在可能的情况下收集中间步骤的统计数据,并寻找其中的异常迹象。
同样,如果有任何意外,你就必须回头重新做。
再次,保留和/或发表这些信息。
已经提到过的一些我喜欢的东西包括
还有一个没有人提到的:
是的,你正在忙于编写代码,可能在进行设计。但我的意思并不是详细的文档,而是对所有意外情况的解释。你无论如何都需要把这些东西写下来,所以认为这是在论文上先行一步。你可以将文档保存在源代码控制中,以便随时丢弃不再适用的部分,如果需要,可以重新获取。
建立一个小小的README文件,包含构建说明和“如何运行”的简介,这样也不会有坏处。如果你要公开代码,人们会问这些问题...另外,对我来说,回头查看这些信息有助于我保持在正确的轨道上。
发布程序代码,使其可以被审查。
这并不是针对你的意思,但这是我的抱怨:
如果你从事由纳税人资助的工作,如果你在同行评议的期刊上发表结果,提供源代码,采用开放源代码许可证或公共领域。我已经厌倦了读到关于某个人想出的伟大算法的文章,他们声称该算法能做到x,但没有提供验证/检查源代码的方法。如果我看不到代码,我就无法验证你的结果,因为算法实现可能存在非常大的差异。
在我看来,将由纳税人支付的工作置于同行研究人员之外是不道德的。在推动论文的同时,却没有为公众提供可用工作方面的实际利益,这是违背科学精神的。
以某种方式记录配置参数(例如,如果您可以将某个变量设置为某个值)。这可以在数据输出中或版本控制中完成。
如果您经常更改程序(我是!),请确保记录您正在使用的程序版本。