set.seed在不同版本的R(和Ubuntu)上是否一致?

cbwuti44  于 2022-11-02  发布在  其他
关注(0)|答案(3)|浏览(308)

我现在运行的是R版本3.1.0(在Ubuntu 12.04 LTS上),由于我的R版本和操作系统都已经很旧了,所以我打算更新它们。但是,我有很多模拟都依赖于set.seed(),我希望它们在更新R和操作系统后仍然给予我相同的随机数。
所以我的问题有三个方面。
1.我可以更新R而不改变每个种子生成的数字吗?
1.我的操作系统也可以这样做吗?
1.如果1)或2)的答案都是否定的,是否有办法更改代码中的种子,使它们与奥尔兹的种子保持一致?

nzrxty8p

nzrxty8p1#

跨操作系统一致性:是的

如果您在两个不同的操作系统上安装了R,而没有手动更改默认值或RProfile,则使用set.seed()时应该会得到相同的结果。

R版本之间的一致性:未必

以前的情况是set.seed()在不同的R版本中会给予相同的结果,但由于R 3.6.0中的一个很少宣布的更新,这种情况不再普遍存在。因此,在比较R 3.6.0之前的结果时,您可以获得跨版本的一致性,但如果您将3.6.0之后使用的set.seed()与3.6.0之前使用的set.seed()进行比较,你会得到不同的结果。
您可以在下面的示例中看到这一点:
第3.2.0版

> set.seed(1999)
> sample(LETTERS, 3)
[1] "T" "N" "L"

第3.5.3版

> set.seed(1999)
> sample(LETTERS, 3)
[1] "T" "N" "L"

第3.6.0版

set.seed(1999)
sample(LETTERS, 3)
[1] "D" "Z" "R"

不一致的原因是在R 3.6.0中,the default kind of under-the-hood random-number generator was changed。现在,为了从set.seed()获得匹配的结果,必须首先调用函数RNGkind(sample.kind = "Rounding")
第3.6.0版

> RNGkind(sample.kind = "Rounding")
Warning message:
In RNGkind(sample.kind = "Rounding") : non-uniform 'Rounding' sampler used
> set.seed(1999)
> sample(Letters, 3)
[1] "T" "N" "L"
xpcnnkqh

xpcnnkqh2#

在几个R版本(3.1.0、3.3.1、3.4.2)和两台不同的机器(Windows 7 x64、Windows 10 x64)上进行测试后,我得到了相同的runif()随机数,这些随机数与R版本和操作系统无关。

snvhrwxg

snvhrwxg3#

如已接受答案中所述,从版本3.6.0开始,采样的默认算法发生了变化:

  • sample.kind* 可以是“Rounding”或“Rejection”,或与它们部分匹配。前者在3.6.0之前的版本中是默认值:它使样本在大样本总体上明显不均匀,只能用于旧结果的复制。有关讨论,请参见PR#17494。
    在R版本3.6.0及更高版本中,您可以通过在一个行程序中使用旧算法来保持一致性
set.seed(<seed_number_here>, sample.kind = "Rounding")

请注意,sample.kind选项是在3.6.0中添加的,因此您无法在较旧的R版本上使用更新、更好的方法(即,set.seed(<seed_number_here>, sample.kind = "Rejection")在3.6.0之前的R版本中不起作用)。

相关问题