So führen Sie eine zweifaktorielle ANOVA in R durch

Von Fabian
Kategorie: R
Tags: ANOVA
Lesezeit: 12 Minuten

Eine zweifaktorielle ANOVA („Varianzanalyse“) wird verwendet, um zu bestimmen, ob es einen statistisch signifikanten Unterschied zwischen den Mittelwerten von drei oder mehr unabhängigen Gruppen gibt, die auf zwei Faktoren aufgeteilt wurden.

In diesem Tutorial wird erklärt, wie eine zweifaktorielle ANOVA in R durchgeführt wird.

Beispiel: zweifaktorielle ANOVA in R

Angenommen, wir möchten feststellen, ob die Trainingsintensität und das Geschlecht den Gewichtsverlust beeinflussen. In diesem Fall sind die beiden Faktoren, die wir untersuchen, Bewegung und Geschlecht, und die Antwortvariable ist Gewichtsverlust, gemessen in Pfund.

Wir können eine zweifaktorielle ANOVA durchführen, um festzustellen, ob Bewegung und Geschlecht den Gewichtsverlust beeinflussen und ob es eine Wechselwirkung zwischen Bewegung und Geschlecht beim Gewichtsverlust gibt.

Wir rekrutieren 30 Männer und 30 Frauen, um an einem Experiment teilzunehmen, bei dem wir jeweils 10 zufällig zuweisen, um einen Monat lang einem Programm ohne Übung, leichte Übung oder intensive Übung zu folgen.

Der folgende Code erstellt das Dataframe, mit dem wir arbeiten werden:

#Machen Sie dieses Beispiel reproduzierbar
set.seed (10)

#Dataframe erstellen
data <- data.frame(gender = rep(c("Male", "Female"), each = 30),
                   exercise = rep(c("None", "Light", "Intense"), each = 10, times = 2),
                   weight_loss = c(runif(10, -3, 3), runif(10, 0, 5), runif(10, 5, 9),
                                   runif(10, -4, 2), runif(10, 0, 3), runif(10, 3, 8)))

#Die ersten sechs Zeilen des Dataframes anzeigen
head(data)

#  gender exercise weight_loss
#1   Male     None  0.04486922
#2   Male     None -1.15938896
#3   Male     None -0.43855400
#4   Male     None  1.15861249
#5   Male     None -2.48918419
#6   Male     None -1.64738030

# Sehen Sie, wie viele Teilnehmer in jeder Gruppe sind
table(data$gender, data$exercise)

#         Intense Light None
#  Female      10    10   10
#  Male        10    10   10

Erkunden der Daten

Bevor wir überhaupt das zweifaktorielle ANOVA-Modell anpassen, können wir die Daten besser verstehen, indem wir den Mittelwert und die Standardabweichung des Gewichtsverlusts für jede der sechs Behandlungsgruppen mithilfe des dplyr Pakets ermitteln:

#dplyr laden
library(dplyr)
# Mittelwert und Standardabweichung des Gewichtsverlusts für jede Behandlungsgruppe ermitteln
data %>%
  group_by(gender, exercise) %>%
  summarise(mean = mean(weight_loss),
                   sd = sd(weight_loss))

# A tibble: 6 x 4
# Groups:   gender [2]
#  gender exercise   mean    sd
#          
#1 Female Intense   5.31  1.02 
#2 Female Light     0.920 0.835
#3 Female None     -0.501 1.77 
#4 Male   Intense   7.37  0.928
#5 Male   Light     2.13  1.22 
#6 Male   None     -0.698 1.12 

Wir können auch ein Boxplot für jede der sechs Behandlungsgruppen erstellen, um die Verteilung des Gewichtsverlusts für jede Gruppe zu visualisieren:

#Setzen Sie die Ränder so, dass die Achsenbeschriftungen im Boxplot nicht abgeschnitten werden
par(mar=c(8, 4.1, 4.1, 2.1))
# Boxplots erstellen
boxplot(weight_loss ~ gender:exercise,
  data = data,
  main = "Weight Loss Distribution by Group",
  xlab = "Group",
  ylab = "Weight Loss",
  col = "steelblue",
  border = "black", 
  las = 2 #X-Achsenbeschriftungen senkrecht drehen
)

Boxplots in R für Zweifaktorielle ANOVA

Auf Anhieb können wir sehen, dass die beiden Gruppen, die an intensiven Übungen teilgenommen haben, offenbar größere Gewichtsverlustwerte aufweisen. Wir können auch sehen, dass Männer im Vergleich zu Frauen tendenziell höhere Gewichtsverlustwerte für die intensiven und leichten Übungsgruppen haben.

Als Nächstes passen wir das zweifaktorielle ANOVA-Modell an unsere Daten an, um festzustellen, ob diese visuellen Unterschiede tatsächlich statistisch signifikant sind.

Anpassung des zweifaktoriellen ANOVA-Modells

Die allgemeine Syntax für ein zweifaktorielles ANOVA-Modell in R lautet wie folgt:

aov(response variable ~ predictor_variable1 * predictor_variable2, data = dataset)

Beachten Sie, dass das * zwischen den beiden Prädiktorvariablen angibt, dass wir auch einen Interaktionseffekt zwischen den beiden Prädiktorvariablen testen möchten.

In unserem Beispiel können wir den folgenden Code verwenden, um das zweifaktorielle ANOVA-Modell anzupassen, wobei weight_loss als Antwortvariable und gender und exercise als unsere beiden Prädiktorvariablen verwendet werden. Wir können dann die Funktion summary() verwenden, um die Ausgabe unseres Modells anzuzeigen:

#Passen Sie das zweifaktorielle ANOVA-Modell an
model <- aov(weight_loss ~ gender * exercise, data = data)
# Sehen Sie sich die Modellausgabe an
summary(model)

#                Df Sum Sq Mean Sq F value Pr(>F)    
#gender           1   15.8   15.80  11.197 0.0015 ** 
#exercise         2  505.6  252.78 179.087 <2e-16 ***
#gender:exercise  2   13.0    6.51   4.615 0.0141 *  
#Residuals       54   76.2    1.41                   
#---
#Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Aus der Modellausgabe können wir ersehen, dass gender, exercise und die Interaktion zwischen den beiden Variablen auf dem .05-Signifikanzniveau statistisch signifikant sind.

Überprüfen der Modellannahmen

Bevor wir weiter gehen, sollten wir überprüfen, ob die Annahmen unseres Modells erfüllt sind, damit unsere Ergebnisse aus dem Modell zuverlässig sind. Insbesondere geht eine zweifaktorielle ANOVA davon aus:

1. Unabhängigkeit – Die Beobachtungen in jeder Gruppe müssen unabhängig voneinander sein. Da wir ein randomisiertes Design verwendet haben, sollte diese Annahme erfüllt sein, damit wir uns darüber keine Sorgen machen müssen.

2. Normalverteilung – Die abhängige Variable sollte für jede Kombination der Gruppen der beiden Faktoren ungefähr normal verteilt sein.

Eine Möglichkeit, diese Annahme zu überprüfen, besteht darin, ein Histogramm der Modellresiduen zu erstellen. Wenn die Residuen grob normalverteilt sind, sollte diese Annahme erfüllt sein.

#Modellresiduen definieren
resid <- model$residuals
# Histogramm der Residuen erstellen
hist(resid, main = "Histogram of Residuals", xlab = "Residuals", col = "steelblue")

Histogramm der Residuen für die zweifaktorielle ANOVA

Die Residuen sind ungefähr normal verteilt, sodass wir davon ausgehen können, dass die Annahme einer Normalverteilung erfüllt ist.

3. Gleiche Varianz – Die Varianzen für jede Gruppe sind gleich oder ungefähr gleich.

Eine Möglichkeit, diese Annahme zu überprüfen, besteht darin, einen Levene-Test auf Varianzgleichheit mit dem car Package durchzuführen:

#car laden
library(car)
#Durchführen des Levene-Tests auf Gleichheit der Varianzen
leveneTest(weight_loss ~ gender * exercise, data = data)

#Levene's Test for Homogeneity of Variance (center = median)
#      Df F value Pr(>F)
#group  5  1.8547 0.1177
#      54  

Da der p-Wert des Tests größer als unser Signifikanzniveau von 0,05 ist, können wir davon ausgehen, dass unsere Annahme der Varianzgleichheit zwischen Gruppen erfüllt ist.

Analyse der Behandlungsunterschiede

Sobald wir überprüft haben, dass die Modellannahmen erfüllt sind, können wir einen Post-hoc-Test durchführen, um genau zu bestimmen, welche Behandlungsgruppen sich voneinander unterscheiden.

Für unseren Post-Hoc-Test verwenden wir die Funktion TukeyHSD(), um den Tukey-Test für mehrere Vergleiche durchzuführen:

#Tukey's Test für mehrere Vergleiche durchführen
TukeyHSD(model, conf.level=.95) 

#  Tukey multiple comparisons of means
#    95% family-wise confidence level
#
#Fit: aov(formula = weight_loss ~ gender * exercise, data = data)
#
#$gender
#                diff       lwr      upr     p adj
#Male-Female 1.026456 0.4114451 1.641467 0.0014967
#
#$exercise
#                   diff       lwr       upr   p adj
#Light-Intense -4.813064 -5.718493 -3.907635 0.0e+00
#None-Intense  -6.938966 -7.844395 -6.033537 0.0e+00
#None-Light    -2.125902 -3.031331 -1.220473 1.8e-06
#
#

Eine zweifaktorielle ANOVA („Varianzanalyse“) wird verwendet, um zu bestimmen, ob es einen statistisch signifikanten Unterschied zwischen den Mittelwerten von drei oder mehr unabhängigen Gruppen gibt, die auf zwei Faktoren aufgeteilt wurden.

In diesem Tutorial wird erklärt, wie eine zweifaktorielle ANOVA in R durchgeführt wird.

Beispiel: zweifaktorielle ANOVA in R

Angenommen, wir möchten feststellen, ob die Trainingsintensität und das Geschlecht den Gewichtsverlust beeinflussen. In diesem Fall sind die beiden Faktoren, die wir untersuchen, Bewegung und Geschlecht, und die Antwortvariable ist Gewichtsverlust, gemessen in Pfund.

Wir können eine zweifaktorielle ANOVA durchführen, um festzustellen, ob Bewegung und Geschlecht den Gewichtsverlust beeinflussen und ob es eine Wechselwirkung zwischen Bewegung und Geschlecht beim Gewichtsverlust gibt.

Wir rekrutieren 30 Männer und 30 Frauen, um an einem Experiment teilzunehmen, bei dem wir jeweils 10 zufällig zuweisen, um einen Monat lang einem Programm ohne Übung, leichte Übung oder intensive Übung zu folgen.

Der folgende Code erstellt das Dataframe, mit dem wir arbeiten werden:

#Machen Sie dieses Beispiel reproduzierbar
set.seed (10)

#Dataframe erstellen
data <- data.frame(gender = rep(c("Male", "Female"), each = 30),
                   exercise = rep(c("None", "Light", "Intense"), each = 10, times = 2),
                   weight_loss = c(runif(10, -3, 3), runif(10, 0, 5), runif(10, 5, 9),
                                   runif(10, -4, 2), runif(10, 0, 3), runif(10, 3, 8)))

#Die ersten sechs Zeilen des Dataframes anzeigen
head(data)

#  gender exercise weight_loss
#1   Male     None  0.04486922
#2   Male     None -1.15938896
#3   Male     None -0.43855400
#4   Male     None  1.15861249
#5   Male     None -2.48918419
#6   Male     None -1.64738030

# Sehen Sie, wie viele Teilnehmer in jeder Gruppe sind
table(data$gender, data$exercise)

#         Intense Light None
#  Female      10    10   10
#  Male        10    10   10

Erkunden der Daten

Bevor wir überhaupt das zweifaktorielle ANOVA-Modell anpassen, können wir die Daten besser verstehen, indem wir den Mittelwert und die Standardabweichung des Gewichtsverlusts für jede der sechs Behandlungsgruppen mithilfe des dplyr Pakets ermitteln:

#dplyr laden
library(dplyr)
# Mittelwert und Standardabweichung des Gewichtsverlusts für jede Behandlungsgruppe ermitteln
data %>%
  group_by(gender, exercise) %>%
  summarise(mean = mean(weight_loss),
                   sd = sd(weight_loss))

# A tibble: 6 x 4
# Groups:   gender [2]
#  gender exercise   mean    sd
#          
#1 Female Intense   5.31  1.02 
#2 Female Light     0.920 0.835
#3 Female None     -0.501 1.77 
#4 Male   Intense   7.37  0.928
#5 Male   Light     2.13  1.22 
#6 Male   None     -0.698 1.12 

Wir können auch ein Boxplot für jede der sechs Behandlungsgruppen erstellen, um die Verteilung des Gewichtsverlusts für jede Gruppe zu visualisieren:

#Setzen Sie die Ränder so, dass die Achsenbeschriftungen im Boxplot nicht abgeschnitten werden
par(mar=c(8, 4.1, 4.1, 2.1))
# Boxplots erstellen
boxplot(weight_loss ~ gender:exercise,
  data = data,
  main = "Weight Loss Distribution by Group",
  xlab = "Group",
  ylab = "Weight Loss",
  col = "steelblue",
  border = "black", 
  las = 2 #make x-axis labels perpendicular
)

Boxplots in R für zweifaktorielle ANOVA

Auf Anhieb können wir sehen, dass die beiden Gruppen, die an intensiven Übungen teilgenommen haben, offenbar größere Gewichtsverlustwerte aufweisen. Wir können auch sehen, dass Männer im Vergleich zu Frauen tendenziell höhere Gewichtsverlustwerte für die intensiven und leichten Übungsgruppen haben.

Als Nächstes passen wir das zweifaktorielle ANOVA-Modell an unsere Daten an, um festzustellen, ob diese visuellen Unterschiede tatsächlich statistisch signifikant sind.

Anpassung des zweifaktoriellen ANOVA-Modells

Die allgemeine Syntax für ein zweifaktorielles ANOVA-Modell in R lautet wie folgt:

aov(response variable ~ predictor_variable1 * predictor_variable2, data = dataset)

Beachten Sie, dass das * zwischen den beiden Prädiktorvariablen angibt, dass wir auch einen Interaktionseffekt zwischen den beiden Prädiktorvariablen testen möchten.

In unserem Beispiel können wir den folgenden Code verwenden, um das zweifaktorielle ANOVA-Modell anzupassen, wobei weight_loss als Antwortvariable und gender und exercise als unsere beiden Prädiktorvariablen verwendet werden. Wir können dann die Funktion summary() verwenden, um die Ausgabe unseres Modells anzuzeigen:

#Passen Sie das zweifaktorielle ANOVA-Modell an
model <- aov(weight_loss ~ gender * exercise, data = data)
# Sehen Sie sich die Modellausgabe an
summary(model)

#                Df Sum Sq Mean Sq F value Pr(>F)    
#gender           1   15.8   15.80  11.197 0.0015 ** 
#exercise         2  505.6  252.78 179.087 <2e-16 ***
#gender:exercise  2   13.0    6.51   4.615 0.0141 *  
#Residuals       54   76.2    1.41                   
#---
#Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Aus der Modellausgabe können wir ersehen, dass gender, exercise und die Interaktion zwischen den beiden Variablen auf dem .05-Signifikanzniveau statistisch signifikant sind.

Überprüfen der Modellannahmen

Bevor wir weiter gehen, sollten wir überprüfen, ob die Annahmen unseres Modells erfüllt sind, damit unsere Ergebnisse aus dem Modell zuverlässig sind. Insbesondere geht eine zweifaktorielle ANOVA davon aus:

1. Unabhängigkeit – Die Beobachtungen in jeder Gruppe müssen unabhängig voneinander sein. Da wir ein randomisiertes Design verwendet haben, sollte diese Annahme erfüllt sein, damit wir uns darüber keine Sorgen machen müssen.

2. Normalverteilung – Die abhängige Variable sollte für jede Kombination der Gruppen der beiden Faktoren ungefähr normal verteilt sein.

Eine Möglichkeit, diese Annahme zu überprüfen, besteht darin, ein Histogramm der Modellresiduen zu erstellen. Wenn die Residuen grob normalverteilt sind, sollte diese Annahme erfüllt sein.

#Modellresiduen definieren
resid <- model$residuals
# Histogramm der Residuen erstellen
hist(resid, main = "Histogram of Residuals", xlab = "Residuals", col = "steelblue")

Histogramm der Residuen für die zweifaktorielle ANOVA

Die Residuen sind ungefähr normal verteilt, sodass wir davon ausgehen können, dass die Annahme einer Normalverteilung erfüllt ist.

3. Gleiche Varianz – Die Varianzen für jede Gruppe sind gleich oder ungefähr gleich.

Eine Möglichkeit, diese Annahme zu überprüfen, besteht darin, einen Levene-Test auf Varianzgleichheit mit dem car Package durchzuführen:

#car laden
library(car)
#Durchführen des Levene-Tests auf Gleichheit der Varianzen
leveneTest(weight_loss ~ gender * exercise, data = data)

#Levene's Test for Homogeneity of Variance (center = median)
#      Df F value Pr(>F)
#group  5  1.8547 0.1177
#      54  

Da der p-Wert des Tests größer als unser Signifikanzniveau von 0,05 ist, können wir davon ausgehen, dass unsere Annahme der Varianzgleichheit zwischen Gruppen erfüllt ist.

Analyse der Behandlungsunterschiede

Sobald wir überprüft haben, dass die Modellannahmen erfüllt sind, können wir einen Post-hoc-Test durchführen, um genau zu bestimmen, welche Behandlungsgruppen sich voneinander unterscheiden.

Für unseren Post-Hoc-Test verwenden wir die Funktion TukeyHSD(), um den Tukey-Test für mehrere Vergleiche durchzuführen:

#Tukey's Test für mehrere Vergleiche durchführen
TukeyHSD(model, conf.level=.95) 

# diff lwr upr p adj 
#Male:Intense-Female:Intense 2.0628297 0.4930588 3.63260067 0.0036746 
#Female:Light-Female:Intense -4.3883563 -5.9581272 -2.81858535 0.0000000 
#Male:Light-Female:Intense -3.1749419 -4.7447128 -1.60517092 0.0000027 
#Female:None-Female:Intense -5.8091131 -7.3788841 -4.23934219 0.0000000 
#Male:None-Female:Intense -6.0059891 -7.5757600 -4.43621813 0.0000000 
#Female:Light-Male:Intense -6.4511860 -8.0209570 -4.88141508 0.0000000 
#Male:Light-Male:Intense -5.2377716 -6.8075425 -3.66800066 0.0000000 
#Female:None-Male:Intense -7.8719429 -9.4417138 -6.30217192 0.0000000 
#Male:None-Male:Intense -8.0688188 -9.6385897 -6.49904786 0.0000000 
#Male:Light-Female:Light 1.2134144 -0.3563565 2.78318536 0.2185439 
#Female:None-Female:Light -1.4207568 -2.9905278 0.14901410 0.0974193 
#Male:None-Female:Light -1.6176328 -3.1874037 -0.04786184 0.0398106 
#Female:None-Male:Light -2.6341713 -4.2039422 -1.06440032 0.0001050 
#Male:None-Male:Light -2.8310472 -4.4008181 -1.26127627 0.0000284 
#Male:None-Female:None -0.1968759 -1.7666469 1.37289500 0.9990364

Der p-Wert gibt an, ob zwischen jeder Gruppe ein statistisch signifikanter Unterschied besteht oder nicht. Zum Beispiel sehen wir in der letzten Zeile oben, dass die männliche Gruppe ohne Training keinen statistisch signifikanten Unterschied im Gewichtsverlust im Vergleich zur weiblichen Gruppe ohne Training aufwies (p-Wert: 0,990364).

Wir können auch die 95%-Konfidenzintervalle visualisieren, die sich aus dem Tukey-Test ergeben, indem wir die Funktion plot() in R verwenden:

#Setzen Sie die Achsenränder so, dass Beschriftungen nicht abgeschnitten werden
par(mar=c(4.1, 13, 4.1, 2.1))
#Konfidenzintervall für jeden Vergleich erstellen
plot(TukeyHSD(model, conf.level=.95), las = 2)

Mehrere Vergleichskonfidenzintervalle in R

Berichterstattung über die Ergebnisse der zweifaktorielle ANOVA

Zuletzt können wir die Ergebnisse der zweifaktorielle ANOVA so berichten, dass die Ergebnisse zusammengefasst werden:

Eine zweifaktorielle ANOVA wurde durchgeführt, um die Auswirkungen des Geschlechts ( männlich, weiblich) und des Trainingsplans (keine, leicht, intensiv) auf den Gewichtsverlust (Maß in Pfund) zu untersuchen. Es gab eine statistisch signifikante Wechselwirkung zwischen den Auswirkungen von Geschlecht und Bewegung auf den Gewichtsverlust (F (2, 54) = 4,615, p = 0,0141). Tukeys HSD-Post-Hoc-Tests wurden durchgeführt.

Bei Männern führte ein intensives Trainingsprogramm zu einem signifikant höheren Gewichtsverlust im Vergleich zu einem leichten Trainingsprogramm (p <0,0001) und keinem Trainingsprogramm (p <0,0001). Zusätzlich führte ein leichtes Regime bei Männern zu einem signifikant höheren Gewichtsverlust im Vergleich zu keinem Trainingsprogramm (p <0,0001).

Bei Frauen führte ein intensives Trainingsprogramm zu einem signifikant höheren Gewichtsverlust im Vergleich zu einem leichten Trainingsprogramm (p <0,0001) und keinem Trainingsprogramm (p <0,0001).

Prüfungen auf Normalverteilung und Levene-Tests wurden durchgeführt, um zu überprüfen, ob die ANOVA-Annahmen erfüllt waren.

Statistik: Der Weg zur Datenanalyse

* Amazon Affiliate Link


Das könnte Sie auch interessieren: