两样本非劣效检验样本量计算及检验未检出差异的疑问
问题分析:非劣效性检验未检测到预期差异的原因
核心问题
需验证测试组安装率至少达到对照组的70%,通过statsmodels计算得出每组需约15000样本。实际观测中测试组安装率为对照组的85%,但z检验未检测到显著差异。
原样本量计算代码
alpha = 0.1 power = 0.80 p_A = 0.0056 # 对照组安装率 effect_size = sms.proportion_effectsize(p_A, p_A * 0.7) # 对照组的70%作为基准 # 计算单组样本量(单侧非劣效性检验) sample_size = sms.NormalIndPower().solve_power( effect_size, power=power, alpha=alpha, ratio=1, alternative='larger' # 检验方向:测试组率 >= 对照组的70% )
原检验代码的关键错误
- 篡改对照组观测数据:代码中
x_control = p_control * n_control * 0.7这一行错误地将对照组实际安装数替换为理论界值,完全违背了非劣效性检验的逻辑——我们需要对比的是测试组实际率与对照组实际率的70%,而非修改对照组样本数据。 - alpha值不一致:样本量计算使用的显著性水平是
alpha=0.1,但检验时却改用alpha=0.05,更严格的检验标准直接导致更难拒绝原假设。
修正后的检验代码
import statsmodels.stats.api as sms # 实际观测数据 x_test = 80 # 测试组安装数 n_test = 15015 # 测试组样本量 x_control = 101 # 对照组安装数 n_control = 15015 # 对照组样本量 # 计算对照组实际安装率 p_control = x_control / n_control # 非劣效界值:对照组实际率的70% non_inferiority_bound = p_control * 0.7 # 单样本比例z检验:对比测试组率与非劣效界值 stat, p_value = sms.proportions_ztest( count=x_test, nobs=n_test, value=non_inferiority_bound, alternative='larger' ) # 保持与样本量计算一致的alpha值 alpha = 0.1 print(f"Z统计量: {stat:.4f}, P值: {p_value:.4f}") if p_value < alpha: print("拒绝原假设:测试组安装率显著不低于对照组的70%") else: print("无法拒绝原假设:没有足够证据证明测试组安装率达到对照组的70%")
补充说明
- alpha一致性:样本量计算与检验必须使用相同的显著性水平,否则样本量的计算逻辑将失效。
- 低比例场景的检验选择:安装率属于极低比例(<1%),正态近似的z检验精度有限,可考虑使用
scipy.stats.binom_test进行精确检验,提升结果可靠性。
内容的提问来源于stack exchange,提问作者Kristina Aivazova
相关产品推荐
相关产品推荐

