2017-07-26 77 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