【问题标题】:Weird behavior of using set.seed multiple times多次使用 set.seed 的奇怪行为
【发布时间】:2018-01-01 14:44:29
【问题描述】:

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

我得到这样的散点图: 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)”向我解释为什么两个结果不同?

【问题讨论】:

    标签: r random normal-distribution random-seed


    【解决方案1】:

    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 再次转换这些数字

    当您使用相同的种子但均值和 sd 不同运行两次时,前两个步骤将创建完全相同的结果,因为生成的随机数是相同的,并且均值和 sd 尚未使用。只有在第三步中,mean 和 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 &lt;- 0.75 * x - 1,它仍然只是一个线性函数。

    【讨论】:

    • 但是我生成了具有不同sd的Epsilon,为什么仍然是相同的x,尽管情节似乎与解释一致?
    • 这实际上是一个非常好的问题,我忽略了您代码中 sd 的差异。我添加了解释为什么这条线仍然与我的答案成线性关系,我希望这能说清楚。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多