3組以上のデータ(対応のない3標本のデータか,対応のある1標本の3群のデータ) の間に差があるかどうか検定する手法である。この手法は,数値データ (順序,間隔と比率尺度)に適用される。図1は,15名の患者が3組の 疾患(A,BとC)に分けられ,各組の患者の歩行速度を測定したデータである。 各組間の歩行速度の差があるかどうかを検定したい場合,分散分析が用いられる。 ここで,「疾患」を要因といい,疾患A,疾患Bと疾患Cをそれぞれ水準という。 即ち,各水準間に有意な差があるかを検定する手法である。
分散分析には,主に一元配置分散分析(one-way
ANOVA) とクラスカル・ワリスの検定(Kruskal-Wallis
test)がある。
分散分析は,3組以上のデータは,各組が正規分布であれば, 各組の「平均値1」に差があるかを検定するパラメトリック手法である。
正規性の検定には,シャピロ・ウイルク(Shapiro-Wilk)検定法がよく使われる。 各組のデータを検定した結果,各組のp値が0.05以上ならば(正規分布と認め), 分散分析が適用される。要因が1つしかない場合,一元配置分散分析といい, 要因がn個の場合,n元配置分散分析(n-way ANOVA)という。 ここでは,一元配置分散分析のみを説明する。
クラスカル・ワリスの検定は,3組以上のデータにおいて, シャピロ・ウイルク検定で,少なくとも1組が 正規分布でなければ,各組間の「中央値」に差があるかを 検定するノンパラメトリック手法である。
一元配置分散分析の手順は図2に示す2。
(1)一元配置分散分析の対象データの尺度(順序,間隔と比率)をチェックする。
(2)帰無仮説:要因に差がないと仮定する。
(3)シャピロ検定で各水準のデータの正規性を検定する。すべて正規分布 であれば,一元配置分散分析が適用され,少なくとも1つが正規分布ではない場合, クラスカル・ワリスの検定が適用される。
(4)一元配置分散分析(またはクラスカル・ワリスの検定)を 行った後,分析した結果のp値0.05未満ならば, 帰無仮説を棄却し,要因に有意な差があると判断する。この場合, 例えば,3つの水準(A,B,C)があり,AとBの間か,AとCの間か,BとCの間か, 少なくともある2つの水準に差があるならば,要因に有意な差があると認める。
(5)要因に有意な差があると判断された場合,多重比較法を行い, 各水準間に差があるかどうかを詳しく調べる。上の(4)で要因に差があると言えない 場合(p値0.05以上),多重比較法を行わない。
(6)各水準のデータの特性値を箱ひげ図で表示し,検定した結果が確認できる。
R言語で分散分析を実装するとき,下記のことを考慮に入れた。
(1)ライブラリ「dplyr」,「FSA」,「ggplot2」を利用するため, Line 2-4は,3つのライブラリを読み込む。
(2)データは,データフレームで与える。例として,3つのデータ (例1,例2,例3)をLine7-12に用意し,実行時に1つを選んで, その他を#で閉じること。例1(Line 9)と例2(Line 10)は, 一元配置分散分析に適用され,例1は有意な差があると認め, 例2は,有意な差があると言えない。例3(Line 11)は クラスカル・ワリスの検定に適用される。 各水準のデータ数が異なる場合,Line 8のgroup = factor() の中のTimes = c()で指定する。例えば,A群の要素が6,B群の要素が5, C群の要素が4の場合,Times = C(6, 5, 4)と指定する。データ数が多い場合, csvファイルで入力することを勧める。
(3)正規性はシャピロ・ウイルク検定(Line 19-26)を用いる。全ての水準が 正規分布(シャピロ検定結果,p>0.05)であれば,Line 31-38は, 自動に一元配置分散分析を行い,少なくとも1つが正規分布ではなければ, Line 50-55は,クラスカル・ワリス検定を行う。
(4)一元配置分散分析の結果,p値が0.05未満の場合,帰無仮説を棄却し, 「要因に有意な差がある」と認めた場合, Line 42-44の多重比較法(Tukey HSD)を行い, 各水準間に差があるか(p値が0.05未満), また,あるとは言えないか(p値が0.05以上)を検定する。 「要因に有意な差がある」と認められない場合(p値が0.05以上), 多重比較法を実行しない。
(5)クラスカル・ワリス検定の結果,p値が0.05未満の場合,帰無仮説を棄却し, 「要因に有意な差がある」と認めた場合,Line 58-61のDunnのbonferroniという 多重比較法(スティール・ドゥワス検定の代替)を実行する。
(6)Line 68は箱ひげ図を表示する。 # fill = group を color = groupに変えれば,グラフの枠線に色付けられる。
#3群以上差の検定(一元配置分散分析とクラスカル・ワリス検定+多重比較法)
library(dplyr) #なければ, install.packages("dplyr")を実行
library(FSA) #なければ, install.packages("FSA")を実行
library(ggplot2) #なければ, install.packages("ggplot2")を実行
#データの入力
data <- data.frame(
group =factor(rep(c("A", "B", "C"), times = c(5, 5, 5))),
value = c(8, 9, 6, 7, 10, 12, 14, 13, 15, 11, 5, 7, 6, 8, 9) #one-way ANOVA例1
#value = c(30.5,22.5,28,18.5,34,31,36.5,13,25.5,16,18,33,45.5,39,26) #one-way ANOVA例2
#value = c(8, 9, 6, 7, 10, 12, 14, 13, 15, 11, 1, 9, 1, 8, 9) #Krushal-wallis例3
)
# データの確認
cat("\n入力されたデータ:\n")
print(data)
#シャピロ検定
result <- data %>%
group_by(group) %>%
summarise(shapiro_p_value = shapiro.test(value)$p.value) %>%
ungroup() # グループ化を解除(念のため)
# 結果を出力
cat("\nシャピロ法で正規性を検定した結果:\n")
print(result)
# 各 p値が 0.05 以上なら 1(AND が真)、そうでなければ 0(AND が偽)
and_result <- as.integer(all(result$shapiro_p_value >= 0.05))
if (and_result ==1){
cat("\n正規分布であるため,一元配置分散分析を行う\n")
# ANOVAの実行
anova_result <- aov(value ~ group, data = data)
# ANOVAの結果を表示
print(summary(anova_result))
# p値を取得
p_value <- summary(anova_result)[[1]]$`Pr(>F)`[1] # 第1行のp値
# p < 0.05 の場合のみ Tukey HSD 検定を実行
if (p_value < 0.05) {
cat("\n一元配置分散分析の結果p =", p_value, "なので,有意な差があると認め,\n")
cat("多重比較法(Tukey HSD)を行う。\n")
tukey_result <- TukeyHSD(anova_result)
print(tukey_result)
} else {
cat("\n一元配置分散分析のp =", p_value, "なので,有意な差があると言えないから,多重比較法を実行しない。\n")
}
#plot(tukey_result) #95%全体信頼水準のグラフ
}else{
cat("\n正規分布でない水準があり,クラスカル・ワリス検定を行う。\n ")
# クラスカル・ワリス検定の実行
kruskal_result <- kruskal.test(value ~ group, data = data)
print(kruskal_result)
# p値を取得
p_value <- kruskal_result$p.value
if (p_value < 0.05) {
cat("\nクラスカル・ワリス検定の結果p = ", p_value, "なので,有意な差があると認め,\n")
cat("多重比較法(Dunn検定(スティール・ドゥワス検定の代替)を行う。\n")
dunn_result <- dunnTest(value ~ group, data = data, method = "bonferroni")
cat("\n Dunn検定結果(スティール・ドゥワス検定の代替)\n ")
print(dunn_result)
} else {
cat("\nクラスカル・ワリス検定のp =", p_value, "なので,有意な差があると言えないから,多重比較法を実行しない。\n")
}
}
# ggplot2を使った箱ひげ図
print(ggplot(data, aes(x = group, y = value, fill = group)) + geom_boxplot() + theme_minimal()) # fill = group を color = groupグラフの枠線に色付け例1のデータを分散分布した結果:
## Warning: パッケージ 'dplyr' はバージョン 4.4.2 の R の下で造られました
##
## 次のパッケージを付け加えます: 'dplyr'
## 以下のオブジェクトは 'package:stats' からマスクされています:
##
## filter, lag
## 以下のオブジェクトは 'package:base' からマスクされています:
##
## intersect, setdiff, setequal, union
## Warning: パッケージ 'FSA' はバージョン 4.4.2 の R の下で造られました
## ## FSA v0.9.6. See citation('FSA') if used in publication.
## ## Run fishR() for related website and fishR('IFAR') for related book.
##
## 入力されたデータ:
## group value
## 1 A 8
## 2 A 9
## 3 A 6
## 4 A 7
## 5 A 10
## 6 B 12
## 7 B 14
## 8 B 13
## 9 B 15
## 10 B 11
## 11 C 5
## 12 C 7
## 13 C 6
## 14 C 8
## 15 C 9
##
## シャピロ法で正規性を検定した結果:
## # A tibble: 3 × 2
## group shapiro_p_value
## <fct> <dbl>
## 1 A 0.967
## 2 B 0.967
## 3 C 0.967
##
## 正規分布であるため,一元配置分散分析を行う
## Df Sum Sq Mean Sq F value Pr(>F)
## group 2 103.3 51.67 20.67 0.00013 ***
## Residuals 12 30.0 2.50
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## 一元配置分散分析の結果p = 0.0001297463 なので,有意な差があると認め,
## 多重比較法(Tukey HSD)を行う。
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = value ~ group, data = data)
##
## $group
## diff lwr upr p adj
## B-A 5 2.332136 7.667864 0.0008342
## C-A -1 -3.667864 1.667864 0.5907706
## C-B -6 -8.667864 -3.332136 0.0001701
例1のデータで実行した結果から,次のように解釈できる。
正規性の判定結果,3つの水準A,BとCのp値が0.967 > 0.05, 3つとも正規分布と認める。よって,一元配置分散分析が適用される。
一元配置分散分析結果,そのp値が0.00013<0.05, 帰無仮説を棄却し,要因に有意な差があると判断。
多重比較法の結果,BとA間にp=0.00083<0.05, CとB間にp=0.00017<0.05 となり,有意な差があると認められ,CとA間はp=0.59>0.05,差があると言えない。
各水準A,BとCのデータを箱ひげ図で示し,確かにAとB,BとCに差があり, AとCに差があるとは言えない状態を箱ひげ図で確認できる。