理解 R 中的 set.seed()

Understanding set.seed() in R

我正在使用 R,但在复制以下输出时遇到了一些问题:

mod1 <- glm(TVAR ~ .,data = df, family = "binomial")
y <- predict.glm(mod1)

由于它依赖于 set.seed()

我有一些与此相关的问题?

依次回答你的观点:

Would [reverse engineering the seed from the result of a computation] be possible?

这取决于实际使用的随机数生成器,但通常这很难,因为好的 RNG 的状态 space 很大,您可能需要彻底搜索它。这可能不仅需要几个小时,还需要 .

a new seed is only used when I delete all the variables in the environment?

每当您调用 set.seed 时,都会使用一个新种子。实际的当前种子值存储在全局环境中的隐藏变量.Random.seed中。但是,删除种子不会使您的最后一次计算可重现,因为 R 会根据不确定的值(实际上是当前操作系统时间)重新初始化该种子的值。

if I run the same code more than once but without cleaning the environment, the results are the same, hence the same seed was used.

否:使用随机值(通过调用随机函数)更改 随机种子。因此,运行 在不清理环境的情况下连续进行多次计算 而不是 产生相同的结果。事实上,那将是 可怕的 。你自己可以很容易地看到这个:

〉rnorm(1)
[1] -0.3156453
〉rnorm(1)
[1] 0.7345465

…很明显,随机函数的两次连续调用(这里,rnorm不是产生相同的结果,即使我没有清理环境在通话之间。

is there a way to understand when a function is dependent on set.seed()?

您可以设置不同的随机种子,重新运行该函数,然后查看输出是否发生变化。

除此之外,没有通用、直接的方法来执行此操作。如果该函数没有记录它对 set.seed 的依赖性,那么您唯一的办法就是仔细查看该函数的源代码(以及它依次调用的所有函数)。


奖金(如 Roland 在评论中指出的那样):

glmpredict.glmnot 随机函数,not 不依赖 set.seed.

@KonradRudolph 在这里给出了很好的答案。我只想给它加一分:

设置随机种子有三种种方式,而且不尽相同:

  • 使用 set.seed(n) 将其设置为易于重现的状态。
  • 调用任何内部随机数生成器也会以确定性但不太可预测的方式更改它。
  • 保存它并稍后恢复它会将其设置为较早的状态。

一般来说,set.seed() 只能输出随机种子可能值的一小部分,而调用 RNG 应该(最终)循环遍历所有这些值。可能有大约 2^20000 个不同的随机种子,但 set.seed() 只能创建大约 2^32 个。 (这两个数字都被高估了,但比例差不多。)

您可以保存和恢复 .Random.seed 变量,或调用 set.seed(n) 将随机种子设置为已知状态。重现特定状态的唯一可行方法是从已知状态开始并重复导致您想要的状态的调用。