З огляду на перелік p-значень, отриманих незалежними тестами, відсортований у порядку зростання, можна використовувати процедуру Бенджаміні-Гохберга для корекції багаторазового тестування . Для кожного p-значення процедура Бенджаміні-Хохберга дозволяє обчислити показник помилкового виявлення (FDR) для кожного з p-значень. Тобто, при кожній "позиції" у відсортованому списку p-значень воно скаже вам, яка частка цих випадків може бути помилковим відхиленням нульової гіпотези.
Моє запитання: чи слід називати ці значення FDR як " q-значення ", або як " виправлені p-значення ", або як щось інше цілком?
EDIT 2010-07-12: Я хотів би більш детально описати процедуру виправлення, яку ми використовуємо. По-перше, ми сортуємо результати тестів у порядку збільшення за їх непоправленим вихідним p-значенням. Потім ми повторюємо список, обчислюючи те, що я інтерпретував як "очікуваний FDR, якщо ми будемо відкинути нульову гіпотезу для цього та всіх тестів, попередніх у списку", використовуючи корекцію BH, з альфа-рівним спостережуваним , непоправлене р-значення для відповідної ітерації. Потім ми беремо, як те, що ми називали нашим «значенням q», максимум попередньо відкоригованого значення (FDR при ітерації i - 1) або поточного значення (at i), щоб зберегти монотонність.
Нижче наведено код Python, який представляє цю процедуру:
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