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

R语言Tukey法成对比较报错及Estimate/SE/Test结果需求咨询

问题原因

你报错的核心原因是:aov()函数需要输入原始观测数据,而你提供的是分组汇总后的统计量(每组样本量、均值、方差),这导致aov()模型构建异常,进而引发glht()的参数检查错误。

解决方案

下面提供两种适配你汇总数据的解决方法:

方法1:生成模拟原始数据(简单直接)

既然你有每组的样本量、均值和方差,可以生成符合各组分布的模拟原始数据,再用你原本的代码流程分析:

library(multcomp)

# 设置随机种子保证结果可重复
set.seed(123)
# 基于汇总数据生成模拟原始数据
data_raw <- data.frame(
  Treatment = rep(c("Herbicide_1", "Herbicide_2", "Control"), times = c(30, 30, 40)),
  Sample.mean = c(
    rnorm(30, mean = 87.606, sd = sqrt(35.341)),
    rnorm(30, mean = 88.792, sd = sqrt(36.316)),
    rnorm(40, mean = 84.095, sd = sqrt(36.592))
  )
)

# 按原流程执行成对比较
data_raw$Treatment <- factor(data_raw$Treatment)
m1 <- aov(Sample.mean ~ Treatment, data_raw)
result <- glht(m1, mcp(Treatment = "Tukey"))
summary(result)

运行后会输出包含Estimate、Std. Error、t value(对应Test结果)的成对比较表,族误差率已通过Tukey方法控制在α=0.05。

方法2:直接用汇总数据做加权分析(无需模拟)

如果不想生成模拟数据,可以用加权线性模型结合emmeans包完成成对比较,更贴合汇总数据的场景:

library(emmeans)

# 构建汇总数据框
data6 <- data.frame(
  Treatment = c("Herbicide_1", "Herbicide_2", "Control"),
  n = c(30, 30, 40),
  mean = c(87.606, 88.792, 84.095),
  var = c(35.341, 36.316, 36.592)
)

# 构建加权线性模型(权重为n/var,对应均值的逆方差权重)
m2 <- lm(mean ~ Treatment, data = data6, weights = n/var)

# 执行Tukey校正的成对比较
emm <- emmeans(m2, ~ Treatment)
pairwise_emmeans <- pairs(emm, adjust = "tukey")
summary(pairwise_emmeans)

输出结果同样包含你需要的Estimate、SE(Std. Error)和t检验结果,且自动应用Tukey校正控制族误差率。

补充说明
  • 两种方法结果会略有差异(模拟数据存在随机波动),但核心结论一致;
  • 如果能获取真实原始数据,优先用原始数据分析,结果最准确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:34:54