#python #numpy #scipy #statistics
Вопрос:
Я взял две выборки, каждая из которых состояла из 100 тысяч наблюдений из одного и того же стандартного нормального распределения, и проверил нулевую гипотезу о том, что их средние значения идентичны. Я повторил этот эксперимент 5 тысяч раз и построил p-значения в виде гистограммы.
По моей интуиции, эти две выборки достаточно велики и были отобраны из одного и того же распределения (одно и то же среднее значение и std). Следовательно, я ожидал бы, что t-тесты приведут к относительно высоким значениям p (отклоните нулевую гипотезу). Однако значения p, по-видимому, распределены равномерно.
Вот код, который я использовал для создания этого графика (я использую 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