Генератор случайных чисел для 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. Я как бы стесняюсь говорить об этом, но не вижу другого варианта (я надеялся, что предложение награды даст ответ, который предоставит такой другой вариант). Если так, я бы сообщил об этом как об ошибке; узнать больше здесь.