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

标签 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)”向我解释为什么两个结果不同?

最佳答案

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)通常生成如下:
  • 生成随机统一编号。
  • 对这些数字应用转换,通常是 the Box-Muller transformation. ,让我们称这些数字为 X。
  • 通过应用变换 sd * X + mean 再次变换这些数字。

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

    关于r - 多次使用 set.seed 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45324208/

    相关文章:

    c# - 如何访问列表中的随机项目?

    machine-learning - 向量 x 的概率

    r - 将数据集分成 2 个较小的数据集

    r - ggplot 图例与 geom_rect

    C++随机将枚举类型分配给变量

    google-maps - 特定邮政编码、县或地区内的随机真实美国地址

    python - 正态分布;铁蟒

    c++ - 我如何创建一个在单独的方法中工作的 C++ 随机正态分布?

    r - 如何选择一行,然后转置它,然后将它与 R 中的其余部分堆叠在一起?

    r - 如何在R包forestplot中添加第二条垂直线