PyPlot柱状图显示非预期值问题求助:二项分布检验功效函数绘制异常排查
解决二项分布检验功效函数绘制的异常问题
嘿,我看了你遇到的问题,咱们一步步拆解解决:
首先,你当前代码的两个核心问题
- 功效函数的逻辑偏差:你第二个代码里并没有计算真正的功效函数——功效函数是针对不同的真实概率p值,计算拒绝原假设的概率,而不是在同一个p=0.5下累积概率的补值。你现在的代码只是在处理单个p值下的分布尾巴概率,这和功效函数的定义不符。
- 柱状图的x轴参数错误:你用
p_values(也就是p=0.5时的累积概率,0到1之间的小数)作为柱状图的x轴位置,这些值相邻间距极小,导致柱子挤在一起看起来重叠;至于x轴出现负值和大于1的情况,大概率是之前的绘图缓存没清干净,残留了其他绘图的轴范围,下次绘图前记得用plt.figure()创建新窗口或者plt.clf()清除缓存。
修正后的正确实现
首先明确:咱们的原假设是H0: p=0.5,单侧备择假设H1: p<0.5,从你第一个代码得到拒绝域是x≤6(当x≤6时拒绝H0,显著性水平α≈0.0577,接近你设定的0.1)。
下面是绘制功效函数的正确代码:
from scipy.stats import binom import numpy as np import matplotlib.pyplot as plt # 1. 定义检验参数 n = 20 p0 = 1/2 # 原假设的p值 rejection_threshold = 6 # 从你的第一个代码得到的拒绝域阈值 # 2. 生成一系列真实的p值(覆盖0到1的范围) p_values = np.linspace(0, 1, 21) # 步长0.05,共21个点 # 3. 计算每个真实p对应的功效值(拒绝原假设的概率) # 功效=P(X≤6 | n=20, p),也就是二项分布的累积分布函数值 power = [binom.cdf(rejection_threshold, n, p) for p in p_values] # 4. 绘制功效函数(设置合适的柱子宽度避免重叠) plt.figure(figsize=(10,6)) plt.bar(p_values, power, width=0.04) # 宽度匹配p值的步长,避免重叠 plt.axvline(x=p0, color='red', linestyle='-', label='原假设p0=0.5') plt.axhline(y=0.1, color='green', linestyle='--', label='显著性水平α=0.1') plt.xlabel('真实概率p') plt.ylabel('功效(拒绝原假设的概率)') plt.title('二项分布单侧检验的功效函数') plt.legend() plt.xlim(-0.02, 1.02) # 稍微扩展x轴范围,避免柱子被截断 plt.show()
代码解释
- 我们遍历了从0到1的多个真实p值,对每个p计算在拒绝域
x≤6下的拒绝概率,这才是功效函数的正确计算方式。 - 给柱状图设置了
width=0.04,和p值的步长0.05匹配,这样柱子就不会重叠了。 - 用
plt.figure()创建新的绘图窗口,彻底避免之前的绘图缓存干扰,解决x轴异常的问题。
如果你的备择假设是双侧的(比如H1: p≠0.5),只需要把功效值改成binom.cdf(lower_threshold, n, p) + (1 - binom.cdf(upper_threshold, n, p)),其中lower_threshold和upper_threshold是双侧拒绝域的上下界就行。
内容的提问来源于stack exchange,提问作者NearTheHere
相关产品推荐
相关产品推荐

