Series C-2 / Clinical Statistics
Shapiro、Bartlett、ANOVA、多重比較までの実践
実験結果を実際に統計へ流す
この回では、Control、材料A、材料B、材料Cのような3群以上の連続量データを例に、図を見るところからANOVA後の多重比較までを一連の作業として整理する。ポイントは、Shapiro-Wilk検定やBartlett検定を「通過儀礼」として機械的に使わないことである。仮定の確認は、検定名を決めるためだけでなく、データの癖を理解するために行う。
想定するデータ
例として、4群の試料でALP活性、細胞接着数、接触角、遺伝子発現量などを測ったCSVを考える。列は sample_id、group、value の3つで十分である。実験日、プレート番号、操作者、測定バッチがある場合は、後でばらつきの原因を追えるように列として残す。
1. 解析前にデータを整える
統計解析の前に、データの形を整える。1行が1観測、1列が1変数になるようにする。群名は Control、Material_A、Material_B のように一貫させる。空欄、文字列の混入、単位の混在、桁の入力ミスを確認する。Excelで平均済みの表だけを残すと、後で外れ値や分布を確認できないので、必ず生データに近い形を残す。
sample_id,group,value
S01,Control,1.12
S02,Control,1.08
S03,Material_A,1.31
S04,Material_A,1.44
S05,Material_B,1.76
生物系実験では、nが何を意味するかも重要である。ウェル数なのか、独立した試料数なのか、動物数なのか、患者数なのか。技術的反復を独立サンプルとして扱うと、見かけ上nが増え、p値が過度に小さくなる。統計に入れる単位は、研究の推論単位とそろえる必要がある。
2. まず図を見る
検定の前に、箱ひげ図、ドットプロット、ヒストグラム、Q-Qプロットを見る。平均と標準偏差だけでは、外れ値、歪み、二峰性、天井効果、群ごとの分散の違いが見えない。生物系データでは、1点の測定失敗が平均とp値を大きく動かすことがある。
dat <- read.csv("experiment.csv")
dat$group <- factor(dat$group)
boxplot(value ~ group, data = dat,
ylab = "Measured value", xlab = "Group")
stripchart(value ~ group, data = dat,
vertical = TRUE, method = "jitter",
pch = 16, add = TRUE)
箱ひげ図にドットを重ねると、各群のnと分布が見えやすい。学部生向け教材では、棒グラフだけで平均とエラーバーを見せるより、ドットを重ねた図を標準にしたほうがよい。実験データの解釈は、図から始める。
3. Shapiro-Wilk検定: 正規性を確認する
Shapiro-Wilk検定は、データが正規分布から大きく外れていないかを調べる検定である。ANOVAでは、厳密には各群の生データそのものより、モデルの残差が正規分布に近いことが重要である。初学者向けには、まず群ごとに分布を見て、次にANOVAモデルの残差を見る、という順番で理解するとよい。
by(dat$value, dat$group, shapiro.test)
fit <- aov(value ~ group, data = dat)
qqnorm(residuals(fit))
qqline(residuals(fit))
shapiro.test(residuals(fit))
Shapiro-Wilk検定のp値が0.05未満なら「正規性から外れている可能性がある」と読む。ただし、小さいnでは検出力が低く、かなり歪んでいても有意にならないことがある。逆に大きいnでは、実質的に問題が小さいズレも有意になりやすい。したがって、Q-Qプロットやヒストグラムと合わせて判断する。
4. Bartlett検定とLevene検定: 分散の等質性
Bartlett検定は、群ごとの分散が等しいかを確認する古典的な方法である。ANOVAは、群ごとの分散が大きく違わないことを前提にしているため、分散の等質性は大切な確認点である。ただし、Bartlett検定は非正規性に敏感であり、分布が歪んでいる場合には過敏に反応することがある。
bartlett.test(value ~ group, data = dat)
# carパッケージが使える場合
# install.packages("car")
library(car)
leveneTest(value ~ group, data = dat)
分散等質性に関する臨床試験向けの総説では、Bartlett、Levene、Brown-Forsytheなど複数の検定が整理され、データの分布や群数に応じて使い分ける必要があると説明されている。実務では、Bartlett検定だけに頼らず、箱ひげ図で群ごとの散らばりを見て、外れ値や歪みがある場合はLevene検定、Welch ANOVA、変換、ノンパラメトリック法を検討する。
5. ANOVAへ進む
正規性と等分散性が大きく崩れていなければ、一元配置ANOVAへ進む。ANOVAのF統計量は、群間のばらつきが群内のばらつきに比べてどれくらい大きいかを表す。p値が小さい場合、群の平均がすべて等しいという帰無仮説のもとでは、そのデータが起こりにくいと考える。
一元配置ANOVAで見る比
fit <- aov(value ~ group, data = dat)
summary(fit)
# 等分散性が心配な場合
oneway.test(value ~ group, data = dat, var.equal = FALSE)
等分散性が崩れている場合、通常のANOVAではなくWelch ANOVAを使う選択肢がある。Rの oneway.test は var.equal = FALSE とするとWelch型の検定を行う。検定の選択は、ShapiroやBartlettのp値だけで自動的に決めるのではなく、図、n、外れ値、研究目的を合わせて判断する。
6. 多重比較: どこが違うかを見る
ANOVAで有意だった場合、次に多重比較を行う。全群のすべてのペアを比べたいならTukey法、Controlと各処理群を比べたいならDunnett法が候補になる。事前に「材料BだけをControlと比べる」と決めているなら、計画比較として扱うこともできる。
# 全ペア比較
TukeyHSD(fit)
# Dunnett法の例
# install.packages("multcomp")
library(multcomp)
dun <- glht(fit, linfct = mcp(group = "Dunnett"))
summary(dun)
多重比較で大切なのは、比較の数が増えるほど偶然の有意差が出やすくなるという点である。p < 0.05の線を何度も引けば、どこかが偶然に引っかかる可能性が上がる。だから、どの比較が主要な比較で、どの比較が探索的なのかを先に決めておく。
7. 結果の文章化
結果を書くときは、検定名、自由度、統計量、p値、補正方法、効果の方向を入れる。SAMPLガイドラインは、生物医学論文で統計手法と結果を透明に報告するための基本を整理している。初学者は、検定名だけを書くのではなく、どのアウトカムに対して、どの群を、どの方法で比較したかを文章にする練習をするとよい。
効果量も併記する場合の例
記載例
ALP活性は群間で有意に異なった(一元配置ANOVA, F(3, 20)=6.2, p=0.004)。Tukey法による多重比較では、Material_B群はControl群より高値を示した(調整後p=0.01)。
このように書くと、読者はどの検定を行い、何が主要な結果で、どの補正を使ったのかを追いやすい。グラフには平均と標準偏差、または中央値と四分位範囲を示し、nの定義も明記する。
8. 実践フローのまとめ
Step 1
CSV確認
1行1観測、群名、単位、欠測、nの定義を確認する。
Step 2
図で見る
箱ひげ図、ドット、Q-Qプロットで分布と外れ値を見る。
Step 3
仮定確認
Shapiro-Wilk、Bartlett、Leveneを図と一緒に読む。
Step 4
検定と報告
ANOVA、多重比較、効果量、信頼区間を報告する。
参考にした資料
- Statistical tests for homogeneity of variance for clinical trials and recommendations. Contemporary Clinical Trials Communications.
- Misuse of analysis of variance in African biomedical journals: a call for more vigilance. Bulletin of the National Research Centre.
- SAMPL Guidelines. EQUATOR Network.
- The Epidemiologist R Handbook: Simple statistical tests.
- The misuse and abuse of statistics in biomedical research. Biochemia Medica.