Es ist eigentlich nicht sehr schwierig, mit Heteroskedastizität in einfachen linearen Modellen umzugehen (z. B. Einweg- oder Zweiweg-ANOVA-ähnlichen Modellen).
Robustheit von ANOVA
Erstens ist die ANOVA, wie andere angemerkt haben, erstaunlich robust gegenüber Abweichungen von der Annahme gleicher Varianzen, insbesondere wenn Sie ungefähr ausgeglichene Daten haben (gleiche Anzahl von Beobachtungen in jeder Gruppe). Vorläufige Tests auf gleiche Varianzen sind dagegen nicht (obwohl Levenes Test viel besser ist als der in Lehrbüchern gelehrte F -Test ). Wie George Box es ausdrückte:
Der erste Test auf Abweichungen ist so, als würde man mit einem Ruderboot zur See fahren, um herauszufinden, ob die Bedingungen so ruhig sind, dass ein Ozeandampfer den Hafen verlassen kann!
Obwohl die ANOVA sehr robust ist, da es sehr einfach ist, Heteroskedatismus zu berücksichtigen, gibt es wenig Grund, dies nicht zu tun.
Nichtparametrische Tests
Wenn Sie wirklich an Mittelwertunterschieden interessiert sind , sind die nicht-parametrischen Tests (z. B. der Kruskal-Wallis-Test) wirklich nicht von Nutzen. Sie tun Test Unterschiede zwischen den Gruppen, aber sie tun nicht im allgemeinen Test Unterschiede in den Mitteln.
Beispieldaten
Lassen Sie uns ein einfaches Beispiel für Daten generieren, bei denen man ANOVA verwenden möchte, bei denen die Annahme gleicher Varianzen jedoch nicht zutrifft.
set.seed(1232)
pop = data.frame(group=c("A","B","C"),
mean=c(1,2,5),
sd=c(1,3,4))
d = do.call(rbind, rep(list(pop),13))
d$x = rnorm(nrow(d), d$mean, d$sd)
Wir haben drei Gruppen mit (deutlichen) Unterschieden in Mittelwert und Varianz:
stripchart(x ~ group, data=d)
ANOVA
Es überrascht nicht, dass eine normale ANOVA dies recht gut handhabt:
> mod.aov = aov(x ~ group, data=d)
> summary(mod.aov)
Df Sum Sq Mean Sq F value Pr(>F)
group 2 199.4 99.69 13.01 5.6e-05 ***
Residuals 36 275.9 7.66
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Welche Gruppen unterscheiden sich? Verwenden wir die HSD-Methode von Tukey:
> TukeyHSD(mod.aov)
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = x ~ group, data = d)
$group
diff lwr upr p adj
B-A 1.736692 -0.9173128 4.390698 0.2589215
C-A 5.422838 2.7688327 8.076843 0.0000447
C-B 3.686146 1.0321403 6.340151 0.0046867
Mit einem P- Wert von 0,26 können wir keinen Unterschied (im Mittelwert) zwischen Gruppe A und B behaupten. Und selbst wenn wir nicht berücksichtigt hätten, dass wir drei Vergleiche durchgeführt haben, bekämen wir keinen niedrigen P - Wert ( P = 0,12):
> summary.lm(mod.aov)
[…]
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.5098 0.7678 0.664 0.511
groupB 1.7367 1.0858 1.599 0.118
groupC 5.4228 1.0858 4.994 0.0000153 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 2.768 on 36 degrees of freedom
Warum das? Aus der Handlung ergibt sich ein ziemlich deutlicher Unterschied. Der Grund dafür ist, dass ANOVA in jeder Gruppe gleiche Varianzen annimmt und eine gemeinsame Standardabweichung von 2,77 schätzt (in der summary.lm
Tabelle als " Reststandardfehler" angegeben). in der ANOVA-Tabelle).
Gruppe A hat jedoch eine (Populations-) Standardabweichung von 1, und diese Überschätzung von 2,77 macht es (unnötig) schwierig, statistisch signifikante Ergebnisse zu erhalten, dh wir haben einen Test mit (zu) geringer Leistung.
'ANOVA' mit ungleichen Varianzen
Wie passt man ein geeignetes Modell an, das die Unterschiede in den Abweichungen berücksichtigt? In R ist es einfach:
> oneway.test(x ~ group, data=d, var.equal=FALSE)
One-way analysis of means (not assuming equal variances)
data: x and group
F = 12.7127, num df = 2.000, denom df = 19.055, p-value = 0.0003107
Wenn Sie also eine einfache Einweg-ANOVA in R ausführen möchten, ohne gleiche Varianzen anzunehmen, verwenden Sie diese Funktion. Es ist im Grunde eine Erweiterung von (Welch) t.test()
für zwei Stichproben mit ungleichen Varianzen.
Leider funktioniert es nicht mit TukeyHSD()
(oder den meisten anderen Funktionen, die Sie für aov
Objekte verwenden). Selbst wenn wir uns ziemlich sicher sind , dass es Gruppenunterschiede gibt, wissen wir nicht, wo sie sich befinden.
Modellierung der Heteroskedastizität
Die beste Lösung besteht darin, die Abweichungen explizit zu modellieren. Und es ist sehr einfach in R:
> library(nlme)
> mod.gls = gls(x ~ group, data=d,
weights=varIdent(form= ~ 1 | group))
> anova(mod.gls)
Denom. DF: 36
numDF F-value p-value
(Intercept) 1 16.57316 0.0002
group 2 13.15743 0.0001
Natürlich immer noch signifikante Unterschiede. Nun sind aber auch die Unterschiede zwischen Gruppe A und B statisch signifikant ( P = 0,025):
> summary(mod.gls)
Generalized least squares fit by REML
Model: x ~ group
[…]
Variance function:
Structure: Different standard
deviations per stratum
Formula: ~1 | group
Parameter estimates:
A B C
1.000000 2.444532 3.913382
Coefficients:
Value Std.Error t-value p-value
(Intercept) 0.509768 0.2816667 1.809829 0.0787
groupB 1.736692 0.7439273 2.334492 0.0253
groupC 5.422838 1.1376880 4.766542 0.0000
[…]
Residual standard error: 1.015564
Degrees of freedom: 39 total; 36 residual
Die Verwendung eines geeigneten Modells hilft also! Beachten Sie auch, dass wir Schätzungen der (relativen) Standardabweichungen erhalten. Die geschätzte Standardabweichung für Gruppe A befindet sich am unteren Rand der, Ergebnisse, 1,02. Die geschätzte Standardabweichung der Gruppe B ist das 2,44-fache oder 2,48-fache, und die geschätzte Standardabweichung der Gruppe C ist ähnlich 3,97 (Typ intervals(mod.gls)
, um Konfidenzintervalle für die relativen Standardabweichungen der Gruppen B und C zu erhalten).
Korrektur für mehrere Tests
Wir sollten jedoch unbedingt mehrere Tests korrigieren. Dies ist einfach mit der "Multcomp" -Bibliothek. Leider gibt es keine eingebaute Unterstützung für 'gls'-Objekte, daher müssen wir zuerst einige Hilfsfunktionen hinzufügen:
model.matrix.gls <- function(object, ...)
model.matrix(terms(object), data = getData(object), ...)
model.frame.gls <- function(object, ...)
model.frame(formula(object), data = getData(object), ...)
terms.gls <- function(object, ...)
terms(model.frame(object),...)
Nun geht es an die Arbeit:
> library(multcomp)
> mod.gls.mc = glht(mod.gls, linfct = mcp(group = "Tukey"))
> summary(mod.gls.mc)
[…]
Linear Hypotheses:
Estimate Std. Error z value Pr(>|z|)
B - A == 0 1.7367 0.7439 2.334 0.0480 *
C - A == 0 5.4228 1.1377 4.767 <0.001 ***
C - B == 0 3.6861 1.2996 2.836 0.0118 *
Immer noch statistisch signifikanter Unterschied zwischen Gruppe A und Gruppe B! ☺ Und wir können sogar (simultane) Konfidenzintervalle für die Unterschiede zwischen Gruppenmitteln erhalten:
> confint(mod.gls.mc)
[…]
Linear Hypotheses:
Estimate lwr upr
B - A == 0 1.73669 0.01014 3.46324
C - A == 0 5.42284 2.78242 8.06325
C - B == 0 3.68615 0.66984 6.70245
Mit einem annähernd (hier genau) korrekten Modell können wir diesen Ergebnissen vertrauen!
Beachten Sie, dass für dieses einfache Beispiel die Daten für Gruppe C keine Informationen zu den Unterschieden zwischen Gruppe A und B enthalten, da wir für jede Gruppe sowohl separate Mittelwerte als auch Standardabweichungen modellieren. Wir könnten nur paarweise t- Tests verwenden, die für mehrere Vergleiche korrigiert wurden:
> pairwise.t.test(d$x, d$group, pool.sd=FALSE)
Pairwise comparisons using t tests with non-pooled SD
data: d$x and d$group
A B
B 0.03301 -
C 0.00098 0.02032
P value adjustment method: holm
Für kompliziertere Modelle, z. B. Zweiwegemodelle oder lineare Modelle mit vielen Prädiktoren, ist die Verwendung von GLS (Generalized Least Squares) und die explizite Modellierung der Varianzfunktionen die beste Lösung.
Und die Varianzfunktion muss nicht einfach eine andere Konstante in jeder Gruppe sein; wir können es strukturieren. Zum Beispiel können wir die Varianz als Potenz des Mittelwerts jeder Gruppe modellieren (und müssen daher nur einen Parameter, den Exponenten, schätzen ) oder vielleicht als Logarithmus eines der Prädiktoren im Modell. All dies ist mit GLS (und gls()
in R) sehr einfach .
Die verallgemeinerte Methode der kleinsten Quadrate ist meiner Meinung nach eine sehr wenig genutzte statistische Modellierungstechnik. Anstatt sich Gedanken über Abweichungen von den Modellannahmen zu machen, modellieren Sie diese Abweichungen!
R
, kann es von Vorteil sein, wenn Sie meine Antwort hier lesen: Alternativen zur Einweg-ANOVA für heteroskedastische Daten , in der einige dieser Probleme behandelt werden.