统计推断——假设检验——python代码实现“功效”计算——以检验均值差为例

本文探讨了假设检验中的两类错误——误报率和漏报率的概念,解释了它们的计算方法,以及如何通过模拟数据来评估误报率。同时,文章介绍了功效的概念,讨论了如何通过调整阈值和数据分区等策略来应对多重检验问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两类错误

在经典假设检验中,如果p值低于某个阈值(常用阈值α=5%),那么我们认为一个效应是具有统计学意义的(是显著的),这个过程产生两个问题:

  • 如果一个效应的确是偶然发生的,那么我们将它误判为统计显著的概率是多少?这个概率就是误报率(false positive rate)。
  • 如果一个效应不是偶然的,那么假设检验失败的概率是多少?这个概率称为漏报率(false negative rate)。

相对而言,漏报率比较容易统计,如果阈值α=5%,那么漏报率就是5%,理由如下:

  • 如果效应不为真,那么原假设成立,因此,通过模拟原假设就可以计算检验统计量的分布,我们将这个分布称为CDF_{T}
  • 重复运行试验,每次得到一个CDF_{T}的测试统计量t。随后,我们计算出p值,p值是CDF_{T}中随机值大于t的概率,即为1-CDF_{T}(t)
  • CDF_{T}(t)大于95%,即t大于第95百分秩时,p值小于5%。而CDF_{T}中随机抽取的值大于第95百分秩的概率是多少呢?是5%。

因此,如果你进行一个阈值为5%的假设检验,20次里会有1次漏报。

功效

误报率收到实际效应大小的影响,而我们通常无法得到实际效应的大小,因此误报率较难计算。一个办法是计算一个假定效应大小的误报率。如果我们假设观测到的组间差异是准确的,那么可以以观测样本为总体模型,使用模拟数据运行假设检验。

中心思想:

  • 假设观测到的组间样本存在差异是确实存在的。
  • 将两个样本分别进行有放回的随机抽样,组成新的样本,新样本和原样本元素个数相等。
  • 对新样本进行假设检验,验证新样本是否有差异。
  • 重复2、3步骤100次,计算检验结果为无差异(p>0.05)的次数。
  • “检验结果为无差异(p>0.05)的次数”除以100次,即为误报率(注意:此误报率是在确定样本存在差异的条件下)

python代码:

#导入数据
live,firsts,others=first.MakeFrames()

import collections

#有放回抽样,抽取等长度的序列
def Resample(xs):
    return np.random.choice(xs,len(xs),replace=True) 

#将两个样本中的元素混合打散。
def RunModel(group1,group2): 
    m,n=len(group1),len(group2)
    pool=np.hstack((group1,group2)) #将两个Series前后拼接成一组
    np.random.shuffle(pool)  #将拼接后的数组中的元素打散,重新排列。
    data=pool[:m],pool[m:]  #将数组重新划分成两个数组
    return data

#计算每次重新划分之后的均值之差。
def TestStatistic(data):
    group1,group2=data
    di=abs(group1.mean()-group2.mean())
    return di

#计算误报次数,即p值大于0.5的次数(差异不显著的次数),处于100次,得出误报率。
def FalseNegRate(group1,group2,num_runs=100):
    count=0
    for i in range(num_runs):
        sample1=Resample(group1)
        sample2=Resample(group2)
        
        ht=[TestStatistic(RunModel(sample1,sample2)) for _ in range(101)]
        b=sum(1 for x in ht if x>=abs(sample1.mean()-sample2.mean())) #计算比当前情况乃至更差情况出现的次数
        p_value=b/101
        if p_value>0.05:
            count+=1
    return count/num_runs  
FalseNegRate(firsts['prglngth'],others['prglngth'])

输出:

0.68

结果约为70%,这个结果说明,如果妊娠时间均值的实际差异为0.78周,那么我们预期,如果使用这个规模的样本进行试验,结果有70%的可能性为误报,同样,我们预期检验通过的可能性只有30%。称为“功效”,有的时候也称为“敏感度”。这个值反映了一个检验检测出指定大小效应的能力。

在上面这个示例中,检验结果通过的可能性只有30%(假设实际差异为0.78周)。一般来说,我们认为功效超过80%才是我们能够接受的,因此,示例中的检验属于“低功效”的。

通常,假设检验失败并不说明两个群组之间不存在差异,而是说,如果差异的确存在的话,这个差异太小,以至于无法在这种规模的样本中检验到。

如何验证错误

1、多重检验

如果你运行一个假设检验,那么误报的可能性约为1/20,还在可接受范围内。但是如果运行20个检验,那么在大多数情况下,你至少应该预期得到一次误报。

其次使用同一个数据集进行探索分析和检验分析,会天然降低误报的可能性。

如果要弥补多重检验的问题。你可以通过以下方式:

  • 调整阈值α。
  • 将数据分区,一部分数据用来探索,一部分数据用来检验。

2、复现

通常我们也可以通过重现别人发表的结果,间接解决问题,通常,人们将某一个新发现的第一篇论文视为探索性的,使用新数据复现该结果的后续论文则为验证性的。

如果,原始数据中多有统计显著的效应,在新数据中都得到了复现,证明探索性的结果是有说服力的。

 

 

 

### 如何在Python中进行假设检验和置信区间计算 #### 所需库 为了执行假设检验计算置信区间,通常会依赖于一些特定的Python库。这些库提供了统计测试的功能以及数据处理的能力。 - `numpy` 和 `pandas`: 这两个库用于高效的数据操作与分析[^3]。 - `scipy.stats`: 提供了多种概率分布函数和支持各种类型的统计推断方法,包括t检验和其他形式的假设检验[^2]. #### 脚本实现 下面是一个简单的子展示如何利用上述提到的库来进行两独立样本T检验,并基于此构建95%的置信区间: ```python import numpy as np from scipy import stats import pandas as pd # 假定我们有两个不同条件下的花瓣长度测量值列表 group1 = [1.4, 1.5, 1.7, 1.8, 1.6] group2 = [1.9, 2.0, 2.1, 2.2, 2.3] # 将其转换成Pandas Series对象以便更好地管理 series_group1 = pd.Series(group1) series_group2 = pd.Series(group2) # 执行双侧T检验 t_statistic, p_value = stats.ttest_ind(series_group1, series_group2) # 输出T统计量及其对应的P值 print(f"T-statistic: {t_statistic}, P-value: {p_value}") # 计算平均数的标准误(SEM),这里假设有相同样本大小n=5 sem_diff = (np.std(series_group1)/len(series_group1)**0.5) - \ (np.std(series_group2)/len(series_group2)**0.5) # 获取自由度df=(n1+n2)-2 degrees_of_freedom = len(series_group1)+len(series_group2)-2 # 查找对应于给定显著性水平α/2(即0.025)下临界t值 critical_t = abs(stats.t.ppf(q=0.025, df=degrees_of_freedom)) # 构建95% CI上下限 ci_lower_bound = (series_group1.mean()-series_group2.mean())-(critical_t*sem_diff) ci_upper_bound = (series_group1.mean()-series_group2.mean())+(critical_t*sem_diff) print(f"95% Confidence Interval [{ci_lower_bound:.4f},{ci_upper_bound:.4f}]") ``` 这段代码首先定义了两个组别的观测数据作为输入;接着通过调用SciPy中的`ttest_ind()` 函数完成对这两个群体间是否存在显著异性的评估;最后根据所得的结果来估计两者之间真实距所在的可信区域——也就是所谓的“置信区间”。 #### 结果输出 运行以上程序将会得到如下所示的信息: - T统计量(T-statistic): 表明观察到的效果强度; - P值(P-value): 描述该效果发生的几率有多低,在零假设成立的情况下; - 置信区间的边界:表示对于所研究变量的真实效应有多大把握位于这一范围内。 #### 总结 当涉及到使用Python进行假设检验时,主要依靠像Scipy这样的科学计算包所提供的工具集。而关于置信区间的理解,则是指当我们重复抽样时能够覆盖实际参数的比。在这个案里,如果进行了无数次实验,那么大约有95%的时间我们的CI应该能捕捉住真实的均值[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xia ge tou lia

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值