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

时间:2017-07-26 10:23:44

标签: r random 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")

我得到这样的散点图: The plot with two set seed

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

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")

情节变得合理: The plot with one set seed

有人可以通过添加额外的“set.seed(1)”向我解释为什么两个结果有所不同吗?

2 个答案:

答案 0 :(得分: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

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

y <- 0.5 * x + epsilon -1

实际上变成了

y <- 0.5 * x + x -1

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

y <- 1.5 * x -1

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

一般来说,您只应在脚本开头执行一次set.seed(x)

对评论的详细说明:“但是我用不同的sd生成了Epsilon,为什么它仍然是相同的x,虽然情节似乎与解释一致?”

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

  1. 生成随机统一编号。
  2. 对这些数字应用转换,通常为the Box-Muller transformation.,我们称这些数字为X.
  3. 通过应用转化sd * X + mean
  4. 再次转换这些数字

    当您使用相同的种子但不同的均值和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,它仍然只是一个线性函数。

答案 1 :(得分:0)

为什么结果不同-将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

因此,当种子仅设置一次时,程序将使用下一组可用数字来生成下一组随机数