微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

来自 t 检验的 p 值的意外分布

如何解决来自 t 检验的 p 值的意外分布

我抽取了两个样本,每个样本都包含来自相同标准正态分布的 100K 观测值,并测试了它们的均值相同的原假设。我将这个实验重复了 5000 次,并在直方图中绘制了 p 值。

根据我的直觉,这两个样本足够大,并且是从相同的分布(相同的均值和标准差)中采样的。因此,我希望 t 检验会产生相对较高的 p 值(拒绝零假设)。然而,p 值似乎是均匀分布的。

Histogram of p-values for 5000 t-tests on two randomly generated normal distributions with n=100000,mu=0,sig=1

这是我用来创建这个图的代码(我使用的是 numpy 1.19.2,scipy 1.4.1):

from scipy import stats
import numpy as np

ps = []
for i in range(5000):
    gaussian_numbers = np.random.normal(0,1,size=100000)
    gaussian_numbers2 = np.random.normal(0,size=100000)
    t,p = stats.ttest_ind(gaussian_numbers,gaussian_numbers2,equal_var=True)
    ps.append(p)
plt.hist(ps,100)

如您所见,我在整个值范围 [0,1] 中获得了或多或少均匀的 p 值分布。

谁能告诉我我的想法有什么缺陷?你能复制这个吗?

解决方法

所以我希望 t 检验会产生相对较高的 p 值,或者倾向于较高的 p 值。

您的期望不正确。您的输入满足 t 检验的“零假设”:它们来自具有相同均值的总体。通常,当执行假设检验(例如 t 检验)并且输入满足零假设时,distribution of the p-value 在区间 [0,1] 上是一致的。所以你的情节是你反复测试的预期结果。

,

您正在从同一分布中抽取两个随机样本并计算 t 统计量以检验均值相同的原假设。

没有理由认为 p 值的分布应该接近于 1,因为样本是随机的。要理解这一点,请考虑置信区间。

置信区间告诉您 (1 - alpha) * 100% 的时间,真实参数将位于观察区间内。同样,您的 p 值在大约 5% 的时间内位于 0 和 0.05 之间。

换句话说:

# Convert `ps` to numpy array
ps = np.array(ps)
# Check how many times you rejected H0
print('We rejected H0',(ps <= 0.05).sum(),'times out of',len(ps))
print('We did not reject H0',(ps > 0.05).sum(),len(ps))

哪个返回:

我们在 5000 次中拒绝了 H0 246 次

我们没有拒绝 H0 5000 次中的 4754 次

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。