在R中使用`replicate()`函数设置种子

mwngjboj  于 2023-10-13  发布在  其他
关注(0)|答案(3)|浏览(84)

R中,有一个replicate()函数,我使用它来复制同一函数的多次迭代。我的函数有一些随机数生成,我想知道是否有一种方法可以为replicate()函数的每次迭代放入一个种子数。
例如:

replicate(10, myfunction(data))

有没有一种方法可以为调用myfunction的10次复制中的每一次都输入一个种子编号,并将data作为输入?谢谢.

uqcuzwp8

uqcuzwp81#

在调用replicate之前使用set.seed()
值得注意的是link
特别是:
我们怎么强调都不为过:不要经常播种。要了解为什么这是一个如此糟糕的想法,请考虑限制情况:设置种子,绘制一个伪随机数,重置种子,再次绘制,如此继续。你得到的伪随机数只不过是你在数学函数中运行的种子。您获得的结果将不会通过随机,除非您选择的种子通过随机。如果你已经有了这样的数字,为什么还要费心去使用伪随机数生成器呢?

62o28rlo

62o28rlo2#

如果你想在每次迭代中控制种子,同时保持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)
  myfunction(data, ...)
}

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

但是,如果出于某种原因,你想在每次复制时生成相同的值,你可以将myfunction() Package 在一个修复种子的外部函数中,然后使用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))

或者你也可以用原始的myfunction()来做,例如:

replicate(10, {set.seed(6933); myfunction(data)})
gt0wga4j

gt0wga4j3#

如果你想为每个复制使用不同的特定种子,你可以这样做:

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

如果你想为每一个相同的种子,你可以跳过计数;如果你希望整个序列是可重复的,但不想为每个重复选择种子,只需在replicate()调用之外使用set.seed

相关问题