【R講座】分散分析の方法と実践

R

この記事では、分散分析(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の多重比較の方法について紹介します。

この記事が少しでもお役に立てたら嬉しいです。

プロフィール
この記事を書いた人

農学の博士前期課程を修了した研究者の卵。
植物生理と環境調節をテーマに研究しています。

Masaをフォローする
R統計
Masaをフォローする
タイトルとURLをコピーしました