Странное поведение при многократном использовании set.seed

Я пришел к странному результату, когда делал домашнюю работу в R, может ли кто-нибудь объяснить мне, что происходит?

В инструкции мне было сказано установить seed 1, чтобы сохранить согласованность.

Сначала я дважды установил seed(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.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)»?


person SamCXLG    schedule 26.07.2017    source источник


Ответы (2)


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

Итак, как вы можете видеть, когда вы дважды устанавливаете.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. К этим числам применяется преобразование, обычно преобразование Бокса-Мюллера. , обозначим эти числа X.
  3. Эти числа преобразуются еще раз путем применения преобразования 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 раза превышают числа, сгенерированные в первый раз.

Итак, в моем объяснении выше эпсилон на самом деле равен 0,25 * x, а ваша результирующая функция — y <- 0.75 * x - 1, которая по-прежнему является просто линейной функцией.

person Florian    schedule 26.07.2017
comment
Но я сгенерировал Эпсилон с другим sd, почему это все равно будет тот же x, хотя сюжет, похоже, согласуется с объяснением? - person SamCXLG; 27.07.2017
comment
На самом деле это действительно хороший вопрос, я упустил из виду разницу в SD в вашем коде. Я добавил объяснение, почему линия все еще линейна, к моему ответу, надеюсь, это прояснит ситуацию. - person Florian; 28.07.2017

Почему результаты были разными - Когда 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

Итак, когда начальное значение установлено только один раз, программа использует следующий набор доступных чисел для генерации следующего набора случайных чисел.

person vinay    schedule 01.11.2018