【統計】一元配置分散分析(One-way ANOVA)

一元配置分散分析(One-way ANOVA)について。

【目次】

 

t検定 は2群の平均の差を評価するもの。
3群以上の場合は、分散分析(ANOVA:ANalysis Of VAriance)が広く用いられる。

 

帰無仮説、対立仮設


  • 帰無仮説  H_{0}: \overline{x}_{a}=\overline{x}_{b}=\ldots =\overline{x}_{z}
  • 対立仮設  H_{1}: 少なくとも一つの群の平均が異なる

帰無仮説・対立仮設のとおり平均に差があるかを見ている。

計算式等


分散分析では、帰無仮説のとおり各水準の母平均がすべて等しければ、群間の変動  V_{A} はランダムな変動  V_{e}(群内の誤差変動)の範囲内として説明でき、そうでなければその比(F_{A}=V_{A}/V_{e})は大きくなるだろうということを見ている。 

分散分析は次の「分散分析表」にまとめることができる。
算出したF値(F統計量)をもとに、F分布を使って検定を行う。

■ 分散分析表

変動因 平方和 自由度 平均平方 F値(F比)
水準間A  S_{A}=\sum n_{k}\left( \overline{y_{k}} - \bar{\bar{y}}\right) ^{2} f_{A}=a-1 V_{A}=\dfrac{S_{A}}{f_{A}} F_{A}=\dfrac{V_{A}}{V_{e}}
残差e  S_{e}=\sum _{k=1} ^{a}\sum _{i=1} ^{n_{k}} \left( y_{k_{i}}-\overline{y_{k}}\right) ^{2} f_{e}=n-a V_{e}=\dfrac{S_{e}}{f_{e}}  
全体T S_{T}=\sum \left( y_{i}-\bar{\bar{y}}\right) ^{2} f_{T}=n-1    

※ k=特定の水準、i=特定の観測値、\overline{y_{k}}=特定の水準の平均値、\bar{\bar{y}}=全体の平均値(総平均)、a=水準数

ここで平方和と自由度には次の関係がある。
\quad S_{T} = S_{A} + S_{e}
\quad f_{T} = f_{A} + f_{e}

なお、 S_{T} は全体平方和、 S_{A} は水準間平方和や群間平方和、 S_{e} は残差平方和や群内平方和などと呼ばれる。

  

また、質的変数をダミー変数(0と1の数量変数)にして重回帰分析を行うことでも、各水準の条件付き期待値を算出できる(数量化理論1類)。
例えば、A薬、B薬、C薬の3水準の場合、次のようにダミー変数を作成。
 ・ダミー変数1(D1):B薬=1、それ以外=0
 ・ダミー変数2(D2):C薬=1、それ以外=0

■ 重回帰モデル
\quad y = \beta_{0} + \beta_{1} D1 + \beta_{2} D2 + \varepsilon\ ,\quad\sim\varepsilon: N\left(0,\sigma^{2}\right)
 

■ 重回帰式
\quad \hat{y} = b_{0} + b_{1} D1 + b_{2} D2

この重回帰式により各水準を次のとおり推定。
・A薬:D1とD2が0になるため、b_{0} が期待値。
・B薬:D2が0になるため、b_{0} + b_{1} が期待値。
・C薬:D1が0になるため、b_{0} + b_{2} が期待値。

 

計算例


簡単なデータで計算方法を確認する。
今回はA薬、B薬、C薬の3つの投与群において、評価指標Xの結果に差があるかを見る(架空データ)。

 A薬 = {10, 11, 13, 10, 11, 11, 12, 11, 13}
 B薬 = {13, 14, 15, 15, 16, 14, 15, 17}
 C薬 = {20, 19, 19, 22, 21, 20, 20}

 

まず、全体・投与群別で平均を求め、総平均からのズレ(偏差平方和)を求める。

投与群 N 平均 投与群毎の偏差平方和
全体 24 \bar{\bar{y}}≒15.083 ---
A薬 9 \overline{y_{A}}≒11.333  9\times\left(11.333-15.083\right)^{2}≒126.563
B薬 8 \overline{y_{B}}≒14.875  8\times\left(14.875-15.083\right)^{2}≒0.347
C薬 7 \overline{y_{C}}≒20.143  7\times\left(20.143-15.083\right)^{2}≒179.191

このA~C薬の偏差平方和を足し合わせると水準間平方和になる。
\quad S_{A}=126.563+0.347+179.191≒306.101

また、今回は水準数が3つ(A薬、B薬、C薬)のため自由度=2。
\quad f_{A}=3-1=2

 

次に、個々の観測値について、各水準の平均からのズレ(群内の偏差平方)と総平均からのズレ(全体の偏差平方)を求める。
 S_{T} = S_{A} + S_{e} なので1つ分かれば十分だが、計算の理解のため両方求める。

投与群 評価指標X 群内の偏差平方 \left(y_{k_{i}}- \overline{y_{k}}\right)^{2} 全体の偏差平方 \left(y_{i}- \bar{\bar{y}}\right)^{2}
A薬 10  \left(10 - 11.333 \right)^{2}≒1.778  \left(10 - 15.083 \right)^{2}≒25.840
A薬 11  \left(11 - 11.333 \right)^{2}≒0.111  \left(11 - 15.083 \right)^{2}≒16.674
A薬 13  \left(13 - 11.333 \right)^{2}≒2.778  \left(13 - 15.083 \right)^{2}≒4.340
A薬 10  \left(10 - 11.333 \right)^{2}≒1.778  \left(10 - 15.083 \right)^{2}≒25.840
A薬 11  \left(11 - 11.333 \right)^{2}≒0.111  \left(11 - 15.083 \right)^{2}≒16.674
A薬 11  \left(11 - 11.333 \right)^{2}≒0.111  \left(11 - 15.083 \right)^{2}≒16.674
A薬 12  \left(12 - 11.333 \right)^{2}≒0.444  \left(12 - 15.083 \right)^{2}≒9.507
A薬 11  \left(11 - 11.333 \right)^{2}≒0.111  \left(11 - 15.083 \right)^{2}≒16.674
A薬 13  \left(13 - 11.333 \right)^{2}≒2.778  \left(13 - 15.083 \right)^{2}≒4.340
B薬 13  \left(13 - 14.875 \right)^{2}≒3.516  \left(13 - 15.083 \right)^{2}≒4.340
B薬 14  \left(14 - 14.875 \right)^{2}≒0.766  \left(14 - 15.083 \right)^{2}≒1.174
B薬 15  \left(15 - 14.875 \right)^{2}≒0.016  \left(15 - 15.083 \right)^{2}≒0.007
B薬 15  \left(15 - 14.875 \right)^{2}≒0.016  \left(15 - 15.083 \right)^{2}≒0.007
B薬 16  \left(16 - 14.875 \right)^{2}≒1.266  \left(16 - 15.083 \right)^{2}≒0.840
B薬 14  \left(14 - 14.875 \right)^{2}≒0.766  \left(14 - 15.083 \right)^{2}≒1.174
B薬 15  \left(15 - 14.875 \right)^{2}≒0.016  \left(15 - 15.083 \right)^{2}≒0.007
B薬 17  \left(17 - 14.875 \right)^{2}≒4.516  \left(17 - 15.083 \right)^{2}≒3.674
C薬 20  \left(20 - 20.143 \right)^{2}≒0.020  \left(20 - 15.083 \right)^{2}≒24.174
C薬 19  \left(19 - 20.143 \right)^{2}≒1.306  \left(19 - 15.083 \right)^{2}≒15.340
C薬 19  \left(19 - 20.143 \right)^{2}≒1.306  \left(19 - 15.083 \right)^{2}≒15.340
C薬 22  \left(22 - 20.143 \right)^{2}≒3.449  \left(22 - 15.083 \right)^{2}≒47.840
C薬 21  \left(21 - 20.143 \right)^{2}≒0.735  \left(21 - 15.083 \right)^{2}≒35.007
C薬 20  \left(20 - 20.143 \right)^{2}≒0.020  \left(20 - 15.083 \right)^{2}≒24.174
C薬 20  \left(20 - 20.143 \right)^{2}≒0.020  \left(20 - 15.083 \right)^{2}≒24.174

この群内の偏差平方を足し合わせたものが残差平方和で、 全体の偏差平方を足し合わせたものが全体平方和。
 \quad S_{e}=\sum _{k=1} ^{a}\sum _{i=1} ^{n_{k}} \left( y_{k_{i}}-\overline{y_{k}}\right) ^{2}≒1.778 + 0.111 + ... + 0.020 + 0.020≒27.732
 \quad S_{T}=\sum \left( y_{i}-\bar{\bar{y}}\right) ^{2}≒25.840 + 16.674 + ... + 24.174 + 24.174 ≒333.833

また、全体のN数が24、水準数が3つ(A薬、B薬、C薬)のため、自由度は次のとおり。
\quad f_{e}=n-a=24-3=21
\quad f_{T}=n-1=24-1=23

 

最後に、これら平方和・自由度を分散分析表にまとめて F値 と p値 を算出する。

変動因 平方和 自由度 平均平方 F値(F比)
水準間A S_{A}=\sum n_{k}\left( \overline{y_{k}} - \bar{\bar{y}}\right) ^{2}
≒306.101
f_{A}=a-1
=2
V_{A}=S_{A}/f_{A}
≒306.101/2
≒153.051 
F_{A}=V_{A}/V_{e}
≒153.051/1.321
≒115.8967
残差e

S_{e}=\sum _{k=1} ^{a}\sum _{i=1} ^{n_{k}} \left( y_{k_{i}}-\overline{y_{k}}\right) ^{2}
≒27.732 

f_{e}=n-a
=21
V_{e}=S_{e}/f_{e}
≒27.732/21
≒1.321
 
全体T S_{T}=\sum \left( y_{i}-\bar{\bar{y}}\right) ^{2}
≒333.833 
f_{T}=n-1
=23 
   

分散分析表のとおり、F値=115.8967。
水準間自由度が2、残差自由度が21のため、F分布より p<0.0001 。  

 

また、カテゴリー変数をダミー変数にすることで、各薬剤の条件付き期待値を求める。

下図はExcelのLINEST関数で実行結果。

■ 重回帰式
\quad \hat{y} = 11.333 + 3.542 \cdot D1 + 8.810 \cdot D2
 

■ LINEST関数による実行結果
f:id:cochineal19:20210214143253p:plain

 

Rでの実行:

> ADS1 <- data.frame(
+   TRT01AN=c(0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2)
+   ,AVAL=c(10,11,13,10,11,11,12,11,13,13,14,15,15,16,14,15,17,20,19,19,22,21,20,20))
> ADS1$投与群 <- factor(ifelse(ADS1$TRT01AN==0,"A薬",ifelse(ADS1$TRT01AN==1,"B薬","C薬")),levels=c("A薬","B薬","C薬"))
> anova(aov(AVAL~投与群, data=ADS1))
Analysis of Variance Table
Response: AVAL
          Df  Sum Sq Mean Sq F value    Pr(>F)    
投与群     2 306.101 153.051   115.9 4.511e-12 ***
Residuals 21  27.732   1.321                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

SASでの実行:

data ADS;
  do AVAL = 10, 11, 13, 10, 11, 11, 12, 11, 13; TRT01A="A薬"; output; end;
  do AVAL = 13, 14, 15, 15, 16, 14, 15, 17; TRT01A="B薬"; output; end;
  do AVAL = 20, 19, 19, 22, 21, 20, 20; TRT01A="C薬"; output; end;
run;
proc anova data=ADS;
  class TRT01A;
  model AVAL = TRT01A;
run;

f:id:cochineal19:20210213211357p:plain

 

プログラムコード 


Rのコード

#-- aovを使う場合
anova(aov(AVAL ~ FACTOR1, data=ADS1)

#-- lmを使う場合
anova(lm(AVAL ~ FACTOR1, data=ADS1)

SASのコード

/* anovaプロシジャを使う場合 */
proc anova data=ADS;
class FACTOR1; /*class指定必須*/
model AVAL = FACTOR1;
run;

/* glmプロシジャを使う場合 */
proc glm data=ADS1 outstat=OUTDS; class FACTOR1; /*class指定必須*/ model AVAL = FACTOR1; run;

Pythonのコード

from scipy import stats
stats.f_oneway(x, y, z)

 

残差平方和と水準間平方和の違い


残差平方和(群内平方和)と水準間平方和(群間平方和)の違いのイメージ。 

library(tidyverse)
ADS1 <- data.frame(
  TRT01AN=c(0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2)
  ,AVAL=c(10,11,13,10,11,11,12,11,13,13,14,15,15,16,14,15,17,20,19,19,22,21,20,20))
ADS1$投与群 <- factor(ifelse(ADS1$TRT01AN==0,"A薬",ifelse(ADS1$TRT01AN==1,"B薬","C薬")),levels=c("A薬","B薬","C薬"))
ADS2 <- ADS1 %>% group_by(投与群) %>% summarise(means=mean(AVAL))
ggplot(data=ADS1, mapping=aes(x=投与群, y=AVAL)) +
  geom_boxplot(mapping=aes(fill=投与群), alpha=.5) +
  geom_jitter(color="darkgreen", alpha=.7, size=3) +
  geom_hline(yintercept=mean(ADS1$AVAL),linetype="dashed",colour="blue") +
  geom_point(data=ADS2, aes(x=投与群, y=means),shape=23, size=3, fill="red") +
  labs(x="投与群", y="評価指標X", title="投与群別の評価指標X", color="投与群", caption="🄫Cochineal19") +
  theme(plot.title=element_text(size=30)
        ,axis.title=element_text(size=25)
        ,axis.text=element_text(size=20)
        ,legend.title=element_text(size=20)
        ,legend.text=element_text(size=20))

f:id:cochineal19:20210213204930p:plain

グラフの青い点線が総平均( \bar{\bar{y}} ひし形の赤点が各水準の平均値( \overline{y_{A}},\ \overline{y_{B}},\ \overline{y_{C}} 緑のプロットが個々の観測値(  y_{i}を表す。
このうち、各群の平均(ひし形の赤点)全体の平均(青い点線)との偏差平方和が水準間平方和(群間平方和)。
そして、各群の平均(ひし形の赤点)各群の観測値(緑のプロット)との偏差平方和が残差平方和(群内平方和)。

 

参考


統計学基礎(出版:東京図書), 日本統計学会編

統計学(出版:東京図書), 日本統計学会編

 


サイトマップ

cochineal19.hatenablog.com

本ブログは個人メモです。 本ブログの内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。