False Discovery Rate(FDR)
False Discovery Rate(FDR)とは?
False Discovery Rate(FDR、偽発見率)は、多重比較の問題を扱う統計的手法で多数の仮説検定を行う際に、誤って「有意」と判断される偽の発見の割合を制御することを目的としています。これは、特に生物学的または医学的研究において、多数の変数に対して同時に仮説検定を行う場合に重要です。
$$
FDR=\frac{偽の発見数}{発見数}
$$
ここで、「発見数」とは仮説検定で統計的に有意と判断されたケースの総数であり、「偽の発見数」とはその中で真実ではないもの(誤って有意と判定されたもの)の数です。
この記事では、p値をランダムに生成し、FDRの制御を行ってみます。
サンプルデータの生成
p値をランダムに生成しました。
import numpy as np
np.random.seed(42)
p_values = np.random.uniform(low=0.01, high=1.0, size=100)
生成したp値をヒストグラムで可視化してみます。
import matplotlib.pyplot as plt
plt.hist(p_values, bins=20, color='blue', edgecolor='black')
plt.title('Histogram of p-values')
plt.xlabel('p-value')
plt.ylabel('Frequency')
plt.show()

FDRの制御
FDRの制御にはstatsmodelsライブラリのmultipletestsを利用しています。FDRの制御手法にはいくつか異なる手法がありますが、今回は最も広く使われているBenjamini-Hochberg (BH) 手法を適用してみます。
from statsmodels.stats.multitest import multipletests
rejected, pvals_corrected, _, _ = multipletests(p_values, alpha=0.05, method='fdr_bh')
multipletestsに設定しているパラメーターは下記の通りです。
p_values: 検定から得られた p 値のリストまたは配列。
alpha: 使用する有意水準(ここでは 0.05)。これは、許容される偽発見率の最大値です。
method: 使用する補正方法(ここでは 'fdr_bh'、つまりBenjamini-Hochberg 方法)。
multipletestsの返却値は下記の通りです。
rejected: これはブール値(True/False)の配列で、各仮説が棄却されるべきかどうかを示します。Trueはその仮説が棄却されるべきであることを意味し、Falseは棄却されないことを意味します。
pvals_corrected: これは補正後の p 値で、元の p 値に多重比較の補正が施されたものです。
今回のサンプルデータでは、rejectedの配列は全てFalseでした。どの p 値も Benjamini-Hochberg 方法による補正後の有意水準(今回は 0.05)以下にならなかったため、全ての帰無仮説が棄却されませんでした。