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

Sam*_*XLG 4 random r normal-distribution random-seed

当我在R做作业时,我想出了一个奇怪的结果,任何人都可以向我解释发生了什么事吗?

该指令告诉我设置种子1以保持一致性.

首先,我将种子(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")
Run Code Online (Sandbox Code Playgroud)

我得到这样的散点图: 带有两个种子的情节

在我只使用一组种子之后,代码是:

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")
Run Code Online (Sandbox Code Playgroud)

情节变得合理: 有一套种子的情节

任何人都可以通过添加额外的"set.seed(1)"向我解释为什么两个结果不同?

Flo*_*ian 13

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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,当您使用相同的数字set.seed(x)两次时,您将从该点生成相同的随机数.(对于具有相同分布的变量.对于其他变量,请参见下面的详细说明).所以你在第一个情节中得到一条直线的原因是因为

y <- 0.5 * x + epsilon -1
Run Code Online (Sandbox Code Playgroud)

实际上成了

y <- 0.5 * x + x -1
Run Code Online (Sandbox Code Playgroud)

因为你使用相同的随机数序列两次.这减少到

y <- 1.5 * x -1
Run Code Online (Sandbox Code Playgroud)

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

所以一般来说,你应该只set.seed(x)在脚本的开头执行一次.


详细阐述评论:"但是我用不同的sd生成了Epsilon,为什么它仍然是相同的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
Run Code Online (Sandbox Code Playgroud)

实际上,第二次生成的随机数恰好是第一次生成的数字的0.25倍.

所以在我上面的解释中,epsilon实际上是0.25*x,而你的结果函数是y <- 0.75 * x - 1,它仍然只是一个线性函数.