如何让基于rnorm模拟的ANOVA代码每次运行结果一致?
模拟数据做ANOVA结果每次不同的原因与解决办法
问题背景
我有3组已知样本量n、均值mean、标准差sd的数据,想要进行ANOVA分析,因此使用rnorm函数模拟数据,再常规调用ANOVA相关函数,但每次运行结果均不相同,请问原因是什么?该如何解决?我尝试安装旧版rpsychi包后结果保持一致,但仍希望确保两种方法的结果匹配。
用户提供的原始代码:
g1 <- data.frame(g=1, hem=rnorm(n=16, mean=8.712, sd=0.844)) g2 <- data.frame(g=2, hem=rnorm(n=10, mean=10.63, sd=1.284)) g3 <- data.frame(g=3, hem=rnorm(n=15, mean=12.3, sd=0.942)) sdat <- rbind(g1, g2, g3) sdat$g <- factor(sdat$g) bartlett.test(hem ~ g, data=sdat) anova(aov(hem ~ g, data=sdat))
原因分析
rnorm()函数生成的是随机正态分布数据,每次调用时会基于当前的随机数种子生成不同的数值,因此每次模拟出的数据集存在差异,最终导致bartlett检验、ANOVA的结果无法固定。
解决办法
要让每次模拟结果完全一致,只需在调用rnorm()前设置固定的随机数种子。使用set.seed()函数,传入任意整数(如123、456),每次运行代码前执行该函数,就能保证生成的随机数据完全相同,后续统计分析结果也会一致。
修改后的代码示例:
# 设置固定随机数种子,确保每次生成的随机数据一致 set.seed(123) g1 <- data.frame(g=1, hem=rnorm(n=16, mean=8.712, sd=0.844)) g2 <- data.frame(g=2, hem=rnorm(n=10, mean=10.63, sd=1.284)) g3 <- data.frame(g=3, hem=rnorm(n=15, mean=12.3, sd=0.942)) sdat <- rbind(g1, g2, g3) sdat$g <- factor(sdat$g) bartlett.test(hem ~ g, data=sdat) anova(aov(hem ~ g, data=sdat))
确保与旧版rpsychi包结果匹配的方法
若旧版rpsychi包能输出固定结果,只需将set.seed()设置为该包使用的随机种子即可:
- 先重置随机种子:执行
set.seed(NULL); - 运行旧版rpsychi包中生成对应数据的代码;
- 执行
.Random.seed查看当前的随机种子值; - 将该值传入自己模拟代码的
set.seed()中,就能生成与rpsychi包完全一致的数据集,ANOVA结果也会匹配。
内容的提问来源于stack exchange,提问作者John Huang
相关产品推荐
相关产品推荐

