【问题标题】:set.seed() over different OS with RNGkind() [closed]set.seed() 在不同的操作系统上使用 RNGkind() [关闭]
【发布时间】:2021-01-25 21:19:56
【问题描述】:

这个问题与以下问题相似(但不一样!)...

Different sample results using set.seed command?

Is set.seed consistent over different versions of R (and Ubuntu)?

Same seed, different OS, different random numbers in R

...其中RNGkind()建议在脚本中使用set.seed()设置种子时保证OS / R版本之间的一致性

但是,我发现为了在我使用的 unix 和 windows 系统上重现结果,我必须在 Windows 上运行时设置 RNGkind(sample.kind = "Rounding") 而在 unix 上。如果我同时设置它,我将无法重现结果。

谁能解释系统中的这种差异? 以及如何在不了解最终用户操作系统的情况下与 set.seed() 共享代码并确保其可重现?

非常感谢

编辑:我在使用 kmeans() 函数时遇到了这个问题。我在每次使用kmeans()之前set.seed(1)

【问题讨论】:

  • 一个没有。无法在不同操作系统之间可靠地确保重现性。
  • 如果很重要,您可以考虑将系统生成的随机数硬编码为外部数据文件(如果大)或 dput(如果小)
  • 您需要向我们展示您发现不一致的代码。如果种子和sample.kind 匹配,sample() 函数(sample.kind 影响)将给出相同的结果。其他事物(例如算术!)可能因系统而异,但 sample() 不会。
  • @Roland,您的评论不正确。 R 中的 RNG 在确保跨操作系统的可重复性方面非常好。算术存在细微差别(64 位精度与 80 位精度,一些数学库),但 RNG 没有,它们大多独立于此。我的回答中有一些细节说明人们最终会如何对此感到困惑。
  • @user2554330 感谢您的评论,我已在问题中添加了更多信息。 kmeans() 函数有这个问题。

标签: r


【解决方案1】:

R 中的随机数生成器在操作系统之间是一致的,但在 R 的历史中已经修改了几次,因此默认情况下在 R 版本之间不一致。但是,您始终可以通过设置 set.seed()RNGkind() 以匹配以前使用的内容来重现早期 R 版本的随机流。

RNGversion() 函数会将较新版本的 R 设置为任何先前版本的默认值。如果您查看其源代码,您会发现默认值在 0.99、1.7.0 和 3.6.0 中发生了变化。

重现随机数结果的一个困难是人们并不总是报告RNGkind() 的值。如果您更改为非默认设置并保存工作区,您将在重新加载时返回到该非默认设置。

一般来说,每一项更改都是一项改进,因此建议使用像 RNGkind(sample.kind = "Rounding") 这样的代码可能是个坏建议:它恢复了在 R 3.6.0 中默认修复的错误行为。 (尽管这是一个非常微妙的错误,除非您使用 sample() 函数来处理非常庞大的人口。)

您通常最好鼓励人们使用最新版本的 R(偶尔 x.y.0 版本除外,它有时会引入新的错误)。保存工作区也是一个坏主意,因为这会导致 R 保留旧的或非默认的 RNG。

【讨论】:

    猜你喜欢
    • 2015-07-24
    • 2021-10-20
    • 2018-10-19
    • 2015-11-06
    • 2011-01-02
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2012-05-07
    相关资源
    最近更新 更多