Wie führt man eine ANOVA in R durch?
In diesem Beitrag
- Was ist eine ANOVA und wann setzt man sie ein?
- Voraussetzungen der ANOVA
- Einfaktorielle ANOVA mit aov()
- Den ANOVA-Output interpretieren
- Post-hoc-Tests: Welche Gruppen unterscheiden sich?
- Zweifaktorielle ANOVA und Interaktionseffekte
- Type-II- und Type-III-ANOVA mit car::Anova()
- Effektstärke berechnen: Eta-Quadrat
- Voraussetzungen in R überprüfen
- Häufige Fehler und praktische Hinweise
Was ist eine ANOVA und wann setzt man sie ein?
Eine ANOVA (Analysis of Variance) prüft, ob sich die Mittelwerte von drei oder mehr Gruppen statistisch bedeutsam unterscheiden. Sie ist damit die logische Erweiterung des t-Tests, der nur zwei Gruppen vergleichen kann. Statt mehrere paarweise t-Tests durchzuführen – was die Fehlerrate künstlich aufbläht – fasst die ANOVA alle Gruppenvergleiche in einem einzigen Test zusammen.
Typische Anwendungsfälle in Abschlussarbeiten sind zum Beispiel:
- Vergleich von Testergebnissen dreier Lerngruppen (Kontrollgruppe, Methode A, Methode B)
- Unterschiede im Stressniveau zwischen verschiedenen Berufsgruppen
- Wirksamkeitsvergleich mehrerer Therapieformen in der klinischen Forschung
Grundlage des Verfahrens ist die Zerlegung der Gesamtvarianz in erklärte Varianz (zwischen den Gruppen) und unerklärte Varianz (innerhalb der Gruppen). Das Verhältnis dieser beiden Komponenten ergibt die F-Statistik.
F-Statistik der ANOVA
Dabei steht k für die Anzahl der Gruppen und N für die Gesamtstichprobengröße. Ein großes F signalisiert, dass die Gruppenunterschiede die zufällige Streuung innerhalb der Gruppen deutlich übersteigen.
Voraussetzungen der ANOVA
Bevor Sie die Analyse durchführen, sollten Sie die Voraussetzungen des Verfahrens kennen. Die ANOVA ist robust gegenüber leichten Verletzungen, aber bei starken Abweichungen sind die Ergebnisse nicht zuverlässig.
| Voraussetzung | Prüfung in R | Alternative bei Verletzung |
|---|---|---|
| Normalverteilung der Residuen | shapiro.test(), QQ-Plot |
Kruskal-Wallis-Test |
| Varianzhomogenität (Homoskedastizität) | leveneTest() aus dem car-Paket |
Welch-ANOVA (oneway.test()) |
| Unabhängigkeit der Beobachtungen | Studiendesign prüfen | Messwiederholungs-ANOVA |
| Metrisch skalierte AV | Datenstruktur prüfen | Ordinale Alternativen |
Einfaktorielle ANOVA mit aov()
In Base R ist aov() die Standardfunktion für die Varianzanalyse. Die Funktion passt intern ein lineares Modell über lm() an und gibt das Ergebnis in einer für die ANOVA geeigneten Struktur zurück. Das macht sie besonders einsteigerfreundlich, ohne dabei methodische Tiefe zu verlieren.
Die grundlegende Syntax folgt dem R-Formelschema: aov(AV ~ UV, data = datensatz). Hier ein vollständiges, lauffähiges Beispiel:
# Beispieldaten erstellen
set.seed(42)
lerngruppe <- factor(rep(c("Kontrolle", "Methode_A", "Methode_B"), each = 30))
testergebnis <- c(
rnorm(30, mean = 65, sd = 10), # Kontrollgruppe
rnorm(30, mean = 72, sd = 10), # Methode A
rnorm(30, mean = 78, sd = 10) # Methode B
)
daten <- data.frame(lerngruppe, testergebnis)
# Einfaktorielle ANOVA
modell_anova <- aov(testergebnis ~ lerngruppe, data = daten)
# Ergebnisse ausgeben
summary(modell_anova)
Beachten Sie, dass die Gruppenvariable als factor vorliegen muss. Liegt sie als numerische Variable oder als Zeichenkette vor, wandeln Sie sie vorher mit as.factor() um. Das ist einer der häufigsten Stolpersteine beim ersten Kontakt mit der ANOVA in R.
data gibt den Datenrahmen an, in dem R nach den Variablen sucht. Wenn Sie es weglassen, sucht R die Variablen im globalen Environment – das funktioniert zwar oft, ist aber fehleranfälliger und schwerer nachzuvollziehen.Den ANOVA-Output interpretieren
Der summary()-Output einer ANOVA liefert eine kompakte Tabelle. Ein typisches Ergebnis sieht so aus:
Df Sum Sq Mean Sq F value Pr(>F)
lerngruppe 2 2847 1423.7 14.23 2.14e-06 ***
Residuals 87 8699 100.0
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Die wichtigsten Spalten im Überblick:
- Df: Freiheitsgrade – für den Faktor k − 1, für die Residuen N − k
- Sum Sq: Quadratsummen – Maß für die erklärte bzw. unerklärte Varianz
- Mean Sq: Mittlere Quadratsumme (Sum Sq ÷ Df)
- F value: Die Teststatistik – das Verhältnis der beiden Mean Squares
- Pr(>F): Der p-Wert – zeigt, ob das Ergebnis statistisch signifikant ist
Im Beispiel ist F(2, 87) = 14,23, p < .001. Das bedeutet: Es gibt einen statistisch signifikanten Unterschied zwischen den drei Lerngruppen. Die ANOVA sagt Ihnen aber noch nicht, welche Gruppen sich konkret unterscheiden – dafür brauchen Sie einen Post-hoc-Test.
Post-hoc-Tests: Welche Gruppen unterscheiden sich?
Nach einem signifikanten ANOVA-Ergebnis schließt sich in der Regel ein Post-hoc-Test an. Der in der Praxis am häufigsten eingesetzte Test ist der Tukey HSD (Honestly Significant Difference), der alle paarweisen Gruppenvergleiche unter Kontrolle der multiplen Fehlerrate berechnet.
# Tukey HSD Post-hoc-Test
tukey_ergebnis <- TukeyHSD(modell_anova)
print(tukey_ergebnis)
# Visualisierung
plot(tukey_ergebnis)
Der Output zeigt für jedes Gruppenpaar die Mittelwertdifferenz, das Konfidenzintervall sowie den adjustierten p-Wert. Konfidenzintervalle, die nicht die Null enthalten, sprechen für einen signifikanten Unterschied zwischen den jeweiligen Gruppen.
Alternativen zum Tukey HSD sind:
- Bonferroni-Korrektur: konservativer, empfehlenswert bei wenigen Vergleichen
- Scheffé-Test: flexibler, aber weniger power bei paarweisen Vergleichen
- Games-Howell: geeignet bei ungleichen Varianzen (Paket
rstatix)
Zweifaktorielle ANOVA und Interaktionseffekte
Sobald Sie zwei unabhängige Variablen berücksichtigen möchten, erweitern Sie die Formel entsprechend. Das *-Operator schließt dabei Haupteffekte und Interaktionseffekt ein; mit + modellieren Sie nur Haupteffekte ohne Interaktion.
# Zweifaktorielle ANOVA mit Interaktion
modell_2x2 <- aov(testergebnis ~ lerngruppe * geschlecht, data = daten)
summary(modell_2x2)
# Nur Haupteffekte, kein Interaktionsterm:
# modell_additiv <- aov(testergebnis ~ lerngruppe + geschlecht, data = daten)
Ein signifikanter Interaktionsterm bedeutet: Die Wirkung eines Faktors hängt vom Niveau des anderen Faktors ab. In solchen Fällen ist es wenig sinnvoll, Haupteffekte isoliert zu interpretieren – die Interaktion hat Vorrang. Eine visuelle Darstellung der Zellmittelwerte (Interaktionsplot) hilft hier erheblich bei der Interpretation.
Type-II- und Type-III-ANOVA mit car::Anova()
Base R berechnet standardmäßig Type-I-Quadratsummen – das bedeutet: Die Terme werden sequenziell in der Reihenfolge getestet, in der sie in der Formel stehen. Das ist bei balancierten Designs (gleiche Gruppengrößen) unproblematisch, bei unbalancierten Designs aber methodisch heikel.
Für unbalancierte Designs oder Modelle mit Interaktionstermen empfiehlt sich das car-Paket. Die Funktion car::Anova() berechnet Type-II- oder Type-III-Quadratsummentabellen für eine Vielzahl von Modellklassen, darunter lineare Modelle, gemischte Modelle und generalisierte lineare Modelle.
# Paket laden (ggf. vorher installieren: install.packages("car"))
library(car)
# Lineares Modell als Basis
modell_lm <- lm(testergebnis ~ lerngruppe * geschlecht, data = daten)
# Type-II-ANOVA (empfohlen bei unbalancierten Designs ohne starke Interaktion)
Anova(modell_lm, type = "II")
# Type-III-ANOVA (empfohlen wenn Interaktionsterme im Modell sind)
Anova(modell_lm, type = "III")
Als Faustregel gilt:
- Type II: Sinnvoll, wenn kein bedeutsamer Interaktionsterm erwartet wird. Testet jeden Haupteffekt unter Kontrolle aller anderen Haupteffekte.
- Type III: Standard in vielen Fachdisziplinen (z. B. Psychologie, Medizin), wenn Interaktionseffekte im Modell enthalten sind. Setzt voraus, dass Kontraste korrekt kodiert sind (in R:
options(contrasts = c("contr.sum", "contr.poly"))).
Das car-Paket unterstützt zudem heteroskedastizitätskorrigierte Kovarianzmatrizen über das Argument white.adjust – praktisch, wenn der Levene-Test auf ungleiche Varianzen hindeutet. Welche R-Pakete für die statistische Auswertung in Ihrer Abschlussarbeit sinnvoll sind, hängt vom Studiendesign ab.
Effektstärke berechnen: Eta-Quadrat
Ein signifikanter p-Wert allein sagt wenig über die praktische Bedeutsamkeit eines Befunds aus. Für die ANOVA ist Eta-Quadrat () die gebräuchlichste Effektstärke. Sie gibt an, welcher Anteil der Gesamtvarianz durch den Faktor erklärt wird.
Eta-Quadrat
Orientierungswerte nach Cohen: (klein), (mittel), (groß). In R berechnen Sie Eta-Quadrat am einfachsten mit dem Paket effectsize:
# install.packages("effectsize")
library(effectsize)
# Eta-Quadrat
eta_squared(modell_anova)
# Partielles Eta-Quadrat (bei mehrfaktorieller ANOVA bevorzugt)
eta_squared(modell_anova, partial = TRUE)
Eine ausführliche Anleitung zur Berechnung von Effektstärken in R finden Sie in unserem separaten Beitrag. Viele Hochschulen erwarten, dass Effektstärken neben dem p-Wert standardmäßig im Ergebnisbericht ausgewiesen werden – planen Sie das von Anfang an ein.
Voraussetzungen in R überprüfen
Voraussetzungsprüfungen gehören zur vollständigen Berichterstattung einer ANOVA. Gehen Sie dabei in dieser Reihenfolge vor:
1. Normalverteilung der Residuen
# Shapiro-Wilk-Test auf die Residuen
shapiro.test(residuals(modell_anova))
# QQ-Plot zur visuellen Prüfung
qqnorm(residuals(modell_anova))
qqline(residuals(modell_anova), col = "red")
2. Varianzhomogenität (Levene-Test)
library(car)
leveneTest(testergebnis ~ lerngruppe, data = daten)
Ist der Levene-Test signifikant (Varianzen unterscheiden sich), wechseln Sie zur Welch-ANOVA:
# Welch-ANOVA (robust bei Varianzheterogenität)
oneway.test(testergebnis ~ lerngruppe, data = daten, var.equal = FALSE)
3. Ausreißer identifizieren
# Boxplot je Gruppe
boxplot(testergebnis ~ lerngruppe, data = daten,
main = "Testergebnisse nach Lerngruppe",
xlab = "Gruppe", ylab = "Testergebnis")
Häufige Fehler und praktische Hinweise
In der Praxis zeigt sich, dass bestimmte Fehler beim Einsatz der ANOVA in R immer wieder auftauchen. Die häufigsten:
class(daten$lerngruppe) und wandeln Sie ggf. um: daten$lerngruppe <- as.factor(daten$lerngruppe).Weitere häufige Stolperfallen:
- Type-I-Quadratsummen bei unbalancierten Designs: Ohne Anpassung kann die Reihenfolge der Terme im Formelausdruck die Ergebnisse beeinflussen. Nutzen Sie
car::Anova()mittype = "II"odertype = "III". - Fehlende Werte ignorieren:
aov()ist für balancierte Designs konzipiert. Fehlende Werte in der abhängigen Variable können die Balance zerstören und die Ergebnisse verzerren. Informieren Sie sich vorab, wie Sie fehlende Werte in R behandeln. - Post-hoc ohne signifikante ANOVA: Post-hoc-Tests sind nur bei signifikantem Omnibus-F sinnvoll. Führen Sie sie nicht routinemäßig ohne Signifikanzprüfung durch.
- Effektstärke vergessen: p-Werte allein reichen in wissenschaftlichen Arbeiten nicht aus. Berichten Sie immer oder partielles .
Wenn Sie unsicher sind, ob Ihr Studiendesign eine einfache ANOVA, eine mehrfaktorielle ANOVA oder ein gemischtes Modell erfordert, lohnt sich eine frühzeitige methodische Beratung. Die statistische Unterstützung mit R bei QuantExpert umfasst genau diese Designfragen – von der Hypothesenformulierung bis zur Ergebnisdarstellung.
Für die Ergebnisdarstellung in Ihrer Abschlussarbeit empfiehlt sich außerdem ein Blick auf die Möglichkeiten, R-Ergebnisse formatiert zu exportieren. Pakete wie flextable oder apaTables erzeugen APA-konforme Tabellen direkt aus R-Objekten – das spart erheblich Zeit bei der Berichterstellung.