R ANOVA チュートリアル: 一元配置と二元配置 (例付き)

ANOVAとは?

分散分析 (ANOVA) は、2 つ以上のグループの平均の差を調べるためによく使用される統計手法です。ANOVA テストは、典型的な変数のさまざまな変動源に焦点を当てています。R の ANOVA は、主にグループ間の平均の等価性の存在の証拠を提供します。この統計手法は、t 検定の拡張です。因子変数に複数のグループがある場合に使用されます。

一元配置分散分析

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

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

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

データが同じ母集団からのものであるかどうかを明確にするには、次の操作を実行できます。 一元配置分散分析 (以下、一元配置分散分析)。この検定は、他の統計検定と同様に、H0 仮説が受け入れられるか拒否されるかの証拠を示します。

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

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

言い換えれば、H0 仮説は、グループ (因子) の平均が他のものと異なることを証明する十分な証拠がないことを意味します。

この検定は t 検定に似ていますが、2 つ以上のグループがある場合は ANOVA 検定が推奨されます。それ以外は、t 検定と ANOVA は同様の結果をもたらします。

仮定

各因子はランダムにサンプリングされ、独立しており、未知だが分散が等しい正規分布母集団に由来すると仮定します。

ANOVAテストを解釈する

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

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

この グループ間 変動性は、すべての母集団内のグループ間の差異を反映します。 グループ間分散の概念を理解するには、以下の XNUMX つのグラフを見てください。

左側のグラフは XNUMX つのグループ間の差異がほとんどないことを示しており、XNUMX つの平均値は次の傾向にある可能性が非常に高いです。 全体 平均値(つまり、XNUMX つのグループの平均値)。

右のグラフは XNUMX つの分布を遠く離れてプロットしており、どれも重なりません。 合計平均とグループ平均の差が大きくなる可能性が高くなります。

ANOVAテストを解釈する

この グループ内で 変動性はグループ間の差異を考慮します。 変動は個々の観察から生じます。 いくつかの点はグループの平均値とまったく異なる場合があります。 の グループ内で 変動性はこの効果をピックアップし、サンプリング誤差を参照します。

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

左側の部分は、XNUMX つの異なるグループの分布をプロットしています。 各サンプルの広がりを大きくしましたが、個々の分散が大きいことが明らかです。 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: グループ間で生存時間の平均に差はない
  • H3: 生存時間の平均は、少なくとも XNUMX つのグループで異なります。

言い換えれば、モルモットに与えられた毒の種類に応じた生存時間の平均値の間に統計的な違いがあるかどうかを知りたいのです。

次のように進めます。

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

ステップ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)

コードの説明

  • 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 値は、通常のしきい値 0.05 よりも低くなります。 「*」で示されるように、グループ間には統計的な差異があると自信を持って言えます。

ペアワイズ比較

一元配置分散分析テストでは、どのグループに異なる平均値があるかはわかりません。代わりに、関数 TukeyHSD() を使用して Tukey テストを実行できます。

TukeyHSD(anova_one_way)

出力:

ペアワイズ比較

二元配置分散分析

2 元配置分散分析テストでは、式に別のグループ変数が追加されます。式が若干異なりますが、1 元配置分散分析テストと同じです。

y=x1+x2

with は量的変数、and はカテゴリ変数です。

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

  • H0: 両方の変数 (つまり因子変数) の平均が等しい
  • H3: 両方の変数の平均値が異なります

モデルに治療変数を追加します。 この変数は、モルモットに与えられた治療を示します。 あなたは、モルモットに与えられた毒と治療の間に統計的な依存性があるかどうかを知りたいと考えています。

他の独立変数を使用した処理を追加してコードを調整します。

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                    
## ---

毒と治療の両方が統計的に 0 とは異なると結論付けることができます。帰無仮説を棄却して、治療または毒の変更が生存時間に影響を与えることを確認できます。

まとめ

テストを以下の表にまとめます。

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