在R
中,有一个replicate()
函数可用来复制同一函数的多个迭代。我的函数生成了一些随机数,我想知道是否有一种方法可以为replicate()
函数的每次迭代添加种子数。
例如:
replicate(10, myfunction(data))
有没有一种方法可以为使用myfunction
作为输入的调用data
的10次复制中的每一个复制放置一个种子号?谢谢。
答案 0 :(得分:2)
在set.seed()
通话之前使用replicate
。
这值得注意link。
特别是:
我们不能足够强调这一点:不要太频繁地设置种子。要了解为什么这是一个坏主意,请考虑一下极限情况:设置种子,绘制一个伪随机数,重置种子,再次绘制,然后继续。您获得的伪随机数仅是您通过数学函数运行的种子。除非您选择的种子随机通过,否则您获得的结果将不会随机通过。如果您已经有这样的数字,为什么还要打扰使用伪随机数生成器呢?
答案 1 :(得分:2)
如果要在保持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))
或者您也可以与原始myfunction()
内联,例如:
replicate(10, {set.seed(6933); myfunction(data)})
答案 2 :(得分:1)
如果每个复制都需要不同的特定种子,则可以这样做:
seeds <- 101:110 # 10 seeds
count <- 0
replicate(10, { count <<- count + 1; set.seed(seeds[count]); rnorm(1) })
如果每个种子都需要相同的种子,则可以跳过计数;如果您希望整个序列可重现,但又不想为每个重复选择种子,则只需在set.seed
调用之外使用replicate()
。