代码之家  ›  专栏  ›  技术社区  ›  SamCXLG

使用set的奇怪行为。多次播种

  •  4
  • SamCXLG  · 技术社区  · 9 年前

    当我在R做作业时,我想到了一个奇怪的结果,有人能告诉我发生了什么吗?

    首先,我设定种子(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

    有人能通过添加额外的“种子集(1)”来解释为什么两个结果不同吗?

    2 回复  |  直到 8 年前
        1
  •  14
  •   Florian    9 年前

    设置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
    

    正如你所见,当你设定时。使用相同的数字将(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. 通常对这些数字应用变换 the Box-Muller transformation. ,我们把这些数字叫做X。
    2. 这些数字通过应用变换再次变换 sd * X + mean

    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*x,得到的函数是 y <- 0.75 * x - 1 ,这仍然只是一个线性函数。

        2
  •  1
  •   vinay    7 年前

    为什么结果不同-设置时。种子设定一次,运行两次-

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

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

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

    推荐文章