В случае проведения A/B/../N теста возникает проблема множественной проверки гипотез. Грубо говоря, если мы фиксируем уровень значимости как 0.05, то вероятность ошибки первого года (отклонение верной нулевой гипотезы) будет 5%. И если мы проводим сотню таких экспериментов, то раз 5 мы получим ошибочное принятие альтернативы. Такие проблемы возникают, например, если мы проверяем у людей наличие разных болезней. Берем выборку, берем сто болезней, получаем, что наши люди 5% болезней будто бы болеют. И, чтобы избежать таких оплошностей, математики придумали несколько фокусов.
Одну из иллюстраций проблемы подглядела тут и вот как она выглядит:
На что заменить уровень значимости?
Введем несколько обозначений. Предположим, что мы тестируем m разных гипотез. Посчитаем правильные решения и ошибки I и II рода и обозначим их разными буквами (см. таблицу).
\(H_0\) верна | \(H_0\) неверна | Всего | |
---|---|---|---|
Принимаем \(H_0\) | \(U\) | \(T\) (ошибки II рода) | \(W\) |
Отвергаем \(H_0\) | \(V\) (ошибки I рода) | \(S\) | \(R\) |
Всего | \(m_0\) | \(m-m_0\) | \(m\) |
При проверке единичной гипотезы мы все так же можем оперировать уровнем значимости и сравнивать его с полученным p-value. Ошибка I рода корректируется уровнем значимости, ошибка II рода может корректироваться размером выборки.
Напомним, что:
Но если гипотез много, то нам нужно придумать некую новую меру, с которой мы можем сравнивать некий набор p-value — по одному на каждую гипотезу. Таких мер обычно используется две:
- Familywise Error Rate, вероятность, что хотя бы одна \(H_0\) будет ложно отвергнута \(FWER = P(V>=1) \)
- False Discovery Rate, средняя доля ложно отвергнутых \(H_0\) среди всех отвергнутых \(H_0\), \(FDR = E(\frac{V}{R} | R>0)\)
Интуитивно понятно, что первая мера более жесткая, чем вторая. Зато работать с ней попроще.
\(FWER = P(V>=1) = 1 — P(V=0) = 1- (1-\alpha)^m\), где \(\alpha\) — уровень значимости для единичных гипотез.
Поправка Бонферонни
Поправка Бонфенонни предлагает сравнивать полученное p-value не с исходным \(\alpha\), а с \(\frac {\alpha}{m}\), где \(m\) — количество проверяемых гипотез. на тему поправки Бонферони можно почитать историю про мертвого лосося.
Приведем краткое доказательство законности метода:
\(FWER = P(V \geq 1) = P(\cup_{i=1}^{m} p_i \leq \frac{\alpha}{m}) \leq \sum_{i=1}^{m} P(p_i \leq \frac{\alpha}{m}) \leq m \frac{\alpha}{m} \)
Таким образом, для всего семейства гипотез уровень значимости фиксируется на уровне \(\alpha\)
Есть недостатки: при увеличении \(m\) начинает резко уменьшаться мощность, соответственно падают шансы отклонить неверные гипотезы.
Метод Холма-Бонферонни
Раз есть недостатки, то придумали новый метод. Он похож на предыдущий, но является итеративным и не портит мощность так сильно. Опишем, что нужно сделать по методу Холма-Бонферонни. Предположим, что гипотезы \(H_1, H_2, … H_m\) отсортированы по неубыванию их p-value \(p_1, p_2, … p_m\)
- Рассмотрим \(H_1\). Если \( p_1 \geq \frac {\alpha} {m} \), принимаем все гипотезы \(H_1, H_2, … H_m\) и останавливаемся. Иначе отвергаем \(H_1\) и переходим к проверке оставшихся гипотез с уровнем значимости \(\frac {\alpha}{m-1}\)
- Переходим к \(H_2\). Если \( p_2 \geq \frac {\alpha}{m-1}\), принимаем все гипотезы \(H_1, H_2, … H_m\) и останавливаемся. Иначе отвергаем \(H_2\) и переходим к проверке оставшихся гипотез с уровнем значимости \(\frac {\alpha}{m-2}\)
- Продолжаем, пока не кончатся гипотезы.
Доказано (Холмом), что такая процедура обеспечивает \(FWER \leq \alpha \)
Поправка Шидака
Как и в поправке Бонферонни, поправка Шидака корректирует \(\alpha\) (уровни значимости для проверки единичных гипотез). Она также сохраняет \(FWER \leq \alpha \)
Посчитаем, чему равна поправка Шидака.
\(P(V \leq 1) = 1 — P(V=0) \leq 1 -(1-\alpha_1)^m = \alpha \), где \(\alpha\) — заданный нами уровень значимости для семейства гипотез и \(\alpha_1\) — искомый уровень значимости для проверки каждой единичной гипотезы.
Выразим \(\alpha_1\) через \(\alpha\) и получим \(\alpha_1 = 1 — (1-\alpha)^{1/m}\)
Метод Шидака-Холма
Как и в предыдущем методе, где отметился Холм, используется итерационная корректировка p-value. Аналогично сортируем наши p-value по возрастанию и корректируем их согласно поправке Шидака:
\( \alpha_1 = 1 — (1-\alpha)^\frac {\alpha} {m} \)
…
\( \alpha_i = 1 — (1-\alpha)^\frac {\alpha} {m-i+1} \)
…
\( \alpha_m = \alpha \)
Обладает несколькими свойствами:
- Контролирует FWER на уровне значимости \(\alpha\), если статистики независимы в совокупности.
- Если статистики независимы в совокупности, нельзя построить контролирующую FWER на уровне \(\alpha\) процедуру мощнее, чем метод Шидака-Холма.
- При больших \(m\) мало отличается от метода Холма
Описанные методы реализованы в славной библиотеке statmodels.
from statsmodels.stats.multitest import multipletests reject, p_value_corrected, sidak_corr, bonf_corr = multipletests(p_values, alpha=0.05, method='Sidak')
В методе можно выбрать любой из описанных выше:
- method=’bonferroni’
- method=’holm’
- method=’sidak’
- method=’holm-sidak’
Метод возвращает:
- reject — булевский массив длины \(m\), в котором True — нулевую гипотезу можно отвергнуть и False — если нельзя
- pvals_corrected — массив длины \(m\) со скорректированными p-value
- alphacSidak — поправка Шидака
- alphacBonf — поправка Бонферонни
Продолжение следует…