设置种子可以确保重现性,并且在模拟建模中非常重要。考虑一个简单的模型f()
,它有两个感兴趣的变量y1
和y2
。这些变量的输出由一个随机过程(rbinom()
)和参数x1
和x2
来确定。两个感兴趣的变量的输出是相互独立的。
现在,假设我们希望比较在相应参数发生更改后的变量输出的变化与更改之前的场景(即灵敏度分析)。如果所有其他参数都未被更改,并且设置了相同的种子,那么未受影响变量的输出不应与默认模拟中的输出相同,因为该变量独立于另一个变量吗?
简单地说,为什么变量y2
的下面的输出是由参数x2
决定的,尽管设置了固定的种子,但x1
只发生了一次变化。我们可以忽略y2
的输出,只关注y1
,但在一个更大的模拟中,每个变量都是总成本的一个成本部分,在单个参数更改之后,在测试模型的总体灵敏度时,未受影响的变量中的变化可能会出现问题。
#~ parameters and model
x1 <- 0.0
x2 <- 0.5
n <- 10
ts <- 5
f <- function(){
out <- data.frame(step = rep(0, n),
space = 1:n,
id = 1:n,
y1 = rep(1, n),
y2 = rep(0, n))
l.out <- vector(mode = "list", length = n)
for(i in 1:ts){
out$step <- i
out$y1[out$y1 == 0] <- 1
out$id[out$y2 == 1] <- seq_along(which(out$y2 == 1)) + n
out$y2[out$y2 == 1] <- 0
out$y1 <- rbinom(nrow(out), 1, 1-x1)
out$y2 <- rbinom(nrow(out), 1, x2)
n <- max(out$id)
l.out[[i]] <- out
}
do.call(rbind, l.out)
}
#~ Simulation 1 (default)
set.seed(1)
run1 <- f()
set.seed(1)
run2 <- f()
run1 == run2 #~ all observations true as expected
#~ Simulation 2
#~ change in x1 parameter affecting only variable y1
x1 <- 0.25
set.seed(1)
run3 <- f()
set.seed(1)
run4 <- f()
run3 == run4 #~ all observations true as expected
#~ compare variables after change in x1 has occured
run1$y1 == run3$y1 #~ observations differ as expected
run1$y2 == run3$y2 #~ observations differ - why?
发布于 2020-11-20 04:11:50
问得好。造成这种行为的原因是,当您在p = 0
或p = 1
中设置rbinom
时,底层C函数会意识到它不需要使用随机数生成器进行采样。种子只有在随机数生成器被调用时才会改变,所以如果p
是严格在0到1之间的任何数,那么种子就会改变,但是如果p
是0或1,则不会改变。您可以看到这是源代码。
在正常情况下,当p大于0或小于1时,您的设置应该可以正常工作:
set.seed(1)
x1 <- rbinom(5, 1, 0.4)
y1 <- rbinom(5, 1, 0.5)
set.seed(1)
x2 <- rbinom(5, 1, 0.1)
y2 <- rbinom(5, 1, 0.5)
all(y1 == y2)
#> [1] TRUE
但是,如果将p设置为1或0,则结果将有所不同:
set.seed(1)
x1 <- rbinom(5, 1, 0.4)
y1 <- rbinom(5, 1, 0.5)
set.seed(1)
x2 <- rbinom(5, 1, 1)
y2 <- rbinom(5, 1, 0.5)
all(y1 == y2)
#> [1] FALSE
要证明这是正确的,如果第一次将y1 == y2
设置为1,第二次将p
设置为0,则应该获得p
:
set.seed(1)
x1 <- rbinom(5, 1, 0)
y1 <- rbinom(5, 1, 0.5)
set.seed(1)
x2 <- rbinom(5, 1, 1)
y2 <- rbinom(5, 1, 0.5)
all(y1 == y2)
#> [1] TRUE
https://stackoverflow.com/questions/64928795
复制相似问题