Установка начального числа с помощью функции `replicate ()` в R - PullRequest
0 голосов
/ 04 июля 2018

В R есть функция replicate(), которую я использую для репликации нескольких итераций одной и той же функции. Моя функция имеет некоторое генерирование случайных чисел, и мне интересно, есть ли способ вставить начальное число для каждой итерации функции replicate().

Например, в:

replicate(10, myfunction(data))

Есть ли способ поставить начальный номер для каждой из 10 копий вызова myfunction с data в качестве ввода? Спасибо.

Ответы [ 3 ]

0 голосов
/ 04 июля 2018

Если вы хотите контролировать начальное число на каждой итерации, сохраняя постоянную аргумента data, лучше использовать lapply() или sapply(), а не replicate(). Например, вы можете указать вектор семян для lapply() и определить встроенную функцию, которая связывает data с myfunction(), например:

# note: `sapply()` might be better, depending on the return value of `myfunction()`
lapply(1:10, function(seed){
  set.seed(seed)
  myfunction(data)
}

Вы также можете определить функцию отдельно, например ::

# `...` is for passing (named) params other than `data` to `myfunction()`
myfunction2 <- function(data, seed, ...){
  set.seed(seed)
  myfunction2(data, ...)
}

# same thing as first approach
lapply(1:10, myfunction2, data=data)

Но если по какой-либо причине вы хотите генерировать одинаковые значения при каждой репликации, вы можете обернуть myfunction() во внешнюю функцию, которая фиксирует начальное значение, а затем использовать replicate() для многократного вызова этой функции:

# wrap `myfunction()` to set seed before each call, passing params in `...`
myfunction_withseed <- function(...){ 
  set.seed(6933)
  myfunction(...)
}

# use `myfunction_withseed()` just as you would `myfunction()` 
replicate(10, myfunction_withseed(data=data))

Или вы можете сделать это inline с оригинальным myfunction(), e, g,:

replicate(10, {set.seed(6933); myfunction(data)})
0 голосов
/ 04 июля 2018

Если вы хотите разные специфические начальные числа для каждой копии, вы можете сделать это следующим образом:

seeds <- 101:110   # 10 seeds
count <- 0
replicate(10, { count <<- count + 1; set.seed(seeds[count]); rnorm(1) })

Если вам нужно одно и то же семя для каждого, вы можете пропустить счет; если вы хотите, чтобы вся последовательность воспроизводилась, но не хотите собирать семена для каждой копии, просто используйте set.seed за пределами вызова replicate().

0 голосов
/ 04 июля 2018

Используйте set.seed() перед вызовом на replicate.

Это стоит отметить ссылка .

Expecially:

Мы не можем подчеркнуть это достаточно: не сажайте семя слишком часто. Чтобы понять, почему это такая плохая идея, рассмотрим ограничивающий случай: вы устанавливаете начальное число, рисуете одно псевдослучайное число, сбрасываете начальное число, снова рисуете и продолжаете. Полученные вами псевдослучайные числа будут не более чем семенами, которые вы запускаете через математическую функцию. Полученные вами результаты не будут случайными, если выбранные вами семена не будут случайными. Если у вас уже были такие числа, почему вы вообще потрудились использовать генератор псевдослучайных чисел?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...