Biorąc pod uwagę listę wartości p wygenerowanych z niezależnych testów, posortowanych w porządku rosnącym, można zastosować procedurę Benjamini-Hochberga do wielokrotnej korekty testu . Dla każdej wartości p procedura Benjamini-Hochberg umożliwia obliczenie współczynnika fałszywego wykrywania (FDR) dla każdej z wartości p. Oznacza to, że w każdej „pozycji” na posortowanej liście wartości p powie ona, jaka część z nich prawdopodobnie będzie fałszywym odrzuceniem hipotezy zerowej.
Moje pytanie brzmi: czy te wartości FDR należy nazywać „ wartościami q ”, „ poprawionymi wartościami p ”, czy też czymś zupełnie innym?
EDYCJA 2010-07-12: Chciałbym dokładniej opisać używaną procedurę korekcji. Najpierw sortujemy wyniki testu w porządku rosnącym według ich nieskorygowanej oryginalnej wartości p. Następnie iterujemy listę, obliczając to, co interpretuję jako „oczekiwany FDR, gdybyśmy odrzucili hipotezę zerową dla tego i wszystkich testów wcześniejszych na liście”, używając korekcji BH, z wartością alfa równą obserwowanemu , nieskorygowana wartość p dla odpowiedniej iteracji. Następnie, jako to, co nazywamy naszą „wartością q”, przyjmujemy maksimum poprzednio skorygowanej wartości (FDR przy iteracji i - 1) lub bieżącej wartości (w i), aby zachować monotoniczność.
Poniżej znajduje się kod Pythona reprezentujący tę procedurę:
def calc_benjamini_hochberg_corrections(p_values, num_total_tests):
"""
Calculates the Benjamini-Hochberg correction for multiple hypothesis
testing from a list of p-values *sorted in ascending order*.
See
http://en.wikipedia.org/wiki/False_discovery_rate#Independent_tests
for more detail on the theory behind the correction.
**NOTE:** This is a generator, not a function. It will yield values
until all calculations have completed.
:Parameters:
- `p_values`: a list or iterable of p-values sorted in ascending
order
- `num_total_tests`: the total number of tests (p-values)
"""
prev_bh_value = 0
for i, p_value in enumerate(p_values):
bh_value = p_value * num_total_tests / (i + 1)
# Sometimes this correction can give values greater than 1,
# so we set those values at 1
bh_value = min(bh_value, 1)
# To preserve monotonicity in the values, we take the
# maximum of the previous value or this one, so that we
# don't yield a value less than the previous.
bh_value = max(bh_value, prev_bh_value)
prev_bh_value = bh_value
yield bh_value