来自ttest的PV值的意外分布

2024-04-29 04:24:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我采集了两个样本,每个样本由来自同一标准正态分布的100K个观测值组成,并检验了它们的均值相同的无效假设。我重复这个实验5K次,并将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, 1, size=100000)
    t, p = stats.ttest_ind(gaussian_numbers, gaussian_numbers2, equal_var=True)
    ps.append(p)
plt.hist(ps, 100)

正如你所看到的,我得到了在整个值范围[0,1]中p值的大致均匀分布

有人能告诉我我思想上的缺陷吗?你能复制这个吗


Tags: importnumpy标准sizestatsnprandomscipy
2条回答

So i'd expect, that the t-test results in relatively high p-values, or a tendency to high p-values.

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

从同一分布中随机抽取两个样本,计算t统计量,以检验均值相同的无效假设

因为样本是随机的,所以没有理由将p值分布得更接近1。要理解这一点,请考虑置信区间

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

换言之:

# 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(), 'times out of', len(ps))

返回:

We rejected H0 246 times out of 5000

We did not reject H0 4754 times out of 5000

相关问题 更多 >