我在 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)
通常生成如下: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/