首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >种子设置:输入不变后输出为何不同?

种子设置:输入不变后输出为何不同?
EN

Stack Overflow用户
提问于 2020-11-20 03:39:05
回答 1查看 378关注 0票数 3

设置种子可以确保重现性,并且在模拟建模中非常重要。考虑一个简单的模型f(),它有两个感兴趣的变量y1y2。这些变量的输出由一个随机过程(rbinom())和参数x1x2来确定。两个感兴趣的变量的输出是相互独立的。

现在,假设我们希望比较在相应参数发生更改后的变量输出的变化与更改之前的场景(即灵敏度分析)。如果所有其他参数都未被更改,并且设置了相同的种子,那么未受影响变量的输出不应与默认模拟中的输出相同,因为该变量独立于另一个变量吗?

简单地说,为什么变量y2的下面的输出是由参数x2决定的,尽管设置了固定的种子,但x1只发生了一次变化。我们可以忽略y2的输出,只关注y1,但在一个更大的模拟中,每个变量都是总成本的一个成本部分,在单个参数更改之后,在测试模型的总体灵敏度时,未受影响的变量中的变化可能会出现问题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#~ 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?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-20 04:11:50

问得好。造成这种行为的原因是,当您在p = 0p = 1中设置rbinom时,底层C函数会意识到它不需要使用随机数生成器进行采样。种子只有在随机数生成器被调用时才会改变,所以如果p是严格在0到1之间的任何数,那么种子就会改变,但是如果p是0或1,则不会改变。您可以看到这是源代码

在正常情况下,当p大于0或小于1时,您的设置应该可以正常工作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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,则结果将有所不同:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64928795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文