Einfaktorielle Varianzanalyse (ANOVA) in R rechnen

von | Zuletzt bearbeitet am: Oct 19, 2022 | ANOVA, Mittelwertvergleich, R

1 Ziel der einfaktoriellen Varianzanalyse (ANOVA)

Die ANOVA (auch: einfaktorielle Varianzanalyse) testet drei oder mehr unabhängige Stichproben auf unterschiedliche Mittelwerte. Die Nullhypothese lautet, dass keine Mittelwertunterschiede (hinsichtlich der Testvariable) existieren. Demzufolge lautet die Alternativhypothese, dass zwischen den Gruppen Unterschiede existieren. Es ist das Ziel, die Nullhypothese zu verwerfen und die Alternativhypothese anzunehmen. Die Varianzanalyse in R kann man mit wenigen Zeilen Code durchgeführt werden. Es gibt auch Tutorials in SPSS und Excel.

 

2 Voraussetzungen der einfaktoriellen Varianzanalyse (ANOVA)

Die wichtigsten Voraussetzungen der ANOVA sind:

Bei Nichterfüllung sollte der Kruskal-Wallis-Test in R gerechnet werden.

 

3 Durchführung der einfaktoriellen Varianzanalyse in R (ANOVA)

3.1 Das Beispiel

Im Beispiel prüfe ich drei unabhängige Trainingsgruppen (wenig, durchschnittlich, stark) auf deren mittleren Ruhepuls. Ich vermute dahingehend Unterschiede, dass Probanden der verschiedenen Trainingsgruppen im Mittel unterschiedliche Ruhepulse haben. Das kann man auch gerichtet formulieren: Probanden aus den aktiveren Trainingsgruppen haben im Mittel einen niedrigeren Ruhepuls. Die ANOVA vermag aber nicht einseitig zu testen, da dies nur bei genau 2 Gruppen (z.B. t-Test) funktioniert.

 

3.2 Deskriptive Voranalyse

Nach dem Einlesen der Daten kann direkt ein deskriptiver Vergleich gestartet werden, der im Rahmen der ANOVA nicht zwingend notwendig ist, beim Schreiben der Ergebnisse hilft. Hierzu nutze ich das Paket “psych”, was ich mit “install.packages” installiere und mit library(psych) lade. Dann lasse ich mir die deskriptiven Statistiken ausgeben. Das Format ist describeBy(Testvariable, Gruppenvariable).

install.packages("psych")

library(psych)

describeBy(data_anova$Ruhepuls,data_anova$Trainingsgruppe)

Hier erhält man folgenden Output:


Descriptive statistics by group
group: 0
vars n mean  sd   median trimmed mad   min max range skew  kurtosis se
1   13 68    9.6  69     68.64   10.38 50  79  29    -0.42 -1.26    2.66
------------------------------------------------------------------------------
group: 1
vars n mean  sd   median trimmed mad   min max range skew  kurtosis se
1   13 61    9.82 58     60.64   10.38 48  78  30    0.51  -1.17    2.72
------------------------------------------------------------------------------
group: 2
vars n mean  sd   median trimmed mad   min max range skew  kurtosis se
1   13 52.85 9.74 52     52.36   13.34 40 71   31    0.28  -1.21    2.7

 

Hier ist schon erkennbar, dass sich die mit fett markierten Mittelwerte über die Gruppen hinweg unterschieden. Die am wenigsten trainierte Gruppe hat einen mittleren Ruhepuls von 68, die durchschnittlich trainierte Gruppe von 61 und die stark trainierte Gruppe von 52,85.

Die Varianzhomogenität kann man hier auch schon erkennen, da sd (=Standardabweichung = Wurzel der Varianz) in etwas gleich groß sind. Die Frage, die uns die ANOVA nun beantworten muss: Sind diese beobachteten Mittelwertunterschiede statistisch signifikant?

 

3.3 Die ANOVA rechnen und interpretieren

Hierzu wird die aov()-Funktion verwendet:


anova_training <- aov(data_anova$Ruhepuls~data_anova$Trainingsgruppe)
summary(anova_training)

Mit “anova_training <- aov(…)” definiere ich mir zunächst das ANOVA-Modell, welches ich mir mit summary(anova_training) ausgeben lasse. Der Name “anova_training” kann hierbei vollkommen frei gewählt werden.

Nun kann den Output interpretieren:


                            Df  Sum Sq  Mean Sq  F value  Pr(>F)
data_anova$Trainingsgruppe  1   1493    1493     16.22    0.000269 ***
Residuals                  37   3405      92
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Hier ist eigentlich nur ein Wert wirklich interessant: der p-Wert findet sich unter Pr(>F) und ist hier 0,000269. Das ist deutlich kleiner als 0,05 und somit kann die Nullhypothese von Gleichheit der Mittelwerte über die Gruppen hinweg verworfen werden. Das berichtet man mit F(1, 37) = 16,22; p < 0,001.

Die entscheidende Frage ist nun, zwischen welchen der drei Trainingsgruppen ein Unterschied existiert. Es ist denkbar, dass nur zwischen zwei Gruppen ein Unterschied existiert oder zwischen allen 3. Hierzu braucht es eine post-hoc-Analyse.  

 

3.4 Post-hoc-Analyse: paarweise Gruppenvergleiche

Diese führt man mittels paarweisen t-Tests (“pairwise.t.test()“) durch. Allerdings muss hierbei der p-Wert angepasst werden, da das mehrfache Testen auf dieselbe Stichprobe zu einem erhöhten Alphafehler führt. Dies hat wiederum zur Folge, dass die Wahrscheinlichkeit einen Fehler 1. Art zu begehen steigt. Ultimativ könnte das dazu führen, dass man die Nullhypothese fälschlicherweise ablehnt, also Unterschiede unterstellt, die nicht existieren.

Aber keine Angst, R hat eine eingebaute Funktion namens “p.adjust()“. Es gibt für p.adjust() verschiedene Argumente, zumeist wählt man die konservativste “bonferroni”. Wird kein Argument übergeben, wird nach der etwas weniger strengen Holm-Methode korrigiert. Weitere Informationen zur Adjustierung des p-Wertes gibt es hier. Der Code zum paarweisen Vergleich sowie dem Anpassen des p-Wertes ist folgender:


pairwise.t.test(data_anova$Ruhepuls,data_anova$Trainingsgruppe, p.adjust="bonferroni")

Als Ergebnis erhält man eine kleine Übersichtstabelle, die nur p-Werte enthält. Diese sind adjustiert nach Bonferroni, wie in der letzten Zeile zu erkennen ist.


Pairwise comparisons using t tests with pooled SD
data: data_anova$Ruhepuls and data_anova$Trainingsgruppe
  0       1
1 0.22391 -
2 0.00097 0.11798
P value adjustment method: bonferroni

In der obigen Tabelle kann man folgendes erkennen:

  • Der Unterschied zwischen der Gruppe 0 und der Gruppe 1 weist eine adjustierte Signifikanz von p = 0,22391 aus. Für diese beiden Gruppen kann die Nullhypothese keines Unterschiedes demzufolge nicht abgelehnt werden.
  • Für den Unterschied zwischen Gruppe 1 und Gruppe 2 ist die adjustierte Signifikanz p = 0,11798. Auch hier kann die Nullhypothese keines Unterschiedes nicht verworfen werden.
  • Für den Unterschied zwischen Gruppe 0 und Gruppe 2 ist allerdings eine adjustierte Signifikanz von p = 0,00097 zu erkennen. Die Nullhypothese keines Unterschiedes wird zugunsten der Alternativhypothese eines Unterschiedes verworfen. Der Unterschied ist statistisch signifikant.  

Im Ergebnis kann festgehalten werden, dass lediglich zwischen Gruppe 0 (wenig trainiert) und Gruppe 2 (stark trainiert) ein statistisch signifikanter Unterschied hinsichtlich des Ruhepulses existiert. Kontrolliert für die Mehrfachtestung unterscheiden nur sie sich statistisch signifikant voneinander.  

 

3.5 Effektstärke der ANOVA

Die Effektstärke f wird von R nicht mit ausgegeben. f gibt an, wie stark der gefundene statistisch signifikante Effekt der ANOVA ist. Wie wir aber bereits festgestellt haben, interessiert uns ohnehin eher das Ergebnis der post-hoc-Analyse. Dennoch kann man den f-Wert berechnen, der sich aus Eta² ergibt, wie folgende Formel zeigt:

    \[  f = \sqrt{\frac{\eta^2}{1-\eta^2}} \]

Hierzu braucht es noch ein zusätzliches Paket namens “DescTools“. Dies kann erneut über die install.packages()-Funktion installiert werden und mit der library()-Funktion geladen werden. Im Paket existiert die Funktion “EtaSq“, die aus dem oben definierten Modell Eta² ausliest. Dies sieht wie folgt aus:


install.packages("DescTools")
library(DescTools)
EtaSq(anova_training)

Hierfür erhalte ich nun zwei Werte. Einmal Eta² (eta.sq) und einmal das partielle Eta² (eta.sq.part). Das partielle Eta² ist nur im Falle einer ANCOVA interessant, da es Einflüsse weiterer Variablen auspartialisiert. Im Falle einer einfaktoriellen ANOVA sind die Werte stets identisch. Auch hier ist dies der Fall:


                           eta.sq     eta.sq.part
data_anova$Trainingsgruppe 0.3047955  0.3047955

Das Eta² hat hier einen Wert von 0,3047955 und muss nun die obige Formel eingesetzt werden. Das funktioniert mit einfacher Arithmetik in R.


sqrt(0.3047955/(1-0.3047955))
0.6621372

Der f-Wert für die ANOVA ist 0,6621372 

Cohen: Statistical Power Analysis for the Behavioral Sciences (1988), S. 284-287 hilft hier bei der Einordnung. Ab 0,1 ist es ein schwacher Effekt, ab 0,25 ein mittlerer und ab 0,4 ein starker Effekt.

Demzufolge ist der mit der ANOVA beobachtete Unterschied ein starker Unterschied, da 0,6621372 über der Grenze zum starken Effekt liegt.

Die Effektstärke der ANOVA wird selten berichtet, da die paarweisen Vergleiche/Unterschiede interessanter sind.

 

3.6 Effektstärke der paarweisen Vergleiche

Wie eben beschrieben ist die Effektstärke der einfaktoriellen ANOVA weniger interessant. Die paarweisen Vergleiche und deren Effektstärke sollten im Fokus stehen, um signifikante Unterschiede zwischen jene einordnen zu können.
Hierzu gibt es keine einfache Funktion in R. Vielmehr wird mit dem Konzept des Piping gearbeitet, welches mit dem dplyr-Paket zur Anwendung kommt. Gleichzeitig braucht es das rstatix-Paket zur Verwendung der cohens_d()-Funktion:

library(dplyr)
library(rstatix)
data_anova %>%
cohens_d(Ruhepuls~Trainingsgruppe) %>% 
as.data.frame()
Dies führt im Ergebnis zu folgendem Output:

       .y.  group1 group2     effsize n1 n2 magnitude
1 Ruhepuls       2      1  -0.8337029 13 13     large
2 Ruhepuls       2      0  -1.5672809 13 13     large
3 Ruhepuls       1      0  -0.7207181 13 13  moderate
Hier sehen wir die Effektstärken in der Spalte “effsize” für alle drei paarweisen Vergleiche. Da wir nur für den Vergleich zwischen Gruppe 2 und 0 (Gut trainiert vs. untrainiert) eine Signifikanz in den post-hoc-Tests haben, sollte auch nur hier die Effektstärke abgelesen werden. Sie beträgt d = -1.567. Die anderen beiden Effektstärken sollten aufgrund der Nichtsignifikanz des Unterschiedes nicht interpretiert werden – es gibt Fachdisziplinen die hier aber dennoch ein Reporting wünschen.

 

Die große Effektstärke für den Gruppenvergleich 2-1 und die mittlere Effektstärke für den Gruppenvergleich 1-0 können hier fehlleitend sein. Zwar ist der Unterschied verhältnismäßig groß, allerdings sind zu wenige Beobachtungen, als das diese Unterschiede eine signifikante Größe übersteigen. Dies liegt an der zu niedrigen Power bei lediglich 2×13=26 Beobachtungen. Dies ist auch der Grund für eine notwendige a priori-Poweranalyse.

 

ACHTUNG: Cohen’s d sollte betragsmäßig, also stets als positiver Wert berichtet werden.
In der Spalte “magnitude” wird die Größe des Effektes eingeordnet. d = -1.567 wird als großer Effekt eingeordnet.

 

Dies erfolgt auf Basis von Cohen (1992): A Power Primer, S. 157:
  • Ab 0,2 ist es ein schwacher Effekt,
  • ab 0,5 ein mittlerer und
  • ab 0,8 ein starker Effekt.

 

4 Videotutorial

Hat dir der Beitrag geholfen?

Dann würde ich mich über eine kleine Spende freuen, die es mir erlaubt, weiterhin kostenfreie Inhalte zu veröffentlichen.
Alternativ kannst du über meinen Amazon Affiliate-Link einkaufen – ohne Zusatzkosten.

Vielen Dank und viel Erfolg!

Über mich

Björn Walther

Excel- und SPSS-Experte

YouTube-Kanal

Excel Online-Kurs

YouTube-Kanal