我是否一遍又一遍地使用相同的随机种子来制造偏见?

机器算法验证 随机生成
2022-01-29 21:58:30

在我做过的几乎所有分析工作中,我都使用:

set.seed(42) 

这是对《银河系漫游指南》的致敬但我想知道我是否通过一遍又一遍地使用相同的种子来制造偏见。

2个回答

如果 RNG 好的话,就没有偏见。 但是,通过始终使用相同的种子,您在职业生涯中执行的所有模拟之间建立了强烈的相互依赖关系。这会产生一种不寻常的风险。

  • 通过每次使用相同的种子,要么你总是得到一个非常好的伪随机序列并且你的所有工作都进展顺利,要么 - 以非常低但非零的概率 - 你总是使用一个非常糟糕的序列并且你的模拟不是作为您认为的潜在分布的代表。要么你所有的工作都很好,要么所有的工作都很糟糕!

  • 将此与每次使用真正随机的起始种子进行对比。 在很长一段时间内,您可能会获得一系列不代表您正在建模的分布的随机值,但大多数时候您会很好。如果您从未尝试复制自己的作品(使用新种子),那么在您的职业生涯中有一两次可能会得到误导性的结果,但绝大多数情况下您会没事的。

有一个简单而明显的解决方法:总是,总是通过重新开始另一个种子来检查你的工作。 两颗种子意外地以同样的方式给出误导性结果几乎是不可能的。

另一方面,拥有一个众所周知的“个人种子”也有非凡的价值:它向世界表明你是诚实的。一种狡猾而巧妙的模拟谎言的方法是重复它们,直到它们给你一个预定的结果。这是一个R“证明”即使是公平的硬币也很有可能在一半以上的时间里正面朝上的工作示例:

n.flips <- 100
seeds <- 1:10^3
#
# Run some preliminary simulations.
#
results <- sapply(seeds, function(seed) {
  set.seed(seed)
  mean(runif(n.flips) > 1/2)
})
#
# Now do the "real" simulation.
#
seed <- seeds[which.max(results)]
set.seed(seed)
x <- mean(runif(n.flips) > 1/2)
z <- (x - 1/2) * 2 * sqrt(n)
cat("Mean:", x, "Z:", z, "p-value:", pnorm(z, lower.tail=FALSE), "\n")

通过查看更广泛的种子(从),我能够找到一个合适的种子:218134。当您以它作为种子开始时,生成的模拟硬币翻转展示个正面! ( )有很大不同。11061007550p=0.000004

其影响可能是迷人而重要的。 例如,如果我事先知道我将招募谁参加一项随机双盲对照试验,以及以什么顺序(作为一名大学教授,我可能能够控制这些试验一群被俘虏的本科生或实验室老鼠),然后事先我可以运行这样一组模拟来找到一个种子,使学生更符合我的喜好,以支持我希望“证明”的任何东西。我之前可以在我的实验计划中包含计划的订单和那个种子进行实验,从而创建了一个任何批判性评论者都无法弹劾的程序——但尽管如此,我还是把甲板堆放在了对我有利的位置上。(我相信整个伪科学分支都使用这种技巧的某种变体来获得可信度。你相信我真的使用 ESP 来控制计算机吗?我也可以和你的相距甚远!)

知道默认种子的人不能玩这个游戏。

我的个人种子是 17,我的大部分帖子都证明了这一点(目前 161 个设置种子的帖子中有 155 个使用这个)。R是一个难以处理的种子,因为(事实证明)我用它创建的大多数小数据集都有一个很强的异常值。这不是一个坏特性......

如上所述,一个好的 RNG 不会因使用相同的种子而产生偏差。但是,结果之间会有相关性。(相同的伪随机数将开始每次计算。)这是否重要不是数学问题。

有时使用相同的种子是可以的:用于调试或当您知道需要相关结果时。