如何用Anderson Darling检验法检验Gamma、Weibull、指数分布的拟合优度
使用Anderson-Darling检验进行Gamma、Weibull和指数分布的拟合优度检验
Anderson-Darling(AD)检验是一种加权拟合优度检验,通过对比样本经验分布函数与理论分布函数的差异,评估样本是否来自指定分布。它对分布尾部的拟合差异更为敏感,适合Gamma、Weibull和指数这类偏态分布的检验。
通用检验流程
所有分布的AD检验都遵循以下核心步骤:
- 参数估计:从样本数据中拟合目标分布的未知参数(如Gamma的形状/尺度、Weibull的形状/尺度)。
- 计算AD统计量:基于估计后的理论分布,计算样本经验分布与理论分布的加权平方差。
- 假设检验:将统计量与临界值对比,或通过p值判断是否拒绝“样本来自该理论分布”的原假设(通常以0.05为显著性水平)。
针对各分布的具体实现(Python示例)
以下使用scipy.stats库完成检验,代码可直接复用。
1. Gamma分布检验
Gamma分布需估计形状(a)和尺度(scale)参数,通常固定位置参数为0。
import numpy as np from scipy import stats # 替换为你的真实样本数据 data = stats.gamma.rvs(a=2, scale=3, size=100, random_state=42) # 步骤1:估计Gamma分布参数(固定位置参数loc=0) shape, loc, scale = stats.gamma.fit(data, floc=0) # 步骤2:执行AD检验 ad_result = stats.anderson(data, dist='gamma', args=(shape, loc, scale)) # 步骤3:解读结果 print(f"AD统计量: {ad_result.statistic:.4f}") print("临界值(对应显著性水平):") for sig, crit in zip(ad_result.significance_level, ad_result.critical_values): print(f" {sig}%: {crit:.4f}") # 部分scipy版本支持直接输出p值 if hasattr(ad_result, 'pvalue'): print(f"p值: {ad_result.pvalue:.4f}")
- 判断逻辑:若AD统计量大于对应显著性水平的临界值(或p值<0.05),则拒绝原假设,认为样本不来自Gamma分布。
2. Weibull分布检验
Weibull分布需估计形状(c)和尺度(scale)参数,同样固定位置参数为0。
# 替换为你的真实样本数据 data = stats.weibull_min.rvs(c=1.5, scale=5, size=100, random_state=42) # 步骤1:估计Weibull分布参数(固定位置参数loc=0) shape, loc, scale = stats.weibull_min.fit(data, floc=0) # 步骤2:执行AD检验 ad_result = stats.anderson(data, dist='weibull_min', args=(shape, loc, scale)) # 步骤3:解读结果 print(f"AD统计量: {ad_result.statistic:.4f}") print("临界值(对应显著性水平):") for sig, crit in zip(ad_result.significance_level, ad_result.critical_values): print(f" {sig}%: {crit:.4f}") if hasattr(ad_result, 'pvalue'): print(f"p值: {ad_result.pvalue:.4f}")
- 注意:
scipy中Weibull分布对应dist='weibull_min',参数顺序为(形状、位置、尺度)。
3. 指数分布检验
指数分布是Gamma(形状=1)和Weibull(形状=1)的特例,仅需估计尺度参数。
# 替换为你的真实样本数据 data = stats.expon.rvs(scale=4, size=100, random_state=42) # 步骤1:估计指数分布参数(固定位置参数loc=0) loc, scale = stats.expon.fit(data, floc=0) # 步骤2:执行AD检验 ad_result = stats.anderson(data, dist='expon', args=(loc, scale)) # 步骤3:解读结果 print(f"AD统计量: {ad_result.statistic:.4f}") print("临界值(对应显著性水平):") for sig, crit in zip(ad_result.significance_level, ad_result.critical_values): print(f" {sig}%: {crit:.4f}") if hasattr(ad_result, 'pvalue'): print(f"p值: {ad_result.pvalue:.4f}")
关键注意事项
- 参数估计必须基于样本数据,不能使用预设的理论参数,否则检验结果无意义。
- 不同统计工具的参数顺序可能存在差异(如R语言的
goftest::ad.test),需对应调整参数输入。 - 拟合优度检验的结论是“不能拒绝原假设”而非“接受原假设”,即仅能说明数据与目标分布无显著差异,而非完全符合。
内容的提问来源于stack exchange,提问作者Daisha
相关产品推荐
相关产品推荐

