2017-07-26 105 views
4

当我在R里做我的作业时,我想出了一个奇怪的结果,任何人都可以向我解释发生了什么事?多次使用set.seed的怪异行为

该指示告诉我要设置种子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)”?

回答

12

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,为什么会仍然相同的X,虽然剧情似乎与解释,同意吗?”

这实际上是一个非常有趣的问题。分配~N(mean,sd)的随机数通常生成如下:

  1. 随机生成统一编号。
  2. 对这些数字应用转换,通常是the Box-Muller transformation.,我们称这些数字为X.
  3. 这些数字是通过应用转换sd * X + mean

当你使用相同的种子,但不同的均值和标准差,前两个步骤将创建完全相同的结果运行此两次,因为随机变换一次生成的数字是相同的,并且平均值和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,它仍然只是一个线性函数。

+0

但我用不同的sd生成Epsilon,为什么仍然是一样的x,虽然情节似乎与解释一致? – SamCXLG

+0

这实际上是一个非常好的问题,我忽略了代码中sd的区别。我添加了解释,为什么这条线对我的答案仍然是线性的,我希望这说明清楚。 – Florian

+1

这解释了一切,非常感谢。 – SamCXLG