一元配置分散分析(One-way ANOVA)について。
【目次】
t検定 は2群の平均の差を評価するもの。
3群以上の場合は、分散分析(ANOVA:ANalysis Of VAriance)が広く用いられる。
帰無仮説、対立仮設
- 帰無仮説
- 対立仮設
少なくとも一つの群の平均が異なる
帰無仮説・対立仮設のとおり平均に差があるかを見ている。
計算式等
分散分析では、帰無仮説のとおり各水準の母平均がすべて等しければ、群間の変動 はランダムな変動
(群内の誤差変動)の範囲内として説明でき、そうでなければその比(
)は大きくなるだろうということを見ている。
分散分析は次の「分散分析表」にまとめることができる。
算出したF値(F統計量)をもとに、F分布を使って検定を行う。
■ 分散分析表
変動因 | 平方和 | 自由度 | 平均平方 | F値(F比) |
---|---|---|---|---|
水準間A | ||||
残差e | ||||
全体T |
※ k=特定の水準、i=特定の観測値、=特定の水準の平均値、
=全体の平均値(総平均)、a=水準数
ここで平方和と自由度には次の関係がある。
なお、 は全体平方和、
は水準間平方和や群間平方和、
は残差平方和や群内平方和などと呼ばれる。
また、質的変数をダミー変数(0と1の数量変数)にして重回帰分析を行うことでも、各水準の条件付き期待値を算出できる(数量化理論1類)。
例えば、A薬、B薬、C薬の3水準の場合、次のようにダミー変数を作成。
・ダミー変数1(D1):B薬=1、それ以外=0
・ダミー変数2(D2):C薬=1、それ以外=0
■ 重回帰モデル
■ 重回帰式
この重回帰式により各水準を次のとおり推定。
・A薬:D1とD2が0になるため、 が期待値。
・B薬:D2が0になるため、 が期待値。
・C薬:D1が0になるため、 が期待値。
計算例
簡単なデータで計算方法を確認する。
今回は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 | --- | |
A薬 | 9 | ||
B薬 | 8 | ||
C薬 | 7 |
このA~C薬の偏差平方和を足し合わせると水準間平方和になる。
また、今回は水準数が3つ(A薬、B薬、C薬)のため自由度=2。
次に、個々の観測値について、各水準の平均からのズレ(群内の偏差平方)と総平均からのズレ(全体の偏差平方)を求める。
※ なので1つ分かれば十分だが、計算の理解のため両方求める。
投与群 | 評価指標X | 群内の偏差平方 |
全体の偏差平方 |
A薬 | 10 | ||
A薬 | 11 | ||
A薬 | 13 | ||
A薬 | 10 | ||
A薬 | 11 | ||
A薬 | 11 | ||
A薬 | 12 | ||
A薬 | 11 | ||
A薬 | 13 | ||
B薬 | 13 | ||
B薬 | 14 | ||
B薬 | 15 | ||
B薬 | 15 | ||
B薬 | 16 | ||
B薬 | 14 | ||
B薬 | 15 | ||
B薬 | 17 | ||
C薬 | 20 | ||
C薬 | 19 | ||
C薬 | 19 | ||
C薬 | 22 | ||
C薬 | 21 | ||
C薬 | 20 | ||
C薬 | 20 |
この群内の偏差平方を足し合わせたものが残差平方和で、 全体の偏差平方を足し合わせたものが全体平方和。
また、全体のN数が24、水準数が3つ(A薬、B薬、C薬)のため、自由度は次のとおり。
最後に、これら平方和・自由度を分散分析表にまとめて F値 と p値 を算出する。
変動因 | 平方和 | 自由度 | 平均平方 | F値(F比) |
---|---|---|---|---|
水準間A | ||||
残差e |
|
|||
全体T |
分散分析表のとおり、F値=115.8967。
水準間自由度が2、残差自由度が21のため、F分布より p<0.0001 。
また、カテゴリー変数をダミー変数にすることで、各薬剤の条件付き期待値を求める。
下図はExcelのLINEST関数で実行結果。
■ 重回帰式
■ LINEST関数による実行結果
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;
プログラムコード
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))
グラフの青い点線が総平均( )、ひし形の赤点が各水準の平均値(
)、緑のプロットが個々の観測値(
)を表す。
このうち、各群の平均(ひし形の赤点)と全体の平均(青い点線)との偏差平方和が水準間平方和(群間平方和)。
そして、各群の平均(ひし形の赤点)と各群の観測値(緑のプロット)との偏差平方和が残差平方和(群内平方和)。
参考