連続変数の多群比較:ANOVAとKruskal-Wallis test

今回は、3群以上で連続変数を比較する検定法について勉強します。まずはANOVAからやりましょう。

目次

ANOVA

ANOVAを使うためには、幾つか満たすべきassumptionがあります。

Assumption

 

ここでは、わかりやすく3群で比較する場合を考えていきます。分散分析が使うためには、

1. それぞれの群での連続変数が正規分布であること

2. データが独立していること

3. 3群それぞれの分散が等しいこと

がassumptionとして必要になります。

1の正規分布の評価に関しては、こちらを参考にしてください。

2は意外に重要です。ICU入室患者を対象とした研究において、複数回入室した患者がいるとします。その場合、それらのデータはindependentではなくなってしまいます。例えば、n=10しかないのに、1人がICUに100回入室していた場合を考えてみましょう。データの数を9+100=109としてしまっては、データ全体がその一個人の傾向に引っ張られてしまいますよね(データがdependent)。その場合、「ICUの初回入室」といったfilterをかけることで、independentを保つことができます。

3が成り立ってない場合、データをtransformする方法や、weighted regressionという特殊な回帰分析を行う方法もありますが、c)のように無視してANOVAを使うことが現実的には多いように思います。

以上のassumptionがあった上で、ANOVAという分散分析が使えます。

F-scoreとは

他の検定と同様、分散分析においても帰無仮説の条件下で何らかのスコアを計算し、そのスコアをとりうるprobabilityを計算することによってp-valueを得ることができます。ANOVAの場合、帰無仮説は「3群の全ての平均は等しい」であり、その条件下で以下のようにF scoreを計算します。

分子は、それぞれの群の平均値から全体の平均値を引いたものの2乗を合計したものになりますので、各群の平均値がどのくらい全体の平均値から離れているかの指標になります。すなわち、3群の平均値が同じならF-scoreは小さく、バラバラになればなるほどF-scoreは大きくなります。

このF-scoreですが、もう一つの解釈方法があります。

このように、分子は群の分散分母は群の分散という風に解釈することもできます。

理論的にはF-scoreは0をとりうるはずですが、実際のデータでは約1がほぼ最小らしいです。なので、どの群であっても違いがない場合はF-scoreは約1群間に大きな差があったらF-scoreが大きくなり、H0をrejectする、という流れになります。

このF-scoreがF-distributionにおいてどのくらいrareなのか、その確率がp-valueです。F-scoreとF-distributionに関しては、t-testで2群の分散が等しいか否かの検定に用いたF-testを参照してください。

ちなみに、これら分散の関係を図示すると、以下のようになります。

分散の合計 = 群間の分散 + 群内の分散

です。

ANOVAによる実際のoutput

これは、SASのoutputです。51404というのがvariability between groupsであり、1960というのがvariability within groupsとなります。従って、

F-score = 51404 / 1960 = 26.2

となり、今回のF-distributionにおけるprobability (p)が0.0001未満だったということを意味しています。

Rで解析してみましょう。dat_1というdata frameにおいてrace間でbwtを比較してみます。

ANOVAのコードは、

anova<-aov(bwt~race, data=dat_2)
summary(anova)

Outputとしては、

##              Df   Sum Sq Mean Sq F value  Pr(>F)   
## race          2  5076973 2538487   4.978 0.00783 **
## Residuals   186 94850291  509948                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

となり、SASと同様のoutputを得ることができます。

図示するのであれば、

summarySE(dat_2,measurevar = "bwt", groupvars = "race")%>%
   ggplot(aes(x=race, y=bwt, colour=race)) + 
   geom_errorbar(aes(ymin=bwt-se, ymax=bwt+se), width=.1)  +
   geom_point()+
  scale_x_discrete(labels=c("White","Black","Others"))

とすることで、

のような図を書くことができます。

Kruskal-Wallis Test

2群比較の時のように、それぞれの群のデータが正規分布しておらず、サンプルサイズが小さくcentral limit theoremが使えない場合は、ANOVAを用いることができません。その時には、non-parametricであるKruskal-Wallis testを使います。

詳細は割愛しますが、理論的にはWilcoxonと同じです。連続変数にランキングをつけ、データそのものではなく、そのランキングの平均値を群間で比べるということですね。

Rのcodeは

kruskal.test(dat_2$bwt ~ dat_2$race)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  dat_2$bwt by dat_2$race
## Kruskal-Wallis chi-squared = 8.5909, df = 2, p-value = 0.01363

を使います。

Wilcoxonの時と同様、rankingを比較するのであればmeanの図を使うのはオススメできません。せめてbox plotで妥協しましょう。

dat_2%>%ggplot()+
  geom_boxplot(aes(race,bwt),outlier.shape=NA)+
    scale_x_discrete(labels=c("White","Black","Others"))+
    xlab(label="Race")+
    ylab(label="Birth weight")

 

次は、群間で有意差があった場合のpairwise comparisonについてやりたいと思います。

 

医療従事者に必要な統計学と疫学(目次)へ

References

1. John Orav. BST 208: Stats for Med Research, Advanced. Introductory Statistics for Medical Research. Harvard T.H. Chan School of Public Health
2. Garrett Fitzmaurice. BST 226: Applied Longitudinal Analysis. Harvard T.H. Chan School of Public Health
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメント一覧 (6件)

コメントする

英語のコメントは『問い合わせ』からお願いします。

目次