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)] #元の順番に戻してから返す