この記事では、分散分析(ANOVA)について紹介しています。
分散分析(ANOVA)とは
分散分析(ANOVA)は、3つ以上の群の平均値に統計的な差があるかを検証する手法です。例えば、異なる種類の肥料が植物の成長に与える影響を比較する際に使用されます。
分散分析の種類
分散分析には、いくつかの種類があります。以下にその代表的なものを紹介します。
- 一元配置分散分析:1つの独立変数(因子)を持つ分散分析。
- 二元配置分散分析:2つの独立変数(因子)を持つ分散分析。
- 対応のある分散分析:同じ被験者を複数回測定したデータに対する分散分析。
これらの他にも、要因の水準数や組み合わせによってさまざまな分散分析の方法があります。分散分析の種類は、研究のデザインや目的に応じて適切なものを選択します。
前提条件
分散分析を行う前に、以下の条件を確認しましょう。
- 対応の有無:
- 対応のあるデータ:同じ対象の前後比較(例:同じ人のダイエット前後の体重)
- 対応のないデータ:異なる対象の比較(例:異なる人々のグループ間比較)
- 正規性:データが正規分布に従っているか。
- 等分散性:各群の分散が等しいか。
- 群数:3群以上。
- データ尺度:データが間隔尺度または比尺度であること。
仮説の設定
分散分析を行う前に、以下の仮説を設定します。
一元配置分散分析
- 帰無仮説(H0):全ての群の平均値は等しい。
- 対立仮説(H1):少なくとも1つの群の平均値が他と異なる。
二元配置分散分析
要因1と要因2にそれぞれ次の仮説を設定します。
- 帰無仮説(H0):全ての群の平均値は等しい。
- 対立仮説(H1):少なくとも1つの群の平均値が他と異なる。
また、要因1と要因2の交互作用について次の仮説を設置します。
- 帰無仮説(H0):要因1と要因2は互いに影響しあわない。
- 対立仮説(H1):要因1と要因2は互いに影響する。
Rで分散分析
Rを用いて分散分析を行う方法を紹介します。
関数と引数オプション
Rで分散分析を行うための主な関数はaov
関数です。以下に主な引数オプションを示します。
aov(formula, data = NULL, projections = FALSE, qr = TRUE, contrasts = NULL, ...)
formula
: 分析モデルの式(例: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の多重比較の方法について紹介します。
この記事が少しでもお役に立てたら嬉しいです。