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

时间:2018-07-04 14:54:06

标签: r

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

例如:

replicate(10, myfunction(data))

有没有一种方法可以为使用myfunction作为输入的调用data的10次复制中的每一个复制放置一个种子号?谢谢。

3 个答案:

答案 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()