1️⃣ 适用场景

  • 单因素(单自变量)比较 两个以上独立样本
  • 数据不满足 正态性 或 方差齐性
  • 可以看作是非参数版本的 单因素方差分析(ANOVA)

Kruskal-Wallis 检验是基于 秩(rank) 的比较,而不是原始数值。步骤如下:

  1. 合并所有观测值,对整体数据进行排序,得到秩(rank)
  2. 计算各组的秩和
  3. 根据各组样本量 和总样本量 ,计算 Kruskal-Wallis 统计量 :
  • :组数
  • :第 i 组样本量
  • :第 i 组秩和
  1. 当样本量较大时,H 服从近似 分布,自由度 =

3️⃣ 原理解释

  • 通过秩消除了 分布形态 的影响
  • 如果各组来自相同分布 → H 值较小(各组秩和差异不显著)
  • 如果至少有一组与其他组不同 → H 值较大,显著性检验拒绝原假设

原假设 :所有组的分布相同(中位数相等)
备择假设 :至少有一组分布不同

kruskal.test(Sepal.Length ~ Species, data = iris)
  • Kruskal-Wallis 不要求正态
  • 基于秩进行比较
  • 可以看作是 非参数 ANOVA
  • 如果显著,需要进一步做 两两比较(如 Dunn 检验 + 多重校正)

假设数据为非正态分布或采取偏态分布,当数据遵循正态分布时,应使用单因素方差分析;

  • 所关注的变量应该有两个或多个独立组。该检验最常用于分析三个或更多的组:对于分析两个组,应使用Mann-Whitney U检验来代替;-
  • 假设数据在各组之间有类似的分布;
  • 数据应该是随机选择的独立样本,即各组之间应该没有关系;
  • 每组样本应至少有5个观测值,以达到足够的样本量。
  • 这些假设与Mann-Whitney U检验相似,因为Kruskal-Wallis检验本质上是该检验的延伸,有两个以上的独立样本。而且,与Mann-Whitney U检验相似,Kruskal-Wallis检验是基于对数据进行排序并计算出一个检验统计量。

这个问题非常关键 👍。我们来拆开讲。


1️⃣ options(contrasts = c("contr.helmert", "contr.poly")) 是做什么的?

在 R 里,因子型变量在进入模型时需要转换成虚拟变量(dummy variables),这就涉及到 对比编码(contrasts)。

options(contrasts = c("X", "Y")) 规定了:

  • 第 1 个参数 → 普通因子(unordered factor)的默认对比方式
  • 第 2 个参数 → 有序因子(ordered factor)的默认对比方式

contr.helmert 和 contr.poly 都是正交对比(orthogonal contrasts),常见于实验设计/方差分析里。


2️⃣ 如果你 不设置这个选项 会发生什么?

R 默认是:

options("contrasts")
$contrasts
[1] "contr.treatment" "contr.poly"

也就是说:

  • 无序因子 → 默认 contr.treatment (处理组 vs 基准组,常见于回归分析)
  • 有序因子 → 默认 contr.poly (多项式对比)

3️⃣ 对 ANOVA 有什么影响?

  • F 检验(整体显著性)不会受影响

    • 无论用什么 contrasts,ANOVA 表中的组间差异检验结果(F 值、p 值)是一样的
    • 因为 ANOVA 关注的是整体均值差异,而不是具体对比方式
  • 回归系数的解释不同

    • 如果用默认的 contr.treatment,系数表示“某组 vs 基准组”的均值差异
    • 如果用 contr.helmert,系数表示“某组 vs 之前组均值”的差异
    • 如果用 contr.sum,系数表示“每组 vs 整体均值”的差异
  • 模型稳定性

    • 在实验设计(尤其是平衡设计)中,正交对比(contr.helmert / contr.poly)更合理,因为它们不相关,方差分解更清晰
    • 默认的 contr.treatment 并不是正交的,结果仍然正确,但在解释和某些辅助分析(如 Type I / II / III 方差分解)时可能不如正交对比直观

4️⃣ 举个例子

data(iris)
 
# 默认 contrasts
fit1 <- aov(Sepal.Length ~ Species, data=iris)
summary(fit1)
 
# 修改 contrasts
op <- options(contrasts = c("contr.helmert", "contr.poly"))
fit2 <- aov(Sepal.Length ~ Species, data=iris)
summary(fit2)
 
# 恢复默认
options(op)

对比结果:

  • ANOVA 表中的 F 值和 p 值一样
  • fit1 和 fit2 的系数不一样,解释方式不同

✅ 总结

  • 不设置 → 默认 contr.treatment,ANOVA 结果完全没问题,整体检验不受影响
  • 设置 contr.helmert / contr.poly → 更适合实验设计,保证对比正交,解释性更清晰
  • 区别主要体现在系数解释,而不是 F 检验结果

要不要我帮你画一个小表,把 常见 contrasts 的含义和适用场景(treatment / sum / helmert / poly)总结出来?