Генератор случайных чисел для R 3.6.1
У меня есть последняя версия R (3.6.1), но когда я использую функции, использующие генератор случайных чисел, они по умолчанию используют более старый (т.е. Pre-3.6.0) RNG, который использует округление вместо отклонения для выборки. Я не уверен, почему это происходит, и был бы признателен за помощь в ее решении.
set.seed(1)
sample(20)
RNGkind()
R.version
Ниже приведены результаты моего бега:
set.seed(1)
sample(20)
# 6 8 11 16 4 14 15 9 19 1 3 2 20 10 5 7 12 17 18 13
RNGkind()
# "Mersenne-Twister" "Inversion" "Rounding"
R.version
platform x86_64-w64-mingw32
arch x86_64
os mingw32
system x86_64, mingw32
status Patched
major 3
minor 6.1
year 2019
month 09
day 06
svn rev 77160
language R
version.string R version 3.6.1 Patched (2019-09-06 r77160)
nickname Action of the Toes
Исходя из НОВОСТЕЙ и связанных обсуждений, я ожидаю, что результат работы RNGkind()
будет выглядеть следующим образом:
# "Mersenne-Twister" "Inversion" "Rejection"
Я неправильно понимаю НОВОСТИ?
Ответы
Ответ 1
Как предложено @JanvanderLaan в комментариях, возможная проблема может быть связана с загрузкой файла .RData
при запуске. Например, если кто-то установил предыдущую версию R
и использовал ее каждый, начальный рабочий каталог из getwd()
при запуске сеанса будет содержать файл .RData
и файл .Rhistory
, если один когда-либо сохранял сеанс. Обычно это папка documents
на окнах, если кто-то использует Rstudio, и большинство людей стараются изо всех сил удалить старые или необычные файлы.
Следуя предложению в комментарии, перейдя к каталогу, выведенному getwd()
в новом сеансе R
, я нашел файл .RData
, закрыл существующие сеансы R
без сохранения текущего сеанса и возобновил новый сеанс R
. И это, похоже, правильно решило проблему, как можно увидеть ниже. Таким образом, кажется, что метод генерации случайных чисел действительно сохраняется между сессиями в файле .Rdata
.
RNGkind()
[1] "Mersenne-Twister" "Inversion" "Rejection"
Изменить (иллюстрация)
На самом деле мы можем довольно легко проиллюстрировать это в новом сеансе R независимо от того, какой генератор случайных чисел установлен. Предполагая, что кто-либо когда-либо открывал и сохранял сеанс R
до R-3.6.1
, следующий код иллюстрирует проблему
#Assuming that the R session has just opened
>RNGkind()
[1] "Mersenne-Twister" "Inversion" "Rounding"
>RNGversion("3.6.1")
>RNGkind()
[1] "Mersenne-Twister" "Inversion" "Rejection"
>load(".RData", verbose = TRUE)
Loading objects:
.Random.seed
>RNGkind()
[1] "Mersenne-Twister" "Inversion" "Rounding"
Как видно, он хранит .Random.seed
, однако не показано, что тип генератора случайных чисел также импортируется при загрузке предыдущей среды. Выполнение
file.remove(".RData")
q("no")
Таким образом,должен исправить проблему для будущих сеансов, предполагая, что рабочий каталог не был изменен в текущем сеансе.
Ответ 2
Я надеялся, что установление награды даст определенный ответ на вопрос, что вызвало проблему с ОП. Хотя этого не произошло, некоторые комментарии и ответы предложили несколько причин. Я даю здесь дополнительный ответ, чтобы собрать их всех в одном месте и дать немного лучшую иллюстрацию того, как определить, когда что-то происходит по сравнению с другим.
Предлагаемые причины:
- Семя устанавливается файлом
.RData
в исходном рабочем каталоге
- Тип RNG устанавливается
.Rprofile
- Ошибка в недавнем патче
Семя, заданное файлом .RData
Как обсуждалось в ответе Оливера, это может быть вызвано файлом .RData
в исходном рабочем каталоге. Я не буду вдаваться в подробности (для этого вы можете обратиться к связанному ответу), но я хотел показать, что вы увидите при запуске, если бы это было так. Вот как выглядит сообщение запуска в R на моей машине:
R version 3.6.1 (2019-07-05) -- "Action of the Toes"
Copyright (C) 2019 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.
Natural language support but running in an English locale
R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.
>
Если при запуске вы читаете файл .RData
, который может вызвать это, вы увидите уведомление об этом сразу после последнего абзаца сообщения о запуске:
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.
[Workspace loaded from ~/.RData]
Тип ГСЧ устанавливается .Rprofile
.Rprofile
- это скрипт, запускаемый при запуске, который вы можете использовать для установки некоторых настроек в начале сеанса. (Вы можете прочитать немного больше об этом здесь или здесь или в документации R). Хотя я сомневаюсь, что это так, вам, по крайней мере, возможно, проблема была вызвана тем, что файл .Rprofile
запускался со строкой, наподобие следующей
RNGkind(sample.kind = "Rounding")
Если в файле .Rprofile
была такая настройка, которая вызывала вашу проблему, в конце вашего сообщения о запуске вы увидите предупреждение:
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.
Warning message:
In RNGkind(sample.kind = "Rounding") : non-uniform 'Rounding' sampler used
Bug
Если вы не видите ни одного из этих сообщений при запуске, я думаю, это вызвано некоторой ошибкой, появившейся в недавнем патче к R 3.6.1. Я как бы стесняюсь говорить об этом, но не вижу другого варианта (я надеялся, что предложение награды даст ответ, который предоставит такой другой вариант). Если так, я бы сообщил об этом как об ошибке; узнать больше здесь.