我在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)”向我解释为什么两个结果有所不同吗?
答案 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)
的随机数通常如下生成:
sd * X + mean
当您使用相同的种子但不同的均值和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
因此,当种子仅设置一次时,程序将使用下一组可用数字来生成下一组随机数