为何未使用的额外随机数会导致F检验模拟结果偏差?
问题
以下是用于模拟F检验检验水准(alpha=0.1)的R代码:
set.seed(123) n=4;p=1;q=1; nu1=p; nu2=n-p-q+1;; alpha=0.1 critical=qf(alpha,nu1,nu2,lower.tail=FALSE ) rep=100000 i=1 # M<- rf(rep, q, n-q+1); rej=0 while (i<=rep){ rL= rf(1,nu1 , nu2); if (rL >=critical) {rej=rej+1;} i=i+1; } r=rej/rep
保留注释行时,模拟结果为0.0993,与alpha=0.1的误差绝对值小于0.0008;但移除注释行(生成额外未使用的随机数)后,结果变为0.09859,误差绝对值超过0.0013;当alpha=0.38时,误差绝对值甚至超过0.002。即使将模拟重复次数从10万增加到100万,误差绝对值仍大于0.001。插入其他随机值也会导致结果偏差,且无法通过增加重复次数改善,请问这是什么原因?
原因分析
这是伪随机数生成的序列依赖性导致的问题:
- R中的伪随机数是基于确定性算法生成的,
set.seed(123)会固定整个随机数序列的起始点。移除注释行后,rf(rep, q, n-q+1)会提前消耗掉序列中前rep个随机数,后续while循环里调用rf(1, ...)时,使用的是序列中更靠后的部分。 - 伪随机数序列整体符合统计分布,但局部片段的统计特性可能和整体存在偏差。你这里的模拟依赖序列中某一段的随机数,提前消耗随机数后,后续使用的片段恰好和预期的分布特性有偏差,且这种偏差是系统性的,而非随机抽样误差——不管重复多少次,你都是在同一个偏移后的固定序列片段里采样,所以增加重复次数无法改善偏差。
- 简单来说,固定种子后整个随机数序列是固定的,提前取走一部分后,剩下的部分用于模拟时,其分位数特性刚好和你需要的alpha不匹配,从而产生稳定的偏差。
内容的提问来源于stack exchange,提问作者L wang
相关产品推荐
相关产品推荐

