我在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")
我得到了这样的散点图:有两粒种子的情节
在我只使用一个set种子之后,代码是:
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")
情节变得合理了:一粒种子的情节
有人能向我解释为什么两个结果是不同的增加一个额外的"set.seed(1)“吗?
发布于 2017-07-26 02:27:09
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
,它仍然是一个线性函数。
发布于 2018-11-01 04:08:24
为什么结果是不同的-当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
因此,当种子只设置一次时,程序使用下一组可用的数字来生成下一组随机数。
https://stackoverflow.com/questions/45324208
复制