Неожиданное распределение значений p по результатам t-теста

#python #numpy #scipy #statistics

Вопрос:

Я взял две выборки, каждая из которых состояла из 100 тысяч наблюдений из одного и того же стандартного нормального распределения, и проверил нулевую гипотезу о том, что их средние значения идентичны. Я повторил этот эксперимент 5 тысяч раз и построил p-значения в виде гистограммы.

По моей интуиции, эти две выборки достаточно велики и были отобраны из одного и того же распределения (одно и то же среднее значение и std). Следовательно, я ожидал бы, что t-тесты приведут к относительно высоким значениям p (отклоните нулевую гипотезу). Однако значения p, по-видимому, распределены равномерно.

Гистограмма p-значений для 5000 t-тестов на двух случайно сгенерированных нормальных распределениях с 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)
 

Как вы можете видеть, я получаю более или менее равномерное распределение значений p по всему диапазону значений [0, 1].

Может ли кто-нибудь сказать мне, в чем недостаток моего мышления? Можете ли вы повторить это?

Ответ №1:

Поэтому я ожидал бы, что t-тест приведет к относительно высоким значениям p или тенденции к высоким значениям p.

Ваши ожидания не верны. Ваши входные данные удовлетворяют «нулевой гипотезе» t-теста: они получены из популяций с одинаковым средним значением. В целом, при выполнении проверки гипотез, такой как t-тест, и входные данные(ы) удовлетворяют нулевой гипотезе, распределение значения p равномерно на интервале [0, 1]. Таким образом, ваш сюжет является ожидаемым результатом ваших повторных тестов.

Ответ №2:

Вы берете две случайные выборки из одного и того же распределения и вычисляете t-статистику, чтобы проверить нулевую гипотезу о том, что средние значения идентичны.

Нет никаких причин, по которым значения p должны быть распределены ближе к 1, поскольку выборки являются случайными. Чтобы понять это, подумайте о доверительных интервалах.

Доверительный интервал говорит вам, что (1 — альфа) * в 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))
 

Который возвращает:

Мы отвергли H0 246 раз из 5000

Мы не отвергали H0 4754 раза из 5000