この記事では、分散分析(ANOVA)について紹介しています。
分散分析(ANOVA)とは
分散分析(ANOVA)は、異なる群の平均値が統計的に異なるかどうかを検証するための手法です。例えば、異なる肥料を使った植物の成長速度を比較する際に使用されます。
前提条件
分散分析を行う際には以下の条件を考慮する必要があります。
- 対応の有無:
- 対応のあるデータ(例:同じ植物個体に対する施肥効果の前後比較)
- 対応のないデータ(例:異なる植物に対する異なる施肥効果の比較)
- 正規性:データが正規分布に従っているか。
- 等分散性:各群の分散が等しいか。
- 群数:3群以上。
- データ尺度:データが間隔尺度または比尺度であること。
仮説の設定
分散分析を行う前に、以下の仮説を設定します。
- 帰無仮説(H0):全ての群の平均値は等しい。
- 対立仮説(H1):少なくとも1つの群の平均値が他と異なる。
分散分析の種類
- 一元配置分散分析:1つの独立変数(因子)を持つ分散分析。
- 二元配置分散分析:2つの独立変数(因子)を持つ分散分析。
- 対応のある分散分析:同じ被験者を複数回測定したデータに対する分散分析。
Rで分散分析
Rを用いて分散分析を行う方法を紹介します。
関数と引数オプション
Rで分散分析を行うための主な関数はaov
関数です。以下に主な引数オプションを示します。
# aov(formula, data = NULL, projections = FALSE, qr = TRUE, contrasts = NULL, ...)
# formula: 分析するモデルの式。例:y ~ x(yは従属変数、xは独立変数)
# data: データフレーム。分析に用いるデータを指定します
# projections: 投影行列を含むかどうか
# qr: QR分解を行うかどうか
# contrasts: 対比の設定
# ...: その他のオプション
コード例と結果の見方
一元配置分散分析
# 一元配置分散分析
# データの作成
data <- data.frame(
group = factor(rep(c("A", "B", "C"), each = 10)),
value = c(rnorm(10, mean = 5), rnorm(10, mean = 6), rnorm(10, mean = 7))
)
# 一元配置分散分析の実行
aov(value ~ group, data = data)
# 一元配置分散分析の結果Df Sum Sq Mean Sq F value Pr(>F)
group 2 110.9 55.45 10.14 0.0005 ***
Residuals 27 147.7 5.47
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
有意水準を5%とする場合、p値が0.05未満であれば、対立仮説を採択し、少なくとも1つの群の平均値が他と異なると判断します。
oneway.test()
関数を使うことで
- 等分散を仮定する場合
- 等分散を仮定できない場合
の一元配置分散分析を行えます。
等分散を仮定できるとき
# 一元配置分散分析(等分散を仮定)
# データの作成
group <- factor(rep(1:3, each = 5))
value <- c(5.1, 5.5, 5.8, 6.0, 6.1, 6.2, 6.4, 6.5, 6.6, 6.9, 7.0, 7.1, 7.3, 7.4, 7.5)
# oneway.test関数を使用して分散分析を実行
oneway.test(value ~ group, var.equal = TRUE)
# 結果
One-way analysis of means
data: value and group
F = 33.215, num df = 2, denom df = 12, p-value = 1.283e-05
等分散を仮定できないとき
# 一元配置分散分析(等分散を仮定しない)
# データの作成
group <- factor(rep(1:3, each = 5))
value <- c(5.1, 5.5, 5.8, 6.0, 6.1, 6.2, 6.4, 6.5, 6.6, 6.9, 7.0, 7.1, 7.3, 7.4, 7.5)
# oneway.test関数を使用して分散分析を実行
oneway.test(value ~ group, var.equal = FALSE)
# 結果
One-way analysis of means (not assuming equal variances)
data: value and group
F = 30.844, num df = 2.000, denom df = 7.571, p-value = 0.0002296
対応のある一元配置分散分析
# 対応のある一元配置分散分析
# データの作成
subject <- factor(rep(1:5, each = 3))
treatment <- factor(rep(1:3, times = 5))
value <- c(5.1, 5.5, 5.8, 6.2, 6.4, 6.5, 7.0, 7.1, 7.3, 6.0, 6.6, 6.9, 7.4, 7.5, 7.6)
# aov関数を使用して分散分析を実行
aov_result <- aov(value ~ treatment + Error(subject/treatment))
summary(aov_result)
# 結果
Error: subject
Df Sum Sq Mean Sq F value Pr(>F)
Residuals 4 7.329 1.832
Error: subject:treatment
Df Sum Sq Mean Sq F value Pr(>F)
treatment 2 0.5813 0.29067 11.7 0.00421 **
Residuals 8 0.1987 0.02483
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
有意水準を5%とする場合、p値が0.05未満であれば、対立仮説を採択し、少なくとも1つの群の平均値が他と異なると判断します。
二元配置分散分析
二元配置分散分析を行うには、aov
関数を使用します。
# 二元配置分散分析
# データの作成
group1 <- factor(rep(1:2, each = 15))
group2 <- factor(rep(1:3, times = 10))
value <- c(5.1, 5.5, 5.8, 6.0, 6.1, 6.2, 6.4, 6.5, 6.6, 6.9, 7.0, 7.1, 7.3, 7.4, 7.5,
7.6, 7.8, 7.9, 8.0, 8.1, 8.2, 8.4, 8.5, 8.6, 8.7, 8.8, 8.9, 9.0, 9.1, 9.2)
# aov関数を使用して二元配置分散分析を実行
aov_result <- aov(value ~ group1 * group2)
summary(aov_result)
# 結果
Df Sum Sq Mean Sq F value Pr(>F)
group1 1 28.812 28.812 66.617 2.21e-08 ***
group2 2 0.339 0.169 0.392 0.680
group1:group2 2 0.008 0.004 0.009 0.991
Residuals 24 10.380 0.433
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
有意水準を5%とする場合、p値が0.05未満であれば、対立仮説を採択し、少なくとも1つの群の平均値が他と異なると判断します。
この結果からは、group1の効果に有意差が見られ、group2と交互作用に有意差は見られないことがわかります。
対応のある二元配置分散分析
# 対応のある二元配置分散分析
# データの作成
subject <- factor(rep(1:5, each = 6))
treatment1 <- factor(rep(1:2, each = 3, times = 5))
treatment2 <- factor(rep(1:3, times = 10))
value <- c(5.1, 5.5, 5.8, 6.2, 6.4, 6.5, 7.0, 7.1, 7.3, 6.0, 6.6, 6.9, 7.4, 7.5, 7.6,
7.7, 7.8, 7.9, 8.0, 8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7, 8.8, 8.9, 9.0, 9.1)
# aov関数を使用して分散分析を実行
aov_result <- aov(value ~ treatment1 * treatment2 + Error(subject/(treatment1 * treatment2)))
summary(aov_result)
# 結果
Error: subject
Df Sum Sq Mean Sq F value Pr(>F)
Residuals 4 32.29 8.072
Error: subject:treatment1
Df Sum Sq Mean Sq F value Pr(>F)
treatment1 1 0.4083 0.4083 0.901 0.396
Residuals 4 1.8133 0.4533
Error: subject:treatment2
Df Sum Sq Mean Sq F value Pr(>F)
treatment2 2 0.5807 0.2903 14.89 0.00201 **
Residuals 8 0.1560 0.0195
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Error: subject:treatment1:treatment2
Df Sum Sq Mean Sq F value Pr(>F)
treatment1:treatment2 2 0.00467 0.002333 0.135 0.876
Residuals 8 0.13867 0.017333
有意水準を5%とする場合、p値が0.05未満であれば、対立仮説を採択し、少なくとも1つの群の平均値が他と異なると判断します。
この結果からは、treatment2の効果に有意差が見られ、treatment1と交互作用に有意差は見られないことがわかります。
この記事はRを使用して分散分析を行う方法について解説しました。
次回はTukeyの多重比較の方法について紹介します。
この記事が少しでもお役に立てたら嬉しいです。