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

PyPlot柱状图显示非预期值问题求助:二项分布检验功效函数绘制异常排查

解决二项分布检验功效函数绘制的异常问题

嘿,我看了你遇到的问题,咱们一步步拆解解决:

首先,你当前代码的两个核心问题

  1. 功效函数的逻辑偏差:你第二个代码里并没有计算真正的功效函数——功效函数是针对不同的真实概率p值,计算拒绝原假设的概率,而不是在同一个p=0.5下累积概率的补值。你现在的代码只是在处理单个p值下的分布尾巴概率,这和功效函数的定义不符。
  2. 柱状图的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 10:49:08