1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

FDR制御 (Benjamini-Hochberg法) を図で理解する

Last updated at Posted at 2023-01-09

FDR (False Discovery Rate) 制御は多重検定補正の一つです。FDR制御を行うための代表的なアルゴリズムがBenjamini-Hochberg法です。以下ではBH法と略します。

FDRは以下の式で表されます。TPはTrue Positive, FPはFalse Positiveです。FDR制御ではFDRの期待値を指定した値以下に抑えます。

$$FDR=\frac{FP}{TP+FP}$$

FDR制御とBH法は沢山のウェブサイトで紹介されていますので、詳細は割愛します。

このページでは、何故BH法でFDR制御できるのかを図で説明します。私の担当講義で話していますが、せっかくなのでQiitaにも載せることにしました。

FDR制御の説明

以下では、同じタイプの仮説検定を $N$ 回行うとします。例えば、$t$ 検定を$10^4$ 回行うとします。各仮説検定は互いに独立とします。簡単のため、仮説検定は片側検定とします。

fig05_09.png

図の上側の分布は、帰無仮説が正しい場合に検定統計量が従う分布です。例えば、$t$ 検定の場合、検定統計量は $t$ 値、その従う分布は $t$ 分布です。

図の下側の分布は、$N$ 回の検定によって得られた $N$ 個の検定統計量の実際の分布です。

閾値を図に示す値にした場合を考えます。実際に陽性と判定されるのは、下図のBの部分です。例えば、ここに $500$ 個いるとします。この中にはTPとFPが混ざっています。

このときのFPの個数の上限を上の図から見積もります。もし仮に、$N$ 個全ての仮説検定で帰無仮説が正しかった場合、$A$ の面積を $p$ として、FPの個数の期待値は $Np$ と表されます。例えば、$N=10^4$, $p=0.01$ の場合、$100$ 個になります。また、$N$ 個の中に対立仮説が正しい場合が含まれているときも、FPの個数の期待値は $Np$ より大きくなることはありません。

例えば、$500$ 個が出力されて、そのうち高々 $100$ 個が偽物だと予想されるなら、FDRの期待値の上限は $100/500=0.2$ になります。

あとは、指定したFDR (例えば $0.05$) を超えない範囲で、閾値をなるべく沢山の出力が得られるような値 (この図でいえば、なるべく左側の値) にすればおしまいです。

BH法との対応関係

ここまでは検定統計量の分布を使って説明をしてきました。一方、BH法は $p$ 値ベースのアルゴリズムです。対応関係を整理します。

$N$ 個の仮説検定で得られた $p$ 値を小さい順に並べます。簡単のため等号は含まないとします。

$$p_1<p_2 < \cdots < p_N$$

先ほどの図でいうと、下側の分布で右端の方から順に $p_1, p_2,\ldots$ に対応する検定統計量が並んでいます。

$1$ 番目から $i$ 番目までを陽性として出力する場合を考えます。出力される個数は $i$ です。これは先ほどの図のBの部分です。また、先ほどの図のAの面積は $p_i$ に相当します。従って、このときのFDRの期待値の上限 ($q$ 値) は以下のように表されます。

$$q_i=\frac{Np_i}{i}$$

あとは、この値が指定値を超えない範囲で最大の $i$ を見つければ良いので、BH法のアルゴリズムが出てきます。

Pythonのコード

以下に $q$ 値を計算するPythonのコードを載せます。単調増加となるように np.minimum.accumulate をかけています。

def calculate_q(p_seq):
  p_arr   = np.asarray(p_seq)
  N       = len(p_arr)
  idx_arr = np.argsort(p_arr)
  q_arr   = p_arr[idx_arr] * N / (np.arange(N) + 1)
  q_arr   = np.minimum.accumulate(q_arr[::-1])[::-1]
  q_arr[idx_arr] = q_arr.copy()
  return q_arr

数値実験

以下に数値実験結果を載せます。実験条件は以下のとおりです。

名前 設定値
検定の種類 ウェルチの $t$ 検定
各標本のサイズ $n$ $10$ から $100$ まで $10$ 刻み
仮説検定の数 $N$ $10^4$
真に陽性の数 $1000$
陽性の場合の効果量 $0.8$
FDRの閾値 $0.05$
試行回数 $10$

tmp.png

陽性として出力される数 (TP+FP) は、標本サイズに応じて増加した後に一定値に収束しました。収束値が真の陽性数 $1000$ を超えているのはFPを含むためと考えられます。

FDRは、どの標本サイズでも指定値 $0.05$ より平均的に低い値でした。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?