見出し画像

パラメトリック検定 vs ノンパラメトリック検定~前編~

こんにちは、ゆるです。最近はふわが公衆衛生大学院の記事を書いていたので久しぶりの投稿となります。

前回は仮説検定における後決めの危険性と題して、帰無仮説下で$${p}$$値が従う分布と第1種の過誤率の関係について触れました。

今回も前回と同様仮説検定をテーマに扱い、皆さんが一度は考えたことがある、パラメトリック検定($${t}$$検定など)とノンパラメトリック検定($${wilcoxon}$$の順位和検定など)のどちらを使うべきか、なぜそちらを使うべきかという問いに対する考察を行いたいと思います。
今回の記事では仮説検定の枠組みを学ぶ上で以下の2冊を参考にしました。

また、ゆるが使用しているpythonではなくRをベースとしていますが、モンテカルロシミュレーションについては以下の書籍を参考にしました。


はじめに

皆さんが仮説検定と聞いたとき、$${Student}$$の$${t}$$検定を思い浮かべる方が多いのではないでしょうか?$${Student}$$の$${t}$$検定は、ある$${2}$$群のデータがあった際に群間で平均の差があるかを検証する仮説検定です。一方で、平均の比較の場合いついかなる時も$${Student}$$の$${t}$$検定を行えばいいかと言われるとそうではありません。$${t}$$検定を行う条件は以下になります。

  1. 全てのサンプルが独立に得られたものであること

  2. 母集団分布が正規分布に従うこと

  3. 両群の母集団分布の分散が等しいこと

サンプルが正規分布に従わなければいけない」という条件は聞いたことある方も多いのではないでしょうか。またその際、$${wilcoxon}$$の順位和検定のようなノンパラメトリック検定をしなければならないということも併せて覚えている方も多いかと思います。
そこで今回はなぜこういった検定の選択を行わなければいけないのかについて扱っていきます!

第1種の過誤率

仮説検定において最も重要な前提となるのが「第1種の過誤率が意図している確率に実際になっているか」です。第1種の過誤についておさらいしましょう!

第1種の過誤とは帰無仮説が正しいにも関わらず、帰無仮説を棄却してしまうことであり、その過誤が起こる確率を慣例的に$${\alpha}$$と表す。

よく$${p<0.05}$$を有意か否かの基準として見かけることがあると思いますが、これは「この仮説検定においては第1種の過誤率$${\alpha}$$が$${0.05}$$未満に抑えられている」ことを表します。ちなみにこの表現では帰無仮説がある一点(例えば平均$${\mu=0}$$など)の場合を想定しています。

【コラム】
一方で、片側検定のように帰無仮説の状態が複数であったり範囲として($${\mu<0}$$など)存在したりする場合はその全ての帰無仮説($${H_0: \mu\leq0}$$の場合は$${\mu=0, -1,-100000…}$$)において第1種の過誤率$${\alpha}$$を考えなければならず、その中で最大のもの$${\alpha_{max}}$$が検定における有意か否かの閾値となります。これは有意水準と呼ばれます。本記事では一貫してある一つの帰無仮説における第1種の過誤率を$${\alpha}$$と表記しますが、有意水準を$${\alpha}$$と表記することもあります。

ここで重要なのは、仮説検定において「$${p<0.05}$$を有意の閾値とする」と決めた時点で、「この検定の第1種の過誤率は$${0.05}$$未満である」ことを保証しなければいけません。そうでなければ仮説検定の枠組みそのものが崩壊してしまいます。

ここでもとの問題提起に立ち返ってみましょう。正規性や等分散性が成立しない分布に対して$${t}$$検定行った際に第1種の過誤率がどうなるか検証してみたいと思います。今回もpythonを使用したモンテカルロシミュレーションになります。

分散の等しい二つの正規分布に対してStudentのt検定を行う場合

今回は第1種の過誤について考えるので、本来差がない二つの分布について考えます。例えば以下のようになります。

確率変数$${X}$$と$${Y}$$が共に平均$${0}$$、分散$${1}$$の正規分布に独立に従うとする。$${X}$$と$${Y}$$についてそれぞれ$${6}$$つずつ標本を抽出し、この$${2}$$群の平均について$${Student}$$の$${t}$$検定を行った場合、第1種の過誤を犯す確率(有意になる確率)を求めよ。

【問題1】

今回はシミュレーションで行うので確率を割合から推定する形になりますが、この問題設定で「差がないにもかかわらず有意になる確率」を考えることができ、以下のコードで検証可能です。

import numpy as np
import scipy.stats as sts

#有意になった回数を記録する変数
significant = 0

for i in range(100000):
    
    #XとYについてn=6ずつ抽出
    X = np.random.normal(loc=0, scale=1, size=6)
    Y = np.random.normal(loc=0, scale=1, size=6)
    
    #Studentのt検定の結果を格納
    p = sts.ttest_ind(X, Y, equal_var=True).pvalue
    
    #有意になった場合significantに1を足す
    if p<0.05:
        significant += 1
    else:
        pass

#第1種の過誤を犯した割合
alpha = significant/100000
print(alpha)

実行すると$${0.05}$$に近い値が表示されてたのではないでしょうか。ゆるが実行した際には$${0.04975}$$となりました。求めたい第一種の過誤率を乱数を用いて割合として推定するので多少の誤差はあると思いますが、何回か実行すると平均的には$${0.05}$$になりそうという感覚がつかめるのではないでしょうか。以上より、分散が等しい分布であれば$${Student}$$の$${t}$$検定の第1種の過誤率が$${0.05}$$となることが分かりました。

分散の異なる二つの正規分布に対してStudentのt検定を行う場合

先程とほとんど同じですが$${2}$$群の分散が異なるという点で問題設定が微かに異なります

確率変数$${X}$$が平均$${0}$$分散$${1}$$の正規分布に、確率変数$${Y}$$が平均$${0}$$分散$${10}$$の正規分布に独立に従うとする。$${X}$$と$${Y}$$についてそれぞれ$${6}$$つずつ標本を抽出し、この$${2}$$群の平均について$${Student}$$の$${t}$$検定を行った場合、第1種の過誤を犯す確率(有意になる確率)を求めよ。

【問題2】

以下のコードでシミュレーションが可能です。

import numpy as np
import scipy.stats as sts

#有意になった回数を記録する変数
significant = 0

for i in range(100000):
    
    #XとYについてn=6ずつ抽出
    X = np.random.normal(loc=0, scale=1, size=6)
    Y = np.random.normal(loc=0, scale=np.sqrt(10), size=6)
    
    #Studentのt検定の結果を格納
    p = sts.ttest_ind(X, Y, equal_var=True).pvalue
    
    #有意になった場合significantに1を足す
    if p<0.05:
        significant += 1
    else:
        pass

#第1種の過誤を犯した割合
alpha = significant/100000
print(alpha)

np.random.normalのscaleは標準偏差を表すので分散を$${10}$$にするために平方根をとっています。ゆるが実行した際には結果は$${0.06558}$$となりました。こちらも乱数なので多少の誤差はあれど、$${0.05}$$より大きい値になりそうという感覚をつかめたのではないでしょうか。最初の方で、

仮説検定においては「$${p<0.05}$$を有意の閾値とする」と決めた時点で、「この検定の第1種の過誤率は$${0.05}$$である」ことを保証しなければいけない

と述べたと思いますが、今回は$${p<0.05}$$を有意の閾値としているにもかかわらず、第1種の過誤率が$${0.05}$$を上回ってしまいました。これが$${Student}$$の$${t}$$検定を行う上で等分散性の仮定が必要になる理由です。
では$${Student}$$の$${t}$$検定がダメであれば、どのような検定を選べばよいでしょうか?すでに聞いたことがある方もいるかもしれませんが、$${Welch}$$の$${t}$$検定という検定を使用すれば、等分散性の仮定が不要であることが知られています。
先ほどの【問2】の問題設定に関して$${Welch}$$の$${t}$$検定を行うにはコードの「#Studentのt検定の結果を格納」という部分でsts.ttest_ind(X, Y, equal_var=False)とすれば実行できます。

import numpy as np
import scipy.stats as sts

#有意になった回数を記録する変数
significant = 0

for i in range(100000):
    
    #XとYについてn=6ずつ抽出
    X = np.random.normal(loc=0, scale=1, size=6)
    Y = np.random.normal(loc=0, scale=np.sqrt(10), size=6)
    
    #Studentのt検定の結果を格納
    p = sts.ttest_ind(X, Y, equal_var=False).pvalue
    
    #有意になった場合significantに1を足す
    if p<0.05:
        significant += 1
    else:
        pass

#第1種の過誤を犯した割合
alpha = significant/100000
print(alpha)

ゆるが実行した際には$${0.05182}$$となりました。また何回か実行すると$${0.05}$$より少し大きい傾向はありつつも$${Student}$$の$${t}$$検定の際の第1種の過誤率よりは小さくなっているという感覚を持てるかと思います。そのため理想的ではないにせよ検定の枠組みに従う上ではマシになっていると言えます。

以上より、等分散性の仮定が成り立つか不明な場合は$${Welch}$$の$${t}$$検定を選択するのが慣例となっています。ここで逆に、「常に$${Welch}$$の$${t}$$検定を行うようにすれば正規性だけ注意すればよくて楽なのでは?」と思われる方がいるかもしれません。しかしそうとも限らないのが仮説検定の難しいところです。この点については検出力という概念に触れる必要があるのですが、それは後編に回すとしましょう。

おわりに

表題は「パラメトリック検定 vs ノンパラメトリック検定」でしたが長くなりそうなので全3編構成にしようと思います(その結果前編でノンパラメトリック検定には触れられず申し訳ないです…)。中編では$${wilcoxon}$$の順位和検定に代表されるノンパラメトリック検定を扱い、最後の後編では検出力について扱っていきたいと思います。
ここまで読んで下さった方、ありがとうございました!それではまた!

中編を投稿しました!

【更新履歴】
2024/02/28 初稿投稿
2024/03/24 中編追加

この記事が気に入ったらサポートをしてみませんか?