2

在中,我使用了R一个函数来复制同一函数的多次迭代。replicate()我的函数有一些随机数生成,我想知道是否有办法为replicate()函数的每次迭代输入种子数。

例如在:

replicate(10, myfunction(data))

有没有办法为调用的 10 次复制中的每一次输入一个种子编号myfunction作为data输入?谢谢。

4

3 回答 3

3

set.seed()在通话前使用replicate

这是一个值得注意的环节

特别是:

我们再怎么强调也不过分:不要过于频繁地播种。要了解为什么这是一个糟糕的主意,请考虑极限情况:设置种子,抽取一个伪随机数,重置种子,再次抽取,如此继续。您获得的伪随机数只不过是您通过数学函数运行的种子。除非您选择的种子随机通过,否则您获得的结果不会随机通过。如果你已经有了这样的数字,为什么还要费心使用伪随机数生成器呢?

于 2018-07-04T14:58:41.837 回答
3

如果您想在每次迭代中控制种子,同时保持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)})
于 2018-07-04T14:58:57.323 回答
2

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

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

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

于 2018-07-04T15:03:11.167 回答