You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让基于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()设置为该包使用的随机种子即可:

  1. 先重置随机种子:执行set.seed(NULL);
  2. 运行旧版rpsychi包中生成对应数据的代码;
  3. 执行.Random.seed查看当前的随机种子值;
  4. 将该值传入自己模拟代码的set.seed()中,就能生成与rpsychi包完全一致的数据集,ANOVA结果也会匹配。

内容的提问来源于stack exchange,提问作者John Huang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 19:22:26