Dato un elenco di valori p generati da test indipendenti, ordinati in ordine crescente, è possibile utilizzare la procedura Benjamini-Hochberg per la correzione multipla dei test . Per ciascun valore p, la procedura Benjamini-Hochberg consente di calcolare il False Discovery Rate (FDR) per ciascuno dei valori p. Cioè, ad ogni "posizione" nella lista ordinata dei valori p, ti dirà quale proporzione di quelli è probabile che siano falsi rifiuti dell'ipotesi nulla.
La mia domanda è: questi valori FDR devono essere indicati come " valori q " o come " valori p corretti " o come qualcos'altro?
EDIT 2010-07-12: Vorrei descrivere più a fondo la procedura di correzione che stiamo utilizzando. Innanzitutto, ordiniamo i risultati dei test in ordine crescente in base al loro valore p originale non corretto. Quindi, ripetiamo l'elenco, calcolando ciò che ho interpretato come "previsto dalla FDR se dovessimo rifiutare l'ipotesi nulla per questo e tutti i test precedenti nell'elenco", usando la correzione BH, con un alfa uguale all'osservato , valore p non corretto per la rispettiva iterazione. Prendiamo quindi, come quello che abbiamo chiamato il nostro "valore q", il massimo del valore precedentemente corretto (FDR all'iterazione i - 1) o il valore corrente (at i), per preservare la monotonia.
Di seguito è riportato un codice Python che rappresenta questa procedura:
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