在中,我使用了R一个函数来复制同一函数的多次迭代。replicate()我的函数有一些随机数生成,我想知道是否有办法为replicate()函数的每次迭代输入种子数。
例如在:
replicate(10, myfunction(data))
有没有办法为调用的 10 次复制中的每一次输入一个种子编号myfunction作为data输入?谢谢。
在中,我使用了R一个函数来复制同一函数的多次迭代。replicate()我的函数有一些随机数生成,我想知道是否有办法为replicate()函数的每次迭代输入种子数。
例如在:
replicate(10, myfunction(data))
有没有办法为调用的 10 次复制中的每一次输入一个种子编号myfunction作为data输入?谢谢。
set.seed()在通话前使用replicate。
这是一个值得注意的环节。
特别是:
我们再怎么强调也不过分:不要过于频繁地播种。要了解为什么这是一个糟糕的主意,请考虑极限情况:设置种子,抽取一个伪随机数,重置种子,再次抽取,如此继续。您获得的伪随机数只不过是您通过数学函数运行的种子。除非您选择的种子随机通过,否则您获得的结果不会随机通过。如果你已经有了这样的数字,为什么还要费心使用伪随机数生成器呢?
如果您想在每次迭代中控制种子,同时保持data参数不变,最好使用lapply()orsapply()而不是replicate(). 例如,您可以提供一个种子向量并定义一个绑定到lapply()的内联函数,如下所示:datamyfunction()
# 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()在一个固定种子的外部函数中,然后使用它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)})
如果您想为每个复制品使用不同的特定种子,您可以这样做:
seeds <- 101:110 # 10 seeds
count <- 0
replicate(10, { count <<- count + 1; set.seed(seeds[count]); rnorm(1) })
如果你想为每个种子提供相同的种子,你可以跳过计数;如果您希望整个序列可重现,但又不想为每个重复选择种子,只需set.seed在调用之外使用replicate()。