Um alle in diesem Kapitel verwendeten Pakete zu installieren und zu laden, kann man folgenden Code ausführen:
Eine Varianzanalyse auf einem linearen Modell kann auf drei verschiedene Arten berechnet werden, die traditionell als Typ I, Typ II und Typ III bezeichnet werden. Das ist keine Eigenheit von R: Dieselben drei Typen tauchen in SAS, SPSS und anderen Statistikprogrammen auf, weil sie eine allgemeine Frage widerspiegeln, nämlich wie man Variation zuordnet, wenn sich die Prädiktoren überschneiden. Für perfekt balancierte Daten liefern alle drei dieselben Zahlen, weshalb der Unterschied in Einführungskursen oft übergangen wird. Sobald die Daten unbalanciert sind (und reale Experimente enden oft unbalanciert, sei es auch nur, weil eine Parzelle verloren ging oder eine Pflanze einging), können die drei Typen für denselben Effekt deutlich unterschiedliche p-Werte liefern. Dieses Kapitel erklärt, was die drei Typen tatsächlich berechnen, zeigt ein kleines Beispiel, in dem die Unterschiede sichtbar werden, und gibt praktische Empfehlungen, welcher Typ zu verwenden ist.
Ein schneller Überblick
Die drei Typen unterscheiden sich darin, wie die Quadratsumme für jeden Term berechnet wird, nicht im zugrunde liegenden Modell. Das Modell wird einmal mit lm() gefittet. Der “Typ” entscheidet lediglich, welche Vergleiche genesteter Modelle verwendet werden, um die Variation den einzelnen Termen zuzuordnen.
| Typ | R-Aufruf | Wie die Quadratsummen berechnet werden | Typischer Einsatz |
|---|---|---|---|
| I (sequenziell) | stats::anova(mod) |
Jeder Term wird auf die vorherigen aufgesetzt, in der Reihenfolge, in der sie in der Formel erscheinen. | Balancierte Daten oder echt hierarchische / genestete Modelle, bei denen die Termreihenfolge eine kausale Abfolge widerspiegelt. |
| II (hierarchisch) | car::Anova(mod, type = "II") |
Jeder Haupteffekt wird für alle anderen Haupteffekte adjustiert, aber nicht für Interaktionen, die ihn enthalten. | Unbalancierte Daten mit ausschließlich Haupteffekten, oder wenn Interaktionen vorhanden, aber nicht von primärem Interesse sind. Empfohlener Standard für die meisten angewandten Analysen (Langsrud 2003). |
| III (marginal) | car::Anova(mod, type = "III") |
Jeder Term wird für alle anderen Terme adjustiert, einschließlich höherer Interaktionen, die ihn enthalten. | Wenn Interaktionen vorhanden sind und Haupteffekte “am Rand” (marginal) getestet werden sollen. Erfordert Summen-Kontraste (sum-to-zero), um sinnvoll zu sein. |
Zwei Punkte sind hervorzuheben, bevor wir uns Daten anschauen. Erstens berechnet stats::anova() immer sequenzielle Quadratsummen vom Typ I - die Funktion hat kein type-Argument, und das Ändern der Reihenfolge der Prädiktoren in der Formel verändert das Ergebnis. Zweitens ist car::Anova() (man beachte das großgeschriebene A) das Standardwerkzeug für Typ II und Typ III und ist für letzteren praktisch unverzichtbar, weil korrekte Typ-III-Tests eine bestimmte Art der Kontrastkodierung benötigen (mehr dazu weiter unten).
Warum Balance eine Rolle spielt
Wenn ein Datensatz balanciert ist - jede Faktorkombination hat dieselbe Anzahl an Beobachtungen - sind die Haupteffekte orthogonal zueinander. Orthogonalität bedeutet, dass die durch Faktor A erklärte Variation sich nicht mit der durch Faktor B erklärten Variation überschneidet, sodass es keine Rolle spielt, in welcher Reihenfolge man sie zuordnet. Alle drei ANOVA-Typen liefern dieselben Quadratsummen und dieselben p-Werte.
Unbalancierte Daten zerstören diese Orthogonalität. Die durch A und durch B erklärte Variation teilt sich nun einen gemeinsamen Anteil, und die drei Typen unterscheiden sich darin, wie sie mit diesem geteilten Anteil umgehen:
- Typ I weist die gesamte geteilte Variation demjenigen Term zu, der in der Formel zuerst steht.
- Typ II testet jeden Haupteffekt, nachdem der Beitrag der anderen Haupteffekte entfernt wurde, wobei Interaktionen ignoriert werden.
- Typ III testet jeden Haupteffekt, nachdem der Beitrag aller anderen Terme entfernt wurde, einschließlich Interaktionen.
Ein konkretes 2-mal-2-Beispiel
Um dies sichtbar zu machen, konstruieren wir einen kleinen unbalancierten Zwei-Faktor-Datensatz. Die beiden Faktoren diet und supp haben jeweils zwei Stufen, und die Zellbesetzungen sind bewusst ungleich:
set.seed(42)
dat <- tibble(
diet = rep(c("low", "high"), times = c(14, 10)),
supp = c(rep(c("A", "B"), times = c(10, 4)), # low: 10 A, 4 B
rep(c("A", "B"), times = c(3, 7))), # high: 3 A, 7 B
response = c(
rnorm(10, mean = 10, sd = 1.5), # low + A
rnorm(4, mean = 12, sd = 1.5), # low + B
rnorm(3, mean = 14, sd = 1.5), # high + A
rnorm(7, mean = 17, sd = 1.5) # high + B
)
) %>%
mutate(across(c(diet, supp), as.factor))
xtabs(~ diet + supp, data = dat) supp
diet A B
high 3 7
low 10 4
Die Designmatrix ist deutlich unbalanciert: Die Kombination low diet + supplement A hat 10 Beobachtungen, während high diet + supplement A nur 3 hat.
Wir fitten nun das Zwei-Faktor-Modell mit Interaktion:
mod_ds <- lm(response ~ diet * supp, data = dat)Typ I hängt von der Termreihenfolge ab
stats::anova() berechnet immer sequenzielle Quadratsummen vom Typ I. Um die Reihenfolgeabhängigkeit sichtbar zu machen, fitten wir dasselbe Modell mit vertauschten Faktoren und vergleichen die beiden Tabellen nebeneinander:
Analysis of Variance Table
Response: response
Df Sum Sq Mean Sq F value Pr(>F)
diet 1 95.469 95.469 27.3858 4.031e-05 ***
supp 1 17.563 17.563 5.0381 0.03627 *
diet:supp 1 0.002 0.002 0.0006 0.98005
Residuals 20 69.722 3.486
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(mod_sd)Analysis of Variance Table
Response: response
Df Sum Sq Mean Sq F value Pr(>F)
supp 1 61.275 61.275 17.5770 0.0004485 ***
diet 1 51.758 51.758 14.8470 0.0009915 ***
supp:diet 1 0.002 0.002 0.0006 0.9800473
Residuals 20 69.722 3.486
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Die Quadratsummen und p-Werte für diet und supp unterscheiden sich zwischen den beiden Tabellen, einzig aufgrund der Termreihenfolge. Welcher Faktor auch immer zuerst aufgeführt wird, “absorbiert” die geteilte Variation. Genau dieses Verhalten macht Typ I als Standard unattraktiv: Eine wissenschaftlich bedeutungslose Entscheidung (welcher Faktor zuerst geschrieben wird) verändert die berichtete Teststatistik.
Typ II ignoriert Reihenfolge und Kodierung
car::Anova() (man beachte das großgeschriebene A) erzeugt reihenfolgeunabhängige Tabellen. Typ II adjustiert jeden Haupteffekt für den anderen Haupteffekt, aber nicht für die Interaktion:
Anova(mod_ds, type = "II")Anova Table (Type II tests)
Response: response
Sum Sq Df F value Pr(>F)
diet 51.758 1 14.8470 0.0009915 ***
supp 17.563 1 5.0381 0.0362658 *
diet:supp 0.002 1 0.0006 0.9800473
Residuals 69.722 20
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Diese Tabelle ist identisch, egal ob die Formel diet * supp oder supp * diet lautet, und, ebenso wichtig, sie hängt nicht davon ab, wie die Faktoren kodiert sind. Diese doppelte Robustheit ist der Hauptgrund, warum Typ II der empfohlene Standard für unbalancierte Daten ist, deren Interaktion nicht von zentralem Interesse ist (Langsrud 2003).
Typ III benötigt Summen-Kontraste
Typ III adjustiert jeden Haupteffekt für alle anderen Terme, einschließlich der Interaktion, die ihn enthält. Das ist der Punkt, über den fast jeder stolpert, der zum ersten Mal auf Typ III trifft: Ein korrekter Typ-III-Test erfordert Summen-Kontraste (sum-to-zero) für die Faktoren, und dies ist die einzige Stelle im Kapitel, an der die Kontrastkodierung tatsächlich eine Rolle spielt.
Unser Modell mod_ds wurde mit R’s Standard contr.treatment (Referenzkodierung) gefittet. Das war für Typ I und Typ II harmlos, die nicht von der Kodierung abhängen, aber für Typ III ist es nicht harmlos. Der naive Aufruf liefert:
Anova(mod_ds, type = "III")Anova Table (Type III tests)
Response: response
Sum Sq Df F value Pr(>F)
(Intercept) 597.21 1 171.3119 2.888e-11 ***
diet 24.95 1 7.1576 0.01454 *
supp 7.25 1 2.0785 0.16486
diet:supp 0.00 1 0.0006 0.98005
Residuals 69.72 20
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Unter Referenzkodierung testen diese Haupteffekt-Zeilen nicht den durchschnittlichen Effekt, den man üblicherweise will; sie testen den Effekt auf der Referenzstufe des anderen Faktors (einen einfachen Effekt). Um einen korrekten Typ-III-Test zu erhalten, fitten wir dasselbe Modell mit Summen-Kontrasten neu:
Anova Table (Type III tests)
Response: response
Sum Sq Df F value Pr(>F)
(Intercept) 3479.7 1 998.1784 < 2.2e-16 ***
diet 51.7 1 14.8209 0.0009994 ***
supp 17.1 1 4.9035 0.0385802 *
diet:supp 0.0 1 0.0006 0.9800473
Residuals 69.7 20
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Die Haupteffekt-Zeilen sind zwischen den beiden Tabellen sehr unterschiedlich: In diesem Beispiel kippt der supp-Effekt sogar von klar nicht signifikant unter der Standardkodierung zu signifikant unter Summen-Kontrasten. Nur die Version mit Summen-Kontrasten beantwortet die beabsichtigte Frage nach dem “durchschnittlichen Haupteffekt”. Die Interaktionszeile hingegen ist in beiden Tabellen identisch, weil der Term höchster Ordnung immer kodierungsinvariant ist.
Wenn man Quadratsummen vom Typ III benötigt, setzt man die Kontraste vor oder zum Zeitpunkt des Fittens: entweder options(contrasts = c("contr.sum", "contr.poly")) vor dem lm()-Aufruf, oder man übergibt contrasts = list(factor1 = contr.sum, factor2 = contr.sum) an lm() wie oben. Die Kontraste werden zum Zeitpunkt des Fittens in die Modellmatrix eingebacken, das Ändern der Option nach dem Fitten hat also keine Wirkung: Man muss neu fitten. Man beachte außerdem: einen Faktor ordered zu machen (was ihn auf contr.poly umstellt) ist kein sicherer Ersatz, sobald der Faktor drei oder mehr Stufen hat: contr.poly ist orthogonal, reproduziert aber für solche Faktoren nicht die gleichgewichtete Typ-III-Hypothese.
Wer über die Kontrastkodierung gar nicht nachdenken möchte, erhält mit emmeans::joint_tests() die kodierungsinvarianten Typ-III-Tests direkt. Die Funktion liefert die korrekte Antwort unabhängig davon, wie das Modell gefittet wurde, sogar aus dem Standard-Kontrast-Fit mod_ds:
joint_tests(mod_ds) model term df1 df2 F.ratio p.value
diet 1 20 14.821 0.0010
supp 1 20 4.903 0.0386
diet:supp 1 20 0.001 0.9800
Die F-Werte stimmen mit Anova(mod_sum, type = "III") oben überein, weil joint_tests() von den geschätzten Randmitteln (jede Stufe gleichgewichtet über den anderen Faktor gemittelt) ausgeht statt von den rohen Modellkoeffizienten. In der Praxis ist dies oft der robusteste Weg, eine Typ-III-Tabelle zu erhalten.
Vergleich nebeneinander
Um die Unterschiede deutlich zu machen, sammeln wir die p-Werte für alle drei Typen in einer einzigen aufgeräumten Tabelle. Alles wird auf dem Summen-Kontrast-Modell mod_sum berechnet, die Typ-III-Spalte ist also die korrekte:
get_p <- function(model, term, type) {
tbl <- if (type == "I") {
broom::tidy(anova(model))
} else {
broom::tidy(Anova(model, type = type))
}
tbl %>% filter(term == !!term) %>% pull(p.value)
}
terms <- c("diet", "supp", "diet:supp")
types <- c("I", "II", "III")
crossing(term = terms, type = types) %>%
rowwise() %>%
mutate(p = get_p(mod_sum, term, type)) %>%
ungroup() %>%
pivot_wider(names_from = type, values_from = p,
names_prefix = "Type ") %>%
mutate(across(starts_with("Type"), \(x) round(x, 4)))# A tibble: 3 × 4
term `Type I` `Type II` `Type III`
<chr> <dbl> <dbl> <dbl>
1 diet 0 0.001 0.001
2 diet:supp 0.98 0.98 0.98
3 supp 0.0363 0.0363 0.0386
Man beachte, dass die Interaktionszeile (diet:supp) über alle drei Typen identisch ist - die Interaktion höchster Ordnung wird immer auf dieselbe Weise getestet. Die Unterschiede liegen in den Haupteffekten.
Welchen Typ sollte man verwenden?
Es gibt keine einzelne Antwort, die jeder Situation gerecht wird, aber die folgenden Leitlinien decken die überwältigende Mehrheit angewandter Analysen ab:
- Für balancierte Daten ohne Kovariate spielt die Wahl numerisch keine Rolle. Typ I ist die einfachste Darstellung und vollkommen ausreichend. (Eine numerische Kovariate bricht die Orthogonalität selbst bei perfekter Balance, dann können sich die Typen trotz gleicher Zellbesetzung unterscheiden.)
- Für unbalancierte Daten mit ausschließlich Haupteffekten ist Typ II die statistisch trennschärfste Option und vermeidet die willkürliche Reihenfolgeabhängigkeit von Typ I. Langsrud (2003) gibt eine sorgfältige Begründung dafür, in diesem Fall Typ II gegenüber Typ III zu bevorzugen; der Kernpunkt ist, dass Typ II die Annahme keiner Interaktion ausnutzt (die man ohnehin trifft, wenn keine Interaktion im Modell ist), um mehr Freiheitsgrade zurückzugewinnen.
- Für unbalancierte Daten mit Interaktionen, die von wissenschaftlichem Interesse sind, ist Typ III in vielen Disziplinen die konventionelle Wahl (und der SAS-Standard, weshalb er so verbreitet ist). Er testet jeden Haupteffekt adjustiert für die Interaktion, was zur Interpretation “was ist der durchschnittliche Effekt von A, gemittelt über die Stufen von B” passt - aber nur mit Summen-Kontrasten (sum-to-zero).
- Für gemischte Modelle (z.B.
lmerTest::lmer) ist die Frage subtiler und wird üblicherweise über Satterthwaite- oder Kenward-Roger-Approximationen behandelt statt über die Wahl eines Quadratsummen-Typs. Diese werden im Mixed-Models-Material dieses Kurses behandelt.
Die Wahl zwischen Typ II und Typ III ist im Kern eine Wahl, auf welches Randmittel sich der Haupteffekt-Test bezieht. Typ III vergleicht die gleichgewichteten Randmittel - jede Stufe eines Faktors mit gleichem Gewicht über den anderen Faktor gemittelt, so als wäre das Design balanciert gewesen. Typ II vergleicht die n-gewichteten Randmittel - jede Stufe so gemittelt, wie die Daten tatsächlich angefallen sind. Die ehrliche Frage ist also selten “welche Quadratsumme”, sondern “will ich jede Behandlung fair (gleiches Gewicht) oder wie beobachtet (n-gewichtet) gemittelt?”. Wenn die Unbalanciertheit zufällig ist (eine verlorene Parzelle, eine eingegangene Pflanze), stellt die Gleichgewichtung meist die eigentlich gemeinte Frage wieder her; ist die Unbalanciertheit gewollt (proportionale Zuteilung, Checks in einem augmented Design), kann die n-Gewichtung die ehrlichere Zusammenfassung sein.
Ein praktischer Workflow besteht darin, das Modell zu fitten, die Annahmen zu prüfen (siehe A1. Modelldiagnostik), dann standardmäßig Typ II zu berichten und nur dann zu Typ III zu wechseln, wenn die Interaktion sowohl vorhanden als auch wissenschaftlich bedeutsam ist. Was auch immer berichtet wird, der gewählte Typ und die Kontrastkodierung sollten im Methodenteil explizit angegeben werden, denn dasselbe Modell kann drei verschiedene ANOVA-Tabellen erzeugen.
Ein Vorbehalt überragt die Typenwahl gänzlich: Wenn die Interaktion selbst signifikant ist, erzeugt kein Typ einen Haupteffekt-p-Wert, der leicht zu interpretieren wäre, denn ein Haupteffekt hat keine saubere Bedeutung, solange die Interaktion real ist. In diesem Fall geht die Auswertung zu einfachen Effekten (simple effects) oder emmeans-Kontrasten über statt zu einer Haupteffekt-ANOVA-Zeile.
- Langsrud (2003) - klare statistische Begründung dafür, Typ II gegenüber Typ III für unbalancierte Daten zu bevorzugen.
- Fox, J. and Weisberg, S. (2019), An R Companion to Applied Regression, 3rd ed. - Diskussion von Typ II und Typ III im Kontext des Pakets
car. Siehe auch?car::Anova. - Anova - Type I/II/III SS explained
- How to interpret Type I, II, and III ANOVA? (CrossValidated)
Balancierte Daten: Alle drei Typen stimmen überein (außer eine Kovariate ist im Modell, die die Orthogonalität selbst bei perfekter Balance bricht). Sich um den Typ Gedanken zu machen, wird erst notwendig, sobald das Design unbalanciert ist.
stats::anova()ist Typ I und hängt von der Reihenfolge der Terme in der Formel ab. Zwei wissenschaftlich äquivalente Modelle können unterschiedliche p-Werte erzeugen.car::Anova()liefert Typ II und Typ III und ist reihenfolgeunabhängig. Typ II ist zusätzlich kodierungsinvariant, Typ III nicht.Typ III benötigt Summen-Kontraste (sum-to-zero). Man verwende
options(contrasts = c("contr.sum", "contr.poly"))vor dem Fitten, andernfalls sind die Haupteffekt-Tests nicht das, wonach sie aussehen. Als robuste Alternative liefertemmeans::joint_tests()die korrekten Typ-III-Tests unabhängig von der Kodierung.Standardempfehlung: Typ II für die meisten unbalancierten Designs ohne wissenschaftlich zentrale Interaktion, Typ III, wenn Interaktionen zentral sind. Stets angeben, welcher Typ und welche Kontraste verwendet wurden.
Literatur
Zitat
@online{schmidt2026,
author = {{Dr. Paul Schmidt}},
title = {A3. ANOVA-Typen (I, II, III)},
date = {2026-08-13},
url = {https://biomathcontent.netlify.app/de/content/lin_mod_exp/a3_anovatypes.html},
langid = {de}
}