Условие
Дайте корректное определение p-value. Объясните, почему каждая из следующих формулировок — ошибочна:
- «p-value = вероятность того, что H₀ верна».
- «p = 0.04 значит, что в 96% случаев эффект настоящий».
- «Чем меньше p, тем сильнее эффект».
- «Если p > 0.05, эффекта нет».
Решение
Корректное определение
p-value = вероятность получить наблюдаемое или ещё более экстремальное значение статистики при условии, что нулевая гипотеза верна.
(Для двустороннего — P(|T| ≥ |t_obs| | H_0).) Это утверждение о данных при условии H₀, не о H₀ при условии данных.
Разбор ошибок
1. «p-value = P(H₀ | данные)».
Нет. Это байесов posterior, который требует prior. P-value — это P(данные | H₀). Перепутать P(A|B) и P(B|A) — base rate fallacy.
2. «p = 0.04 → в 96% эффект настоящий». Та же ошибка. Чтобы оценить P(эффект есть | данные), нужно умножить на prior эффекта и нормировать. Эмпирически: при низком prior (например, «90% запускаемых фич не имеют эффекта») «p<0.05» означает FDR (false discovery rate) > 30%, а не 5%.
3. «Меньше p — сильнее эффект». Не обязательно. P-value зависит от n и эффекта. Огромная выборка с маленьким эффектом даёт крошечный p. Маленькая выборка с большим эффектом — большой p. P-value — про уверенность в наличии, не про размер эффекта.
4. «p > 0.05 → эффекта нет».
Нет — «не нашли». Это Absence of evidence ≠ evidence of absence. p = 0.4 может означать «реально эффект есть, но мощности не хватило» (особенно при маленьком n).
Что показать вместо/помимо p-value
- Размер эффекта (Cohen's d, разница средних в нормированных единицах).
- Доверительный интервал для эффекта — показывает и значимость, и точность.
- Power проведённого теста (хотя «post-hoc power» — спорная практика).
- Bayes factor / posterior probability для bayesian интерпретации.
Симуляция «p-value под H₀»
import numpy as np
from scipy.stats import ttest_ind
ps = []
for _ in range(10000):
a = np.random.normal(0, 1, 100)
b = np.random.normal(0, 1, 100)
_, p = ttest_ind(a, b)
ps.append(p)
# Распределение p-value под H_0 — равномерное на [0, 1]
import matplotlib.pyplot as plt
plt.hist(ps, bins=30); plt.show()Под H₀ p-value равномерно распределено на [0, 1]. Это основа смысла «5% ложных тревог при α = 0.05».
Подводные камни
- «Сильная значимость» = «маленький p». Используйте «маленький p и большой эффект-сайз с узким CI».
- Считать «p = 0.049 значимо, p = 0.051 не значимо» как разные миры. Они почти идентичны — пороги условны.
- Multiple testing. 20 тестов при α=0.05 → ~64% шанс хотя бы одной ложной значимости. Корректируйте (Bonferroni, BH).
- «Большое n → p всегда маленький → всегда значимо». Это про статистическую значимость, не практическую. Спрашивайте «насколько эффект экономически значим».
- p-hacking — менять тесты/выборку/метрики до получения p < 0.05.
Эталонный ответ
p-value = P(данные ≥ наблюдённые | H₀). Это не P(H₀ | данные), не вероятность эффекта и не размер эффекта. Под H₀ p-value равномерно распределено. Маленький p говорит «несовместимо с H₀», но без CI и размера эффекта вывод неполный. Большое n → даже копеечные эффекты пробивают порог.