在统计学中,当数据不满足正态分布或方差齐性假设时,传统的参数检验(如方差分析ANOVA)可能失效。此时,非参数检验方法(如秩检验)成为更可靠的选择。本文将详细介绍多独立样本秩检验的核心方法——Kruskal-Wallis检验,包括其理论基础、公式推导、案例分析及Python实现。
假设我们有 k k k 个独立样本 X 1 , X 2 , … , X k X_1, X_2, \dots, X_k X1,X2,…,Xk,每个样本包含 n i n_i ni 个观测值。我们需要检验这些样本是否来自相同的总体分布。
原假设:所有样本的总体分布相同
备择假设:至少有一个样本的总体分布不同
Kruskal-Wallis检验通过以下步骤实现:
H统计量公式:
H = 12 N ( N + 1 ) ∑ i = 1 k R i 2 n i − 3 ( N + 1 ) ( 1 ) H = \frac{12}{N(N+1)} \sum_{i=1}^k \frac{R_i^2}{n_i} - 3(N+1) \quad (1) H=N(N+1)12i=1∑kniRi2−3(N+1)(1)其中 N = ∑ i = 1 k n i N = \sum_{i=1}^k n_i N=∑i=1kni
打结处理:当存在相同数值时,使用修正公式:
H a d j = H 1 − ∑ j = 1 g ( t j 3 − t j ) N 3 − N ( 2 ) H_{adj} = \frac{H}{1 - \frac{\sum_{j=1}^g (t_j^3 - t_j)}{N^3 - N}} \quad (2) Hadj=1−N3−N∑j=1g(tj3−tj)H(2)其中 t j t_j tj 是第 j j j 个打结组的大小, g g g 是打结组数
当样本量较大时,H统计量近似服从自由度为 k − 1 k-1 k−1 的卡方分布。对于小样本,可采用精确检验或蒙特卡洛模拟。
假设所有样本来自同一总体,则每个样本的秩和期望为:
E ( R i ) = n i ( N + 1 ) 2 ( 4 ) E(R_i) = \frac{n_i(N+1)}{2} \quad (4) E(Ri)=2ni(N+1)(4)方差为:
Var ( R i ) = n i ( N + 1 ) ( N − n i ) 12 ( 5 ) \text{Var}(R_i) = \frac{n_i(N+1)(N - n_i)}{12} \quad (5) Var(Ri)=12ni(N+1)(N−ni)(5)
通过标准化秩和差,构造服从卡方分布的统计量:
H = 12 N ( N + 1 ) ∑ i = 1 k ( R i − E ( R i ) ) 2 Var ( R i ) ( 6 ) H = \frac{12}{N(N+1)} \sum_{i=1}^k \frac{(R_i - E(R_i))^2}{\text{Var}(R_i)} \quad (6) H=N(N+1)12i=1∑kVar(Ri)(Ri−E(Ri))2(6)展开后简化为式(1)。
当存在打结时,总体方差会减小,修正因子为:
Correction = 1 − ∑ j = 1 g ( t j 3 − t j ) N 3 − N ( 7 ) \text{Correction} = 1 - \frac{\sum_{j=1}^g (t_j^3 - t_j)}{N^3 - N} \quad (7) Correction=1−N3−N∑j=1g(tj3−tj)(7)因此,修正后的统计量为:
H a d j = H Correction ( 8 ) H_{adj} = \frac{H}{\text{Correction}} \quad (8) Hadj=CorrectionH(8)
某医院测试三种药物对患者的疗效评分(满分10分),数据如下:
药物A | 药物B | 药物C |
---|---|---|
7 | 5 | 3 |
8 | 6 | 4 |
9 | 7 | 5 |
6 | 8 | 2 |
原始数据:2,3,4,5,5,6,6,7,7,8,8,9
秩次: 1,2,3,4.5,4.5,6.5,6.5,8.5,8.5,10.5,10.5,12
import numpy as np
from scipy.stats import kruskal
data = [
[7,8,9,6],
[5,6,7,8],
[3,4,5,2]
]
# 手动计算秩次
combined = np.concatenate(data)
sorted_indices = np.argsort(combined)
ranks = np.empty_like(sorted_indices)
ranks[sorted_indices] = np.arange(1, len(combined)+1)
# 处理打结
unique_values = np.unique(combined)
for val in unique_values:
indices = np.where(combined == val)[0]
if len(indices) > 1:
avg_rank = np.mean(ranks[indices])
ranks[indices] = avg_rank
# 计算秩和
n = [len(d) for d in data]
ranks_split = np.split(ranks, np.cumsum(n)[:-1])
R = [np.sum(r) for r in ranks_split]
# 计算H统计量
N = sum(n)
H = (12 / (N*(N+1))) * np.sum([(ri**2)/ni for ri, ni in zip(R, n)]) - 3*(N+1)
# 打结修正
def tie_correction(ranks):
unique, counts = np.unique(ranks, return_counts=True)
return 1 - np.sum(counts**3 - counts) / (N**3 - N)
correction = tie_correction(ranks)
H_adj = H / correction
print(f"修正前H统计量: {H:.3f}, 修正后H统计量: {H_adj:.3f}")
方法 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
Kruskal-Wallis | 多独立样本非参数检验 | 无需分布假设 | 小样本效率较低 |
ANOVA | 正态分布且方差齐性的参数检验 | 统计效力高 | 对分布假设敏感 |
Friedman | 相关样本检验 | 处理重复测量数据 | 依赖秩次转换 |
Kruskal-Wallis检验是处理多独立样本非参数检验的重要工具。通过秩次转换,它能够有效克服数据分布的限制,在医学、社会科学等领域有广泛应用。实际应用中需注意数据预处理和多重比较问题,结合专业背景进行结果解读。