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

如何使用Scipy执行带δ阈值的两样本均值等效性t检验?

等效性t检验的实现方案

核心方法:双单侧t检验(TOST)

你需要的等效性检验通常采用**双单侧t检验(Two One-Sided Tests, TOST)**来实现,以下是基于Scipy和Statsmodels的两种内置函数方案,无需手动推导公式或查分布表。


方案一:基于Scipy实现TOST

Scipy的ttest_ind支持单侧检验(需版本≥1.7.0),通过拆分两个单侧检验完成等效性判断:

代码示例

import numpy as np
from scipy import stats

# 1. 准备样本数据(替换为你的实际数据)
sample1 = np.random.normal(loc=5.2, scale=1.0, size=100)
sample2 = np.random.normal(loc=5.0, scale=1.0, size=100)

# 2. 设置参数
delta = 0.5  # 等效边界
alpha = 0.05  # 显著性水平

# 3. 执行两个单侧检验
# 检验1:拒绝原假设H01: μ1 - μ2 ≤ -δ
t1, p1 = stats.ttest_ind(sample1, sample2 - delta, alternative='greater', equal_var=True)
# 检验2:拒绝原假设H02: μ1 - μ2 ≥ δ
t2, p2 = stats.ttest_ind(sample1, sample2 + delta, alternative='less', equal_var=True)

# 4. 判断等效性
if p1 < alpha and p2 < alpha:
    print(f"α={alpha}水平下,拒绝原假设,两样本均值满足等效性")
else:
    print(f"α={alpha}水平下,无法拒绝原假设,不认为两样本均值等效")

print(f"检验1 p值: {p1:.4f} | 检验2 p值: {p2:.4f}")

注意事项

  • 若两样本方差不等,将equal_var设为False,自动使用Welch's t检验
  • 若Scipy版本低于1.7.0,可手动转换单侧p值:将ttest_ind的双侧p值除以2,再根据t统计量符号调整(如alternative='greater'时,t>0则p=双侧p/2,t<0则p=1-双侧p/2)

方案二:基于Statsmodels直接调用TOST

Statsmodels提供了内置的TOST检验函数,无需手动拆分检验步骤,更便捷:

代码示例

import numpy as np
from statsmodels.stats.api import CompareMeans, DescrStatsW

# 1. 准备样本数据
sample1 = np.random.normal(loc=5.2, scale=1.0, size=100)
sample2 = np.random.normal(loc=5.0, scale=1.0, size=100)

# 2. 设置参数
delta = 0.5
alpha = 0.05

# 3. 执行TOST检验
cm = CompareMeans(DescrStatsW(sample1), DescrStatsW(sample2))
tost_result = cm.tost(lo=-delta, hi=delta, alpha=alpha)

# 4. 输出结果
print(f"TOST检验p值: {tost_result.pvalue:.4f}")
if tost_result.reject:
    print(f"α={alpha}水平下,拒绝原假设,两样本均值满足等效性")
else:
    print(f"α={alpha}水平下,无法拒绝原假设,不认为两样本均值等效")

说明

  • lo和hi分别对应等效区间的下限(-δ)和上限(δ)
  • 结果中的reject为True时,即表示拒绝原假设,支持等效性结论

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 14:53:08