使用set.seed多次会出现奇怪的行为

4

在使用R做作业时,我得到了一个奇怪的结果,请问有人能够解释一下发生了什么吗?

指导书告诉我要设置种子1以保持一致性。

起初,我设置了两次seed(1)。

set.seed(1)
x <- rnorm(100, mean = 0, sd = 1)
set.seed(1)
epsilon <- rnorm(100, mean = 0, sd = 0.25)
y <- 0.5 * x + epsilon -1
plot(x,y,main = "Scatter plot between X and Y", xlab = "X", ylab = "Y")

我得到了这样的散点图: 带有两组种子的图 只使用一组种子后的代码如下:
set.seed(1)
x <- rnorm(100, mean = 0, sd = 1)
epsilon <- rnorm(100, mean = 0, sd = 0.25)
y <- 0.5 * x + epsilon -1
plot(x,y,main = "Scatter plot between X and Y", xlab = "X", ylab = "Y")

剧情变得合理了: 只设置一个种子的剧情 为什么添加一行额外的 "set.seed(1)" 就会使得两个结果不同,有人能解释一下吗?
2个回答

14

Set.seed() 函数决定了之后生成的随机数。一般来说,它用于创建可再现的示例,这样如果我们都运行相同的代码,就可以得到相同的结果。举个例子:

set.seed(1234)
runif(3)
[1] 0.1137034 0.6222994 0.6092747

set.seed(1234)
runif(3)
[1] 0.1137034 0.6222994 0.6092747

set.seed(12345)
runif(3)
[1] 0.7209039 0.8757732 0.7609823

正如你所看到的,当你使用相同的数字两次进行set.seed(x)时,从那一点开始,你会生成相同的随机数。(对于具有相同分布的变量而言。对于其他情况,请参见下面的说明)。

因此,在第一个图中得到一条直线的原因是

y <- 0.5 * x + epsilon -1

实际上变成了

y <- 0.5 * x + x -1

因为您使用了相同的随机数序列两次。 这会降低

y <- 1.5 * x -1

这是一个简单的线性方程。

因此,通常情况下,您应该只在脚本开头执行一次 set.seed(x)


对评论的详细说明:“但我使用不同的sd生成了ε,为什么仍然是相同的x,尽管图表似乎支持解释?”

这实际上是一个非常有趣的问题。具有分布~N(mean,sd)的随机数通常按照以下方式生成:

  1. 生成随机均匀数。
  2. 应用一个变换,通常是Box-Muller变换,我们称这些数字为X。
  3. 再次通过应用变换sd * X + mean将这些数字转换

当您使用相同的种子但不同的平均值和sd运行两次时,前两个步骤将创建完全相同的结果,因为生成的随机数相同,而平均值和sd尚未使用。只有在第三步中,平均值和sd才会发挥作用。我们可以轻松验证这一点:

set.seed(1)
rnorm(4, mean = 0, sd = 1)
[1] -0.6264538  0.1836433 -0.8356286  1.5952808
set.seed(1)
rnorm(4, mean = 0, sd = 0.25)
[1] -0.15661345  0.04591083 -0.20890715  0.39882020

实际上,第二次生成的随机数确实是第一次生成的数字的0.25倍。

因此,在我上面的解释中,epsilon实际上是0.25*x,并且您得到的函数是y < -0.75 * x - 1,仍然只是一个线性函数。


但是我使用不同的标准差生成了Epsilon,为什么x仍然相同,尽管图表似乎与解释一致? - SamCXLG
这实际上是一个非常好的问题,我在你的代码中忽略了sd的差异。我在我的答案中添加了关于为什么该行仍然是线性的解释,希望这能让它更清晰明了。 - Florian

1

为什么结果不同 - 当设置 set.seed 一次并运行两次时 -

set.seed(123)
runif(3)
[1] 0.2875775 0.7883051 0.4089769
runif(3)
[1] 0.8830174 0.9404673 0.0455565

当再次设置set.seed时,结果为-

set.seed(123)
runif(6)
[1] 0.2875775 0.7883051 0.4089769 0.8830174 0.9404673 0.0455565

所以,当种子仅设置一次时,程序将使用下一个可用数字集来生成下一组随机数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接