Python

FDR制御(BH法) を実装してみた

BH法

FDR制御のためにBH法を実装してみたので自分用にメモ

与えるpvalueの配列にnanが入っていると事故るので注意。
最後にfor使ってるのがダサい気がするが、他にいい方法が見つからない。

参考にしたサイトはこちら

qvalue.py
import numpy as np

def adjust_bh(p_values):
    p_values=np.array(p_values)
    m=len(p_values) 
    sorted_idx=np.argsort(p_values) #後で元の順番に戻すのに使う
    sorted_p=p_values[sorted_idx]
    one_to_m=np.arange(1,m+1)
    q_prime=m*sorted_p/one_to_m
    q_values=np.zeros(m)
    q_values[m-1]=q_prime[m-1]
    for i in range(m-2,-1,-1):
        q_values[i]=np.min([q_prime[i],q_values[i+1]])

    return q_values[np.argsort(sorted_idx)] #元の順番に戻してから返す