RにおけるANOVA:一元配置分散分析と二元配置分散分析(例付き)

⚡ スマートサマリー

R言語のANOVAは、総変動をグループ間変動とグループ内変動に分解することで、3つ以上のグループの平均値を比較します。このチュートリアルでは、毒物データセットに対して一元配置分散分析と二元配置分散分析を実行し、前提条件を確認し、Tukey HSDを用いて有意差のあるペアを特定します。

  • 📐 主要統計: F比は、グループ間のばらつきをグループ内のばらつきで割った値であるため、値が大きいほど平均値が等しいとは考えにくい。
  • 🧪 一方向構文: aov(time~poison, data = df) の後に summary() を実行すると、自由度、F 値、p 値が返されます。
  • 仮定のチェック: p値を信頼する前に、shapiro.test() で独立性、残差の正規性を、leveneTest() で等分散性を検定してください。
  • 🔎 事後分析: TukeyHSD() は、ファミリーワイズエラー率を指定されたレベルに維持しながら、すべてのグループのペアを比較します。
  • 🧮 双方向拡張機能: aov(time~poison + treat, data = df) は 2 番目の因子を追加し、poison:treat は交互作用項を追加します。
  • 📊 閲覧結果: p値が0.05未満の場合、平均値が等しいという帰無仮説は棄却されますが、どのグループが異なるかは特定できません。

RにおけるANOVA(一元配置分散分析、二元配置分散分析)

ANOVAとは?

分散分析 (ANOVA) は、2 つ以上のグループの平均値を比較するために使用される統計的手法です。このテストは、測定値の全変動を、グループメンバーシップによって説明される部分と、ランダムノイズとして残る部分に分割することによって機能します。したがって、R の ANOVA は、少なくとも 1 つのグループの平均が他のグループの平均と異なるかどうかを示しますが、どのグループが異なるかは示しません。これは、 t検定 要因変数が2つ以上の水準を持つ状況に適用される。

テストを実行する前に、ANOVAファミリーのどのメンバーが自分のテストデザインに適しているかを知っておくと役立ちます。

RにおけるANOVA検定の種類

「ANOVA」は単一の手法ではなく、一連の検定法の総称です。適切な検定法を選択するには、対象となる要因の数とデータの収集方法を考慮する必要があります。

ホイール試乗 いつ使用するか R呼び出し
一元配置分散分析 3つ以上のレベルを持つ1つの要因 aov(y ~ x, data = df)
二元配置分散分析 2つの独立した要因 aov(y ~ x1 + x2, data = df)
双方向のやり取り 一方の要因の影響は他方の要因に依存する aov(y ~ x1 * x2, data = df)
反復測定分散分析 同じ被験者を複数回測定した aov(y ~ x + Error(subject/x))
アンコバ 連続共変量を制御する必要がある aov(y ~ x + 共変量、データ = df)
マノバ 2つ以上の応答変数を同時に manova(cbind(y1, y2) ~ x)

このチュートリアルでは最初の3つのバージョンについて説明します。残りのバージョンも同じ aov() インターフェースを使用するため、1つの出力テーブルを読み込めるようになれば、すべて読み込めるようになります。

RにおけるANOVAとT検定:主な違い

どちらの検定も平均値を比較するため、どちらがどちらを置き換えるのかを正確に把握しておくことが重要です。

基準 T検定 ANOVA
グループ数 ちょうど2つ XNUMXつ以上
検定統計量 t Fは、2つのグループがある場合、tの2乗に等しい。
結果 差の方向を示す 違いが存在するという報告のみ
フォローアップが必要 なし Tukey HSDなどの事後検定
R関数 t.テスト() aov()

3つのグループがある場合、3つの別々のt検定を実行したくなる誘惑に駆られます。しかし、それは避けてください。各検定にはそれぞれ5%の誤差率があるため、3つの比較を行うと偽陽性の可能性が約14%にまで上昇します。ANOVAは1つの検定で同じ疑問に答え、Tukey HSDは誤差率を抑えながらペアワイズの詳細を処理します。2つのグループの場合については、以下を参照してください。 t検定チュートリアル.

一元配置分散分析

複数のグループ間の平均を比較する必要がある状況は数多くあります。 たとえば、マーケティング部門は、XNUMX つのチームの販売実績が同じかどうかを知りたいと考えています。

  • チーム: 3 つのレベル要素: A、B、C
  • セール: パフォーマンスの尺度

ANOVA テストでは、3 つのグループのパフォーマンスが類似しているかどうかがわかります。

データが同じ母集団からのものであるかどうかを明確にするには、次の操作を実行できます。 一元配置分散分析 (以下、一元配置分散分析と呼ぶ)。他の統計検定と同様に、帰無仮説H0を棄却できるかどうかについての証拠を提供する。ただし、H0を棄却できないことは、H0が正しいことを証明することとは異なることに注意が必要である。

一元配置分散分析における仮説

  • H0: グループ間の平均は同一です
  • H1: 少なくとも、XNUMX つのグループの平均値は異なります。

言い換えれば、帰無仮説H0を棄却できないということは、いずれかのグループの平均値が他のグループの平均値と異なると結論付けるのに十分な証拠がないことを意味する。

この検定はt検定に似ていますが、グループが2つ以上ある場合はANOVAが適切な選択肢となります。グループがちょうど2つの場合は、両方の検定は同等であり、F統計量はt統計量の2乗に等しくなります。

仮定

一元配置分散分析は、次の3つの条件に基づいています。観測値はランダムにサンプリングされ、互いに独立していること、各グループ内の残差はほぼ正規分布に従うこと、そしてすべてのグループで分散が同じであること(分散の均一性)。以下の前提条件の確認に関するセクションでは、Rでそれぞれの条件をテストする方法を示します。

ANOVAテストを解釈する

F 統計は、データが著しく異なる母集団、つまり異なるサンプル平均からのものであるかどうかを検定するために使用されます。

F 統計を計算するには、 グループ間の変動 以上 グループ内変動.

その グループ間 ばらつきは、各グループの平均値が全体の平均値からどれだけ離れているかを示します。以下の2つのグラフを比較して、その概念を理解してください。

左のグラフは、3つのグループ間の変動が非常に少ないことを示しており、3つのグループの平均値はすべて、 全体 平均。

右側のグラフは、互いに大きく離れており重なりがない3つの分布を示しているため、全体の平均値と各グループの平均値との差が大きい。

ANOVAテストを解釈する

その グループ内 変動性とは、個々の観測値がそのグループの平均からどれだけ離れているかを示す指標です。一部の観測値はグループ平均から大きく外れており、グループ内変動性という項はまさにそのばらつき、つまり標本誤差を捉えています。

グループ内変動の概念を視覚的に理解するには、以下のグラフを見てください。

左側の図は、3つの異なるグループの分布を示しています。各サンプルのばらつきを大きくすると、個々の分散が大きいことがわかります。F統計量は低下するため、帰無仮説を棄却することはできません。

右側の図は、平均値は同じだがばらつきがはるかに小さいサンプルを示している。これはF統計量を増加させ、対立仮説を支持する根拠となる。

ANOVAテストを解釈する

両方のメジャーを使用して F 統計を構築できます。 F 統計を理解するのは非常に直感的です。 分子が増加する場合、グループ間の変動が大きいことを意味し、サンプル内のグループが完全に異なる分布から抽出されている可能性があります。

つまり、F統計量が低いということは、グループ間の平均値に有意な差がほとんど、あるいは全くないことを示している。

一元配置分散分析テストの例

ポイズン データセットを使用して、一元配置分散分析テストを実装します。データセットには 48 行と 3 つの変数が含まれています。

  • 時間: 動物の生存時間
  • 毒: 使用される毒の種類: 因子レベル: 1,2、3、XNUMX
  • 治療: 使用される治療の種類: 因子レベル: 1,2、3、および XNUMX

ANOVA テストの計算を開始する前に、次のようにデータを準備する必要があります。

  • ステップ 1: データをインポートする
  • ステップ 2: 不要な変数を削除する
  • ステップ 3: 変数毒を順序付けされたレベルとして変換する
library(dplyr)
PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/poisons.csv"
df <- read.csv(PATH) %>%
select(-X) %>% 
mutate(poison = factor(poison, ordered = TRUE))
glimpse(df)

出力:

## Observations: 48
## Variables: 3
## $ time   <dbl> 0.31, 0.45, 0.46, 0.43, 0.36, 0.29, 0.40, 0.23, 0.22, 0...
## $ poison <ord> 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 1, 1, 1, 1, 2, 2, 2...
## $ treat  <fctr> A, A, A, A, A, A, A, A, A, A, A, A, B, B, B, B, B, B, ...		

私たちの目的は、次の仮定をテストすることです。

  • H0: グループ間で生存時間の平均に差はない
  • H1: 生存時間の平均は、少なくとも XNUMX つのグループで異なります。

つまり、モルモットに与えた毒の種類によって、生存時間の平均値に統計的な差があるかどうかを知りたいということですね。

次のように進めます。

  • ステップ 1: 変数 Poison の形式を確認する
  • ステップ 2: 要約統計量を出力します: カウント、平均、標準偏差
  • ステップ3: ボックスプロットをプロットする
  • ステップ4: 一元配置分散分析テストを計算する
  • ステップ5:Tukey HSD法を用いてペアワイズ比較を実行する

ステップ1) 以下のコードを使用して毒物のレベルを確認してください。mutate動詞によって列が順序付き因子に変換されているため、3文字の値が表示されるはずです。

levels(df$poison)

出力:

## [1] "1" "2" "3"

ステップ2) 平均と標準偏差を計算します。

df %>%
	group_by(poison) %>%
	summarise(
		count_poison = n(),
		mean_time = mean(time, na.rm = TRUE),
		sd_time = sd(time, na.rm = TRUE)
	)

出力:

## 
# A tibble: 3 x 4
##   poison count_poison mean_time    sd_time
##    <ord>        <int>     <dbl>      <dbl>
## 1      1           16  0.617500 0.20942779
## 2      2           16  0.544375 0.28936641
## 3      3           16  0.276250 0.06227627

ステップ3) ステップ XNUMX では、分布間に違いがあるかどうかをグラフィカルに確認できます。 ジッターのあるドットが含まれていることに注意してください。

ggplot(df, aes(x = poison, y = time, fill = poison)) +
    geom_boxplot() +
    geom_jitter(shape = 15,
        color = "steelblue",
        position = position_jitter(0.21)) +
    theme_classic()

出力:

一元配置分散分析検定の例

ステップ4) aov コマンドを使用して一元配置分散分析テストを実行できます。分散分析テストの基本的な構文は次のとおりです。

aov(formula, data)
Arguments:			
- formula: The equation you want to estimate
- data: The dataset used	

数式の構文は次のとおりです。

y ~ X1+ X2+...+Xn # X1 +  X2 +... refers to the independent variables
y ~ . # use all the remaining variables as independent variables

これで、投与された毒物の種類によってモルモットの生存時間に違いがあるかどうかという質問に答えることができます。

モデルをオブジェクトに格納し、それをsummary()に渡すと、結果が読みやすい形式で出力されます。

anova_one_way <- aov(time~poison, data = df)
summary(anova_one_way)

Code 説明

  • aov(time ~ poison, data = df): 次の式でANOVAテストを実行します。
  • summary(anova_one_way): テストの要約を出力します

出力:

##             Df Sum Sq Mean Sq F value   Pr(>F)
## poison       2  1.033  0.5165   11.79 7.66e-05 ***
## Residuals   45  1.972  0.0438                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

p値は7.66e-05で、通常の閾値である0.05をはるかに下回っており、3つの星印は最も強い有意性を示すコードです。したがって、帰無仮説H0を棄却し、少なくとも1つの毒物群の平均生存時間が異なると結論付けることができます。

RでANOVAの前提条件を確認する方法

ANOVAのp値は、前述の3つの条件が満たされている場合にのみ信頼できます。これらの条件はそれぞれRで直接検証でき、すべて適合モデルオブジェクト上で実行されます。

1. 観測値の独立性。 これはデータ自体ではなく、研究デザインの特性であるため、いかなる検定でも解決できません。各モルモットは一度測定され、ランダムにグループに割り当てられる必要があります。同じ被験者が複数の行に現れる場合は、反復測定モデルを使用する必要があります。

2. 残差の正規性。 ANOVAは、生データではなく残差がほぼ正規分布に従うことを前提としています。QQプロットを調べ、シャピロ・ウィルク検定で確認してください。

par(mfrow = c(2, 2))
plot(anova_one_way)          # four diagnostic plots

shapiro.test(residuals(anova_one_way))

正規QQプロットの対角線上に位置する点は、残差が正規分布していることを示します。シャピロ・ウィルク検定のp値が0.05を超える場合は、正規性を棄却できません。

3. 分散の均一性。 どのグループも同様のばらつきを示すはずです。残差対適合値のプロットは、漏斗状ではなく平坦な帯状になるはずです。バートレット検定よりも非正規性に対して頑健なレーベン検定で確認してください。

library(car)
leveneTest(time ~ poison, data = df)

bartlett.test(time ~ poison, data = df)

p値が0.05より大きい場合は、等分散性が支持される。

前提が間違っていた場合の対処法。 分散が等しくない場合は、oneway.test(time ~ poison, data = df, var.equal = FALSE) を実行してウェルチ補正を適用します。残差が明らかに正規分布に従わず、サンプルサイズが小さい場合は、クラスカル・ウォリス順位検定 (kruskal.test(time ~ poison, data = df)) に切り替えます。バランスの取れた大きなサンプルでは、​​ANOVA は正規分布からのわずかな逸脱に対してかなり頑健であるため、シャピロ・ウィルク検定の結果が境界線上にあっても致命的な問題になることはほとんどありません。

ペアワイズ比較

有意なF検定では、グループ平均がすべて等しいわけではないことはわかりますが、どのペアが異なるかはわかりません。Tukeyの正直有意差検定は、ファミリーワイズエラー率を制御しながらすべてのペアを比較することで、その問題を解決します。

TukeyHSD(anova_one_way)

出力:

ペアワイズ比較

出力はペアごとに1行ずつ読みます。 差分 この列には、2つのグループの平均の差が記録されています。 低い (NAIST) と 許可 その差の95%信頼区間を境界付け、 p 形容詞 は、多重比較のために調整されたp値です。ペア間の区間がゼロを含まない場合、つまりp adjが0.05未満の場合、ペア間に有意差があると判断されます。このデータセットでは、毒物3に関する比較が有意であり、これはボックスプロットと一致しています。グループ3の平均生存時間はグループ1および2よりも明らかに短く、グループ1と2は統計的に区別できません。

二元配置分散分析

二元配置分散分析では、式に2つ目の要因が追加されます。一元配置分散分析と全く同じように機能しますが、式が変わります。

y ~ x1 + x2

ここで、yは量的応答変数であり、x1とx2はどちらもカテゴリカル因子である。

二元配置分散分析における仮説

  • H0: 両方の因子変数についてグループ平均は等しい
  • H1: 少なくとも2つの要因のうち少なくとも1つについて、少なくとも1つのグループ平均が異なる。

モデルに「治療」変数を追加します。この変数は、モルモットに与えられた治療を記録します。以下の加法式は、他の要因を考慮した上で、各要因が生存時間に単独で影響を与えるかどうかを検証します。

最初の独立変数の横に「treat」を追加してコードを修正してください。

anova_two_way <- aov(time~poison + treat, data = df)
summary(anova_two_way)

出力:

##             Df Sum Sq Mean Sq F value  Pr(>F)    
## poison       2 1.0330  0.5165   20.64 5.7e-07 ***
## treat        3 0.9212  0.3071   12.27 6.7e-06 ***
## Residuals   42 1.0509  0.0250                    
## ---

どちらのp値(毒物の場合5.7e-07、治療の場合6.7e-06)も0.05を大きく下回っているため、両方の要因について帰無仮説H0を棄却し、毒物または治療のいずれかを変更すると生存時間に影響すると結論付けます。

交互作用項を追加する

上記の加法モデルは、毒物の効果が治療方法に関わらず同じであると仮定しています。この仮定を検証するには、プラス記号をアスタリスクに置き換えます。これにより、主効果とその交互作用の両方に適合します。

anova_interaction <- aov(time~poison * treat, data = df)
summary(anova_interaction)

毒物と治療薬の行が有意でない場合、自由度が少ないため、加法モデルの方がより良い選択肢となります。

RにおけるANOVA:クイックテストリファレンス

以下の表は、上記で使用した各検定、それを実行するRコマンド、およびそれが評価する仮説を示しています。

ホイール試乗 Code 仮説 P値
一元配置分散分析
aov(y ~ X, data = df)
H1: 平均は少なくとも XNUMX つのグループで異なります 0.05
ペアワイズ
TukeyHSD(ANOVA summary)
0.05
二元配置分散分析
aov(y ~ X1 + X2, data = df)
H1:少なくとも1つのグループの平均値は、いずれかの要因で異なる。 0.05

よくあるご質問

F値は、群間分散と群内分散の比率です。1に近い値は、群の平均値が類似していることを示唆します。値が大きい場合は、各群が異なる平均値を持つ母集団から抽出されたことを示します。

分散が等しくない場合は、`oneway.test()` を `var.equal = FALSE` で使用し、残差が明らかに正規分布に従わない場合は `kruskal.test()` を使用してください。歪んだ応答変数を `log()` で変換すると、正規性と等分散性の両方が回復することがよくあります。

各t検定にはそれぞれ5%の偽陽性リスクがあります。3つのペアワイズ検定を行うと、ファミリーワイズエラー率は約14%に上昇します。ANOVAは単一の全体検定を5%に抑え、Tukey HSD法はペアワイズ比較を調整します。

ANOVAは標準的な特徴選択フィルターであり、数値ターゲットをどれだけ強く分離できるかに基づいて、カテゴリカル予測変数をランク付けします。AIチームは、交差検証の各フォールド間でモデルのバリエーションを比較するためにもANOVAを使用します。

はい。AIアシスタントは、自由度を説明したり、p値を分かりやすい言葉に翻訳したり、診断プロットにおける前提条件違反を指摘したりできます。ただし、必ずご自身のleveneTest()およびshapiro.test()の結果と照らし合わせて確認してください。