在每个代码块之前或每个项目一次设置种子?


12

标准建议是设置一个随机种子,以便可以重现结果。但是,由于种子是随着伪随机数的绘制而前进的,因此,如果任何一段代码绘制了一个额外的数字,则结果可能会发生变化。

乍一看,版本控制似乎是一种解决方案,因为当您将结果记录在便笺或纸上时,它至少可以让您返回并重现现有的版本。但是,由于只需要抽奖就可以解决问题,因此,如果更新R,结果也可能会更改。

我意识到这可能仅在极少数情况下是有问题的,但是我很好奇这里是否有最佳实践。这是我在自己的工作中一直在努力的事情。

Answers:


8

这取决于您将如何运行代码或是否存在某种程度上是随机的代码,因为它会以随机方式绘制随机数。(这种情况的一个示例是我们的素食主义者软件包中的置换测试,在该置换测试中,我们仅继续置换,直到我们积累了足够的数据,才能知道结果是否不同于所陈述的Type I错误并考虑到Type II错误率。)不应该影响抽奖...

如果最终脚本只能作为批处理作业或全部运行,并且伪随机数生成器没有随机抽取,则可以在脚本顶部设置种子并完整运行它是安全的。

如果要单步执行代码(也许是重新运行代码块),则需要set.seed()在每次从伪随机数生成器提取的函数调用之前进行调用。

对于我的科学论文,我通常会进行超级防御,并在每个代码块之前设置种子。这样可以在以后更新脚本,该脚本可能随时需要插入到现有脚本中,例如响应评论者或共同作者的评论。

希望您的结果不会取决于一组特定的pseduo随机值,因此问题在于能够重现报告或论文中所述的确切值。即使您可能超级防御并在每个代码块上设置了种子,您仍可能需要重新创建确切的安装-R版本和软件包版本,因此记录这些详细信息至关重要。为了更加安全,您需要保留特定项目/论文的先前R版本和软件包。确实,很多人都这样做。


+1。关于最后一段:您不必保存所有垃圾内容,也不必重新创建整个安装。如果您要确定要使用哪种RNG,则无需接受默认值,而是需要保存的所有内容是(1)该RNG的源代码(通常很短)和(2)每个关键时刻RNG的状态。对于大多数R工作,此状态都可以在中找到.Random.seed。我最担心的R是某些例程可能会绕过此过程,set.seed在某些情况下可能会完全忽略。
ub

2
@whuber我在这里更普遍地考虑-如果关注的是再现确切的结果集,则您很有可能需要R版本和所用任何软件包的版本。白衣 R 3.0.0更改了其报告值的精度-不是主要的,但这足以引发所有许多假设精度过高的软件包检查测试。此外,软件包会定期更新,并且情况会发生变化。
加文·辛普森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.