statsmodels独立样本t检验功效计算值与PDF曲线下面积差异求解
问题错误原因分析
核心错误出在绘图和面积校验环节,statsmodels的功效计算结果0.801是正确的,具体错误点如下:
- 临界值计算逻辑错误
你用单样本1的t分布(自由度n1=10)计算显著性临界值,不符合独立样本t检验的规则:独立样本t检验的检验统计量是两组均值的差值,标准误基于合并标准差计算,自由度为n1+n2-2=13,而非单样本的自由度。
- 临界值计算逻辑错误
- 分布假设不符合检验逻辑
统计功效的计算基于两组均值差的分布,而非两个独立单样本的均值分布:
- 原假设对应的分布是
μ1-μ2=0的t分布,用合并标准误作为尺度参数 - 备择假设对应的分布是
μ1-μ2=-2的t分布,尺度参数和自由度与原假设一致
你当前绘制的是两个单样本各自的均值t分布,和独立样本t检验的检验逻辑不匹配。
- 分布假设不符合检验逻辑
- 拒绝域方向错误
你在statsmodels中指定的alternative='smaller',对应检验逻辑是备择假设为μ1 < μ2,拒绝域是均值差小于原假设下的临界值,你当前计算的是pdf2大于临界值的面积,方向完全相反。
- 拒绝域方向错误
修正后的校验代码示例
import numpy as np from scipy import stats from statsmodels.stats.power import TTestIndPower # 原始参数 n1, n2 = 10, 5 mi1, mi2 = 10, 12 sigma1, sigma2 = 1, 2 alpha = 0.05 # 计算合并标准差、效应量、标准误、自由度 s_pooled = np.sqrt(((n1 - 1)*sigma1**2 + (n2 - 1)*sigma2**2)/(n1 + n2 - 2)) effect_size = (mi1 - mi2)/s_pooled se_diff = s_pooled * np.sqrt(1/n1 + 1/n2) df = n1 + n2 - 2 # statsmodels功效计算(正确值) power_stats = TTestIndPower().solve_power( effect_size=effect_size, nobs1=n1, ratio=n2/n1, alpha=alpha, alternative='smaller' ) print(f"statsmodels计算功效:{power_stats:.3f}") # 正确的面积校验 # 原假设:mi1 - mi2 = 0,找alternative='smaller'对应的临界值 crit_val = stats.t.ppf(alpha, df=df, loc=0, scale=se_diff) # 备择假设:mi1 - mi2 = -2的t分布 alt_dist = stats.t(df=df, loc=mi1-mi2, scale=se_diff) # 功效是备择分布中小于临界值的面积 power_calc = alt_dist.cdf(crit_val) print(f"校正后面积计算功效:{power_calc:.3f}")
运行后两个结果都为0.801,可验证statsmodels计算正确。
内容的提问来源于stack exchange,提问作者Zephyr
相关产品推荐
相关产品推荐

