среда, 10 июля 2024 г.

Множественная проверка гипотез

Ситуация множественного сравнения возникает каждый раз, когда нужно провести несколько параллельных стат-тестов на одном и том же наборе данных.

При выполнении множественного тестирования возникает серьёзная проблема — быстрый рост вероятности допустить ошибку первого рода хотя бы в одном из тестов.

FWER=1(1α)m (family-wise error rate)

 график для α=0.05



FWER напрямую зависит от уровня значимости α и числа проводимых тестов. Чтобы снизить FWER, можно, прежде всего, уменьшить число тестов. Если же число тестов уменьшить нельзя, то аналитику остаётся понизить уровень значимости α. Такую операцию называют коррекцией уровня значимости.

Для чего проводится коррекция уровня значимости. Допустим, Вася сравнивает две пары городов, используя один набор данных: Самару с Владивостоком и Самару с Томском. Вася заранее устанавливает уровень значимости α=0.05. Вася ожидает, что ошибётся в 5% случаев. Но в ситуации множественных сравнений вероятность ошибки будет не 0.05, а FWER=1−(1−α)2=0.0975. То есть Вася может ошибиться не в 5% случаев, как он ожидает, а в 9.75% случаев — почти в два раза чаще. Задача Васи в том, чтобы выбрать такой уровень значимости α, при котором FWER станет равным 0.05.

Поправка Бонферрони

αcorr=α/m

m - количество проводимых тестов
для двух тестов m=2 и уровне значимости в 5% αcorr=0.025:

FWER=1(1αcorr)m = 1(10.025)2=0.05


Метод Шидака

αcorr=1(1α
)
1/m


Метод Холма

метод Холма — итерационный. То есть рассчитывается не единый уровень αα для всех тестов, а новый для каждого из тестов. Формула расчёта уровней коррекции выглядит так



Видно, что коррекция уровня значимости по методу Холма даёт более высокие значения скорректированных уровней значимости, чем при применении методов Бонферрони и Шидака. Это позволяет одновременно и понизить FWER, и повысить мощность теста.



import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

   
# подготавливаем данные
report = pd.DataFrame()
report['m'] = pd.Series([2, 3, 4, 5, 6, 7, 8, 9, 10]) # число тестов
report['alpha'] = 0.05 # исходный уровень значимости

# считаем поправки
report['Метод Бонферрони'] = report['alpha'] / report['m'] 
report['Метод Шидака'] = 1 - (1 - report['alpha']) ** (1 / report['m'])

# рассчитываем поправку Холма
def holm_correction(row):
    m, alpha = int(row['m']), row['alpha'] # число тестов и уровень значимости
    result = []
    for i in range(m): # получаем номер текущего теста и считаем коррекцию 
        result += [alpha / (m - i)]
    return result

# поскольку поправка Холма возвращает много результатов - возьмём среднее по ним
report['Поправки Холма'] = report.apply(holm_correction, axis=1)
report['Средний ур. знач. при поправке Холма'] = report['Поправки Холма'].apply(np.mean) # считаем средний уровень значимости с учётом поправки Холма
print(report)

# строим график
report.set_index('m')[['Метод Бонферрони', 'Метод Шидака', 'Средний ур. знач. при поправке Холма']].plot(grid=True)
    
# подписываем оси
plt.xlabel('Число тестов'), plt.ylabel('Уровень значимости')
plt.legend(title = 'Метод коррекции'), plt.title('Скорректированные уровни значимости')
plt.show()

На практике чаще всего применяют коррекцию Бонферрони — из-за простоты, но можно применять и коррекцию Холма, поскольку она более «щадящая» по отношению к мощности теста. 

Cкорректированный уровень значимости стремится к 0. Например, если посчитать коррекцию методом Бонферрони для 1000 тестов, то получится, что уровень значимости должен быть равен 0.00005. 

На практике это означает, что с таким низким уровнем значимости мы практически всегда будем оказываться в ситуации, когда нулевая гипотеза не отвергается и, возможно, будем совершать частые ошибки второго рода (то есть пострадает мощность теста). Это может произойти даже при коррекции для десяти сравнений и выше.

Казалось бы, кому может понадобиться проводить десятки, сотни или даже тысячи тестов? Но такие ситуации в бизнесе возникают довольно часто. Например, маркетологи могут сравнивать одновременно десятки и сотни рекламных кампаний, а генетики — проводить тысячи одновременных генетических тестов. В таких ситуациях коррекции Бонферрони и Шидака (и даже их более продвинутые аналоги) не смогли бы помочь.

Чтобы справиться с этой проблемой, придумали специальные тесты для множественного сравнения гипотез:
  • ANOVA — аналог t-теста для ситуаций сравнения трёх и более выборок;
  • χ2-тест (читается «хи-квадрат») на независимость для сравнения пропорций, долей и шагов воронок — аналог z-теста для пропорций. Обратите внимание, что существует целое семейство тестов χ2, использующихся для самых разных целей. Для сравнения пропорций используется только тест на независимость (test of independence/association);
  • Тест Краскела-Уоллиса — аналог теста Манна-Уитни для ситуации множественных сравнений. С тестом Манна-Уитни вы познакомитесь в следующей теме.

Комментариев нет:

Отправить комментарий