読者です 読者をやめる 読者になる 読者になる

StatsBeginner: 初学者の統計学習ノート

初学者が統計学、機械学習、R、Pythonの勉強の過程をメモっていくノート。

検定の繰り返しと多重比較について(追記あり)

仮説検定 分散分析 統計入門 ★重要

 真ん中らへんに追記しました。

多重比較とは

 たとえば学校のクラスがA〜Bの3つあって、それぞれの国語のテストの平均値を比較して、「クラスによって国語の成績は異なるかどうか」を調べるときに、とりあえず分散分析を行いますね。しかし分散分析でクラスの効果が有意であったとしても、
 A⇔B
 B⇔C
 C⇔A
 のどの組み合わせにおいて有意な差があるのかはわかりません。そこで、下位検定として多重比較ってのを行うように、と統計の教科書には書いてあります。
 分散分析を上位検定として多重比較を下位検定と呼ぶ必要は必ずしもなく、最初から多重比較を行えばいいとも言えますが、「まず分散分析を行って、有意だったら多重比較」という手順で考察することは多いらしい。定番の手順をまとめたベージもありました。


 で、初心者的にいうと、「何かと何かの平均値の差が有意であるかどうかを調べたい」場合に、2群の比較であればt検定が用いられ、3群以上になると分散分析が用いられると覚えるわけなので、上記のような2群の組み合わせを調べるのであれば、t検定でいいじゃんという発想になります。
 ところが教科書的にいうと、ここでt検定を3回繰り返してしまうと、第一種の過誤を犯す危険が増すのでダメだということになります。
 たとえばこういう解説がありました。
 

http://www.agri.tohoku.ac.jp/iden/toukei8.html
 
…それぞれに検定をかければいいんじゃないの?
端的に言ってしまえば、検定によって有意差を求めることは可能です。
しかしその場合、一つ重大な問題がはらんできます。
それは「第一種の過誤(有意差がないのに差があるとしてしまう確率)が増加してしまうこと」です。
 
例)3種の飼料間の差をt検定で行うとする。
 このとき、平均値の比較は3種類の飼料の総当たりで行われるため、計3通りのt検定を行うことになる。ここで、危険率(P)を5%にすると、それぞれの比較で有意でない確率は1-0.05となるため、3つの飼料の比較でいずれも有意差が出ない確率は(1-0.05)3=0.86となる。よって危険率が1-0.86=0.14となり、本来5%だったのよりも第一種の過誤の割合が増加する結果となってしまう。
 
このような多重性の問題は検定を行う上で非常にシビアに扱わなければいけない問題です。
そこで、全体として第一種の過誤基準値(例えば5%)を保つためにさまざまな多重比較法が提案されています。

 
 だからこういう場合は、代表的な方法としてたとえばテューキー(Tukey)の多重比較検定とか、ボンフェローニ(Bonferroni)の補正とかが行われることになってるわけです。
 前者はq分布に従うq統計量というのを算出し(本エントリの最後に計算例を載せました)、「個別の平均値間に有意差があるかどうか」と、「少なくとも1つの平均値間に有意差があるかどうか」を、同じ基準のもとで検定できるようにしたものです。ボンフェローニの補正は、単に、有意確率に検定の繰り返し数をかけるという簡易な方法ですね。

どういう場合に検定の繰り返しを気にしなければならないのか

 ところで、検定の繰り返しの問題とか多重検定というのは、初学者にとっては頭がこんがらがることも多いネタです。
 単純に、A群とB群の間にt検定で有意差があれば、それはそれで有益な知見であるはずだし、実際に2群だけ比較してt検定を行う実験がたくさんあるのに、なんで繰り返し分を割り引いて考えなければならないんだっけ?と。
 たとえば別々の実験を20個やる場合でも同じように検定の繰り返しの問題が発生するのか??とか、2つのクラスで国語のテストを20回行って、毎回平均値をt検定で比較したらダメなのか??とか、いろいろ考え始めると、そもそも繰り返し検定の何が問題なのかというのが分からなくなってくるわけです。
 
 たとえば↓のような意見もありました。
 

http://www4.ocn.ne.jp/~murakou/anova.htm
 
ただし,検定を繰り返しするという観点に立つなら,分散分析で主効果と交互作用の検定を同時に行うことも検定の繰り返しですし,重回帰分析で複数の独立変数の効果を見ることも検定の繰り返しです.共分散構造分析のパスの有意性検定も,複雑なモデルほど多くの検定をしています.その意味で,多群の分散分析にだけ,多重比較の問題がうるさく言われるのは,やや不思議な感もします(これは私見です).

 
 頭がこんがらがったら、いったん教科書に戻って考え直す必要があります。
 私が神テキストであると思っている南風原『心理統計学の基礎』のp.280をみてみると、
 

いま、すべての水準の対について、2群間の平均値差の検定をそれぞれ5%水準で行うとします。その1回1回の検定の帰無仮説は、たとえば
 
H0: μ1 = μ2
 
のようなものです。これら対ごとの帰無仮説が1つでも棄却されれば、その論理的帰結として、母平均がすべて等しいという全体としての帰無仮説も棄却されることになります。では、全体としての帰無仮説が正しいとき、対に関する帰無仮説が「少なくとも1つ」棄却され、結果的に全体としての帰無仮説が棄却される確率はいくらになるでしょうか。
対に関する帰無仮説が少なくとも1つ棄却されるという事象の確率は、「1つ目の対の帰無仮説が棄却される、または2つ目の対の帰無仮説が棄却される、......、または最後の対の帰無仮説が棄却される」という事象の確率ですから、「1つ目の対の帰無仮説が棄却される」確率である5%よりは明らかに大きくなります。

 
 と書いてありました。
 これはどういうことかというと、もともとの実験は、冒頭で述べた例でいうと、「3つのクラスの英語の成績の母平均が全て等しい」という帰無仮説の検定からスタートしているわけですが、この帰無仮説を棄却するには、「少なくとも1つの組み合わせにおいて、母平均が異なる」ことを示せばいいことになります。
 この「少なくとも1つの」っていうあたりが理解のポイントになってるわけですね。少なくとも1つの組み合わせにおいて、母平均が等しいという帰無仮説が棄却されることによって、「3群の母平均は全て等しい」という全体に関する帰無仮説も棄却されるわけです。
 ということは、個々の組み合わせのt検定を5%水準で行い、それを繰り返していけば、「少なくとも1つ」の組み合わせにおいて有意差が見つかる可能性は増していくわけなので、有意水準を調整しない限り、「個々の組み合わせにおける母平均差の検定」と「全体の母平均差の検定」には整合性がなくなります。
 
 この考え方だと、たとえば小学校で、「2つのクラスの担任の先生の教育能力は等しい」という帰無仮説を設定して、国語・算数・理科・社会の4教科のテストを行って平均点を比較するという場合でも、教科ごとに平均値差をt検定するというやり方だと、繰り返しの問題が発生するとはいえます(そもそも分散分析を行って「クラス担任要因」を検定すればいいじゃん、というのは措いとくとして)。なぜなら、少なくとも1つの教科において有意差が検出されれば、クラス担任の能力は等しくないということになり、全体の帰無仮説が棄却されてしまうからです。
 この場合、全体の帰無仮説とは、「Aクラスの国語の平均点=Bクラスの国語の平均点、かつAクラスの算数の平均点=Bクラスの算数の平均点、かつAクラスの理科の平均点=Bクラスの理科の平均点、かつAクラスの社会の平均点=Bクラスの社会の平均点」というもので、個別の比較における帰無仮説は「Aクラスの国語の平均点=Bクラスの国語の平均点」等ですね。
 個別の帰無仮説が1個でも棄却されれば全体の帰無仮説も自動的に棄却されることは明らかであり、個別の帰無仮説は4つもあるのだから、有意水準の調整が必要だと思います。
 
 しかし逆にいえば、「2つのクラスの担任の先生の教育能力が(どんな教科においても)等しい」という全体の帰無仮説にそもそもこだわらない立場からすれば、検定の繰り返しを気にしなくていいとも言えます。だって、国語の点数においてAクラスのほうがBクラスよりも点数が有意に高いのであれば、国語の教え方についてはAクラスの先生のほうが優れている可能性が高いとは言えるわけで、それはそれで有益な情報でしょう。
 この例の場合、検定の繰り返しはあくまで「2つのクラスの担任の先生の教育能力は(どの科目に関しても)等しい」という全体の仮説との対応関係においてのみ、発生するわけです。
 
 なので、逆にいうと、
 

  • 全体帰無仮説と部分帰無仮説みたいなものがあり、
  • 部分帰無仮説が少なくとも1つ棄却されると、自動的に全体帰無仮説も棄却されるという関係になっており、
  • 関心があるのはあくまで全体帰無仮説のほうである

 
 というような場合は検定の繰り返しが問題になりますが、そうじゃなければ、必ずしも繰り返しが問題になるわけでもない。
 
 
 【追記】
 しかし上記のような理解だけだと、謎が残ります。
 いま目の前にA群とB群のデータだけがあり、普通にt検定を行って「A群とB群に母平均には差がある」と結論付けたとします。で、後からC群のデータを見つけてきたとします。論理的には、A群とB群に差があるということはさっき結論付けたのだから、考えるまでもなくA=B=Cという帰無仮説は棄却されてもらわないと困ります。A群とB群には差があるってさっき言ったじゃないかと。
 しかし、繰り返し検定の補正をすると、A⇔Bのt検定より、A・B・Cの多重比較の方が有意にはなりにくいというのが、上で述べてきた話です。ひょっとしたら「A=B=C」は棄却されないかもしれないし、多重比較における「A=B」も棄却されないかもしれない。
 これは矛盾ではないのか?
 「A=B」がすでに棄却されているのに、棄却されない(かもしれない)「A=B=C」について新たに考えるというのは馬鹿げているように思えますね。なんだこれは?
 
 やはりこんがらがってきたので、Yahoo!知恵袋で質問してみました。
 [統計]統計学でいう、検定の繰り返しと多重比較... - 数学 | Yahoo!知恵袋
 回答は1件しかついてませんが、じつは「返信」欄が非常に長いやりとりになっており、回答者の方には大変丁寧な解説をしていただきました。


 私の疑問は、要するに、Cというデータがあろうがなかろうが、それがABとどんな関係にあろうが、「A=Bであるか否か」の判断は変わってはいけないのではないか?という点にあったのですが、「どんな関係にあろうが判断は変わってはいけない」という考えは間違いですね。
 A・B・Cと3つの群があり、それぞれの平均値を比較するという場合、A⇔B間にしか関心がないのであれば、多重比較を行う必要はなく、A⇔Bのt検定を行えば良いというのが結論になります。しかし、AやBのデータを、何らかの形でCと関連させた主張を行いたいのであれば、Cとの関係によって「A=Bであるか否か」の判断は変わる場合があり、つまりA⇔Bのt検定を行うだけでは不適切になる可能性があります。


 より正確に言うと、Cというデータの存在が、AやBの確率分布に関する仮定に影響を与える関係にある(そういう関係になるような主張・考察を行いたい)場合に、多重比較等が必要になるということです。逆に、Cというデータが目の前にあり、その存在を知っていたとしても、Cのデータの内容に関心がなく、それをABと絡めて議論する気がないのであれば、分析上も無視しておけばいいわけです。
 「Cを絡める」というのは、典型的には「3群とも同じ母集団からの標本であるかどうか」を調べたいという場合が考えられ、それが冒頭の例ですけど、ABとCの関係は他にもいろいろあり得るので、その関係の性質に適合した分析をそれぞれ行う必要があるわけです*1
 Tukey法は、ABCの3群について「同じ標準誤差」を仮定します。仮にA⇔Bの関係にしか関心がない人が、ABCの3群を前提にしたTukey法の枠組みでA⇔Bの比較を行っているとしたら、その分析方法は間違っていることになります。AとBの標準誤差に関して、必要がないのに「C」の存在による制約を与えているからです。


 そう考えると、「検定の繰り返しには問題がある」というような言い方自体に問題がありますね。「繰り返すから問題だ」と言われると、「この繰り返しはOKなのか……?」「こっちは……?」って色々気になってきます。しかし問題の本質は、繰り返しという点にあるのではなく、1個1個の検定において仮定している確率分布が、自分がこれから行おうとしている主張に合致したものであるかどうか、であるということです。
 
 

具体的な計算方法

 多重比較の定番である「テューキー法」の計算方法を忘れないように、南風原『心理統計学の基礎』のp.281にのっているテューキー法の計算をRでやっておきます。エクセルでやっているブログ記事なんかもあり、参考になると思います。


 Tukey法においては、q分布という分布にしたがう統計量qを計算します。
 Wikipediaをみればわかりますが、qというのは、たとえば3つの群A〜Cがあってそれぞれのサンプルサイズが15だとすると、A、B、Cのそれぞれの平均値を対にして比較して、差を「すべての群に共通の標準誤差」で割ったものです。この「すべての群に共通の標準誤差」は、3つの群それぞれの不偏分散の平均(3つの群それぞれの平方和を足して、全体の自由度42で割ったと言っても同じ)を、各群に共通のサンプルサイズ15で割って、平方根を取ったものです。
 
 
 ではまず、教科書のデータを入力します。教科書のデータはこういうものです。
 
f:id:midnightseminar:20141101140637p:plain
 
 もともと、「優越」と「態度」の2要因で「妬み感情」を説明するというデザインの分散分析を説明している箇所なので、一応全部入力しておきますが、ここでは「態度」要因は使いません。
 

> 優越 <- c(rep("容姿", 15), rep("学歴", 15), rep("豊かさ", 15))
> 態度 <- c(rep("友好的", 5), rep("敵対的", 5), rep("ふつう", 5), rep("友好的", 5), rep("敵対的", 5), rep("ふつう", 5), rep("友好的", 5), rep("敵対的", 5), rep("ふつう", 5))
> 妬み感情 <- c(2,4,3,2,1,7,4,6,5,8,4,3,2,5,2,2,2,1,2,2,3,4,2,1,2,1,3,3,2,1,3,1,1,0,1,4,7,5,6,4,3,2,1,2,1))
>
> d <- data.frame(優越, 態度, 妬み感情)
> head(d)
  優越   態度 妬み感情
1 容姿 友好的        2
2 容姿 友好的        4
3 容姿 友好的        3
4 容姿 友好的        2
5 容姿 友好的        1
6 容姿 敵対的        7

 
 qを計算する準備をします。
 

> # 共通の標準誤差を計算する
>
> # 「群ごとの平方和」を求めて足しあわせ、全体の自由度42で割ったものが分子
> SMe <- (
+    sum((subset(d, 優越=="容姿")$妬み感情 - mean(subset(d, 優越=="容姿")$妬み感情))^2)
+    + sum((subset(d, 優越=="学歴")$妬み感情 - mean(subset(d, 優越=="学歴")$妬み感情))^2)
+    + sum((subset(d, 優越=="豊かさ")$妬み感情 - mean(subset(d, 優越=="豊かさ")$妬み感情))^2)
+    )/42
> print(SMe)
[1] 3.085714
>
> # 参考に、分子は、各群の不偏分散var()の平均を求めても同じことである
> sum(var(subset(d, 優越=="容姿")$妬み感情)
+    + var(subset(d, 優越=="学歴")$妬み感情)
+    + var(subset(d, 優越=="豊かさ")$妬み感情)
+    )/3
[1] 3.085714
>
> # 標準誤差というのは、標準偏差を標本サイズで割ったものだが、ここでは上記SMeを各群共通のサンプルサイズ15で割ったもの
>
> SE <- sqrt(SMe/15)
> 
> # 3つの優越属性それぞれの妬み感情平均
> 容姿平均 <- mean(subset(d, 優越=="容姿")$妬み感情)
> 学歴平均 <- mean(subset(d, 優越=="学歴")$妬み感情)
> 豊かさ平均 <- mean(subset(d, 優越=="豊かさ")$妬み感情)
> 

 
 で、たとえば3群のなかで最も大きいものと最も小さいものを比較して、有意差があれば、3群の平均値が等しいという帰無仮説は棄却されることになりますね。
 と同時にテューキー法では、「全ての群の平均値が等しい」という帰無仮説のもとでの、「特定の群間の平均値差」の有意性を検定することができ*2、適切な多重比較が行えるわけですね。
 ちなみに、t検定のt値との計算式の違いは、t値の場合は「比較している2組だけに共通の標準誤差」が分母になるという点ですね。
 
 比較する群の平均値のうち、最大のものから最小のものを引いて、標準誤差で割ることにより、q値を求めます。
 

> q <- (max(容姿平均, 学歴平均, 豊かさ平均) - min(容姿平均, 学歴平均, 豊かさ平均)) / SE
> print(q)
[1] 3.968627

 
 これを、q分布の表に照らし合わせるわけですが、q分布の確率密度は、「各群共通の自由度」と「比較する平均値の数」に対応して決まるので、q分布表はその2つとタテ・ヨコの軸とした表になっており、たとえば↓の画像には5%水準のqの限界値(上側確率)が表示されています。1%水準の表なら1%水準の限界値が示されているわけですが、要するに有意水準ごとに別の表が要るわけですね。(あくまで表から判断するなら)
 
 f:id:midnightseminar:20141101140842p:plain
 
 自由度14で比較する平均が3つの場合の5%限界値は3.70なので、上記のq = 3.968627は5%有意ということになり、すべての平均値が等しいという帰無仮説は棄却されます。
 それで、3群の組み合わせを全部みてみると、
 

> q1 <- abs(容姿平均 - 学歴平均) / SE
> q2 <- abs(容姿平均 - 豊かさ平均) / SE
> q3 <- abs(学歴平均 - 豊かさ平均) / SE
> 
> print(q1)
[1] 3.968627
> print(q2)
[1] 2.498765
> print(q3)
[1] 1.469862

 
 となり、容姿と学歴の差以外は有意な差がないということになりました。
 
 ちなみにRには、標準機能でq分布の累積分布と求めるptukey()という関数と、分位点を求めるqtukeyという関数があるだけで、検定自体を行う「tukey.test」みたいな関数はないらしい。
 ↓のページによると、{SimComp}というパッケージを使えばいいようです。
 http://stat.biopapyrus.net/multivariate-test/tukey.html

*1:どういう場合にどういう分析っていう、具体例はすぐに思いつかないけど。

*2:証明を読んでないのでよく分かってないけど、共通の分母(各群に共通の標準誤差)に基づいてqを計算してることが関係してるんだろうか??あとで勉強しないと……