Testy wielokrotnych porównań

Testy A/B w Pythonie

Moe Lotfy, PhD

Principal Data Science Manager

Wprowadzenie do problemu wielokrotnych porównań

  • Pojedyncze porównanie:
    • Kontrola (A) vs. leczenie (B)
    • Jedna metryka
    • Brak podkategorii

 

Wykres słupkowy średniej sprzedaży dla dwóch wariantów.

  • Wielokrotne porównania:
    • Wiele wariantów (testy A/B/n)
    • Wiele metryk
    • Szczegółowe kategorie

 

Dwa wykresy słupkowe z wieloma wariantami i metrykami.

Testy A/B w Pythonie

Wskaźnik błędów rodzinnych

  • P(błąd I rodzaju) = $\alpha$ = 0,05
  • P(brak błędu I rodzaju) = 1 - $\alpha$
  • P(brak błędu I rodzaju w m testach) = (1 - $\alpha$)$^m$
  • P(co najmniej jeden błąd I rodzaju w m testach) = 1 - (1 - $\alpha$)$^m$ = FWER

Wskaźnik błędów rodzinnych (FWER): prawdopodobieństwo popełnienia co najmniej jednego błędu I rodzaju przy wielokrotnym testowaniu hipotez.

  • Dla jednego testu: FWER = 1 - (1 - $\alpha$)^1 = $\alpha$ = 0,05
  • Co jednak, gdy przeprowadzamy więcej niż jeden test?
Testy A/B w Pythonie

Wskaźnik błędów rodzinnych

import matplotlib.pyplot as plt 
import numpy as np 
alpha = 0.05 
x = np.linspace(0, 20, 21) 
y = 1-(1-alpha)**x 
plt.plot(x,y, marker='o') 
plt.title('FWER vs Number of Tests') 
plt.xlabel('Number of Tests') 
plt.ylabel('FWER') 
plt.show()
  • FWER = 1 - (1 - $\alpha$)^10
  • FWER dla 10 testów = 40%

Wykres liniowy FWER jako funkcja liczby testów. FWER rośnie wraz ze wzrostem liczby testów.

Testy A/B w Pythonie

Metody korekcji

  • Najprostsza i najpopularniejsza metoda to korekcja Bonferroniego
  • Skorygowane $\alpha$* = indywidualne $\alpha$ podzielone przez liczbę testów m

Równanie korekcji Bonferroniego. Alfa podzielona przez liczbę porównań 'm'

  • Mniej rygorystyczna korekcja Šidáka
  • Ustalić FWER na poziomie $\alpha$, następnie wyznaczyć $\alpha_s$

Równanie korekcji Šidáka

Testy A/B w Pythonie

Przykład korekcji Bonferroniego

  • Bez korekcji wszystkie trzy testy są istotne
    • lecz prawdopodobieństwo błędu I rodzaju wynosi 14%
  • Po korekcji Bonferroniego A vs. D nie jest już istotne, a FWER wynosi 0,049

Wykres słupkowy średniej sprzedaży dla 4 wariantów z wartościami p.

Testy A/B w Pythonie

Metoda multipletests w statsmodels

import statsmodels.stats.multitest as smt 
pvals = [0.023,0.0005,0.00004]
corrected = smt.multipletests(pvals, alpha=0.05, method='bonferroni')
print("Significant Test:", corrected[0])
print("Corrected P-values:", corrected[1])
print("Bonferroni Corrected alpha: {:.4f}".format(corrected[3]))
Significant Test: [False  True  True]
Corrected P-values: [0.069   0.0015  0.00012]
Bonferroni Corrected alpha: 0.0167
Testy A/B w Pythonie

Czas na ćwiczenia!

Testy A/B w Pythonie

Preparing Video For Download...