alpha-Inflation (Teil 1)

Zum Verständnis des kumulierten alpha-Fehlers

Theorie
R
Simulation
Author

Markus Burkhardt

Published

February 27, 2023

Lernziele in R

  • Simulation zur \(\alpha\)-Fehler-Kumulierung

Was ist der \(\alpha\)-Fehler

Das \(\alpha\) oder auch die Irrtumswahrscheinlichkeit bezeichnet die Wahrscheinlichkeit, mit der die \(H_0\) abgelehnt wird, obwohl sie gilt. Betrachten wir die Idee des Hypothesentestens nach Neyman und Pearson in einer 4-Felder-Tafel, um den \(\alpha\)-Fehler von anderen Entscheidungsmöglichkeiten abzugrenzen.

Im Folgenden wollen wir nur \(\alpha\) betrachten und gehen daher von der Prämisse aus, das zufällige normalverteilte Variablen vorliegen, für deren Zusammenhänge stets die \(H_0\) gilt (keine Zusammenhänge / Unterschiede zwischen den Variablen). Außerdem wählen wir für alle Berechnungen eine Wahrscheinlichkeit von \(\alpha = 0.05\)

Beginnen wir mit einer kleinen Simulation des \(\alpha\)-Fehlers bei Mittelwertsvergleichen mit dem \(t\)-Test. Wir erzeugen 10 000 \(t\)-Tests mit den zufälligen Variablen A und B, die gleiche Mittelwerte und Standardabweichungen besitzen (\(\bar{x} = 0\) und \(\sigma_{x}^2 = 1\)):

options(digits = 4)
set.seed(052023)
N <- 10
p_values <- replicate(n = 10000, 
                      expr = {
                        d <- data.frame(A = rnorm(N), B = rnorm(N))
                        p <- t.test(x = d$A, y = d$B, var.equal = T)$p.value
                        return(p)
                        }
                      )

# Betrachten wir 25 zufällige p-Werte
round(p_values, 2)[sample.int(25)]
 [1] 0.16 0.72 0.89 0.19 0.98 0.78 0.27 0.83 0.58 0.23 0.45 0.01 0.45 0.42 0.97
[16] 0.20 0.77 0.33 0.16 0.49 0.32 0.38 0.32 0.95 0.97

Für 25 zufällige gewählte Simualtion sehen wir an der 12. Stelle einen \(p\)-Wert \(\leq 0.05\). Das ist der \(\alpha\)-Fehler, denn laut unserer Definition gibt es keine Mittelwertsunterschiede zwischen den Variablen A und B in der Simulation.

Betrachten wir alle 10 000 Simulationen, finden wir 493 \(p\)-Werte \(\leq 0.05\), was einem Anteil von 0.049 entspricht (nahezu unser \(\alpha\) von 0.05).

sum(p_values <= .05); mean(p_values <= .05)
[1] 493
[1] 0.0493

Der kumulierte \(\alpha\)-Fehler

Der kumulierte \(\alpha\)-Fehler gibt die Wahrscheinlichkeit dafür an, dass mindestens ein Test einer Serie von Tests signifikant wird. Eine Serie entspricht also mehrfachen Tests, die wir gedanklich durch eine Matrizenschreibweise erzeugen.

# pc ... pairwise-comparisons
pc_2 <- matrix(p_values, nrow = 2)
pc_2[, 1:10]
       [,1]   [,2]   [,3]   [,4]     [,5]   [,6]   [,7]   [,8]   [,9]  [,10]
[1,] 0.4505 0.2736 0.3789 0.9709 0.009126 0.9685 0.3295 0.7683 0.1589 0.5764
[2,] 0.1961 0.1880 0.3162 0.7759 0.158297 0.9546 0.9822 0.4881 0.4464 0.3180

Jede Spalte der oben erzeugten Matrix enthält zwei \(p\)-Werte (das könnten die \(p\)-Werte von 2 Vergleichen sein). Nun betrachten wir die Ergebnisse spaltenweise und fragen, wie viele Spalten mindestens einen \(p\)-Wert \(\leq \alpha\) enthalten.

In unserer Ausgabe ist das die 5. Spalte. Hier haben wir also bereits bei einer von 10 Testserien einmal den \(\alpha\)-Fehler begangen.

Betrachten wir alle \(p\)-Werte in einer 2er Serie, finden wir tatsächlich das ca. 10 % der Testserien mindestens ein signifikantes Ergebnis liefern.

mean(
  apply(pc_2, MARGIN = 2, FUN = function(x){any(x <= .05)})
)
[1] 0.097

Wird die Serie größer (z. B. 4 Tests), steigt der kumulierte \(\alpha\)-Fehler weiter an.

pc_4 <- matrix(p_values, nrow = 4)
pc_4[, 1:10]
       [,1]   [,2]     [,3]   [,4]   [,5]   [,6]    [,7]     [,8]   [,9]  [,10]
[1,] 0.4505 0.3789 0.009126 0.3295 0.1589 0.8270 0.88523 0.006608 0.8357 0.2127
[2,] 0.1961 0.3162 0.158297 0.9822 0.4464 0.2289 0.54817 0.655571 0.6389 0.1604
[3,] 0.2736 0.9709 0.968536 0.7683 0.5764 0.7220 0.81349 0.981835 0.6670 0.2158
[4,] 0.1880 0.7759 0.954570 0.4881 0.3180 0.4169 0.01781 0.442487 0.4021 0.2087

Bei 4 Vergleichen enthalten bereits drei Spalten (3, 7 und 8) mindestens ein signifikantes Ergebnis.

mean(
  apply(pc_4, MARGIN = 2, FUN = function(x){any(x <= .05)})
)
[1] 0.1828

Der kumulierte \(\alpha\)-Fehler steigt auf 0.18.

Formale Berechnung

Der kumulierte \(\alpha\)-Fehler (\(\bar {\alpha }\)) lässt mit \(m\) (der Anzahl der Tests pro Serie) berechnen:

\[{\displaystyle {\bar {\alpha }}=1-\left(1-\alpha _{}\right)^{m}}\]

# für pc_2
1 - (1 - .05)^2
[1] 0.0975
# für pc_4
1 - (1 - .05)^4
[1] 0.1855

Diese Ergebnisse decken sich mit denen unserer Simulation.

Erweiterungen

Mehrfachvergleiche und einfaktorielle ANOVA

Nun untersuchen wir die Mittelwertsunterschiede von 4 Variablen A, B, C und D (was einer einfaktoriellen ANOVA mit 4 Gruppen entspricht). Dazu benötigen wir 6 Paar-Vergleiche, also 6 einzelne \(t\)-Tests.

Wir erwarten also:

\[\bar{\alpha}=1-(1-0.05)^{6} = 0.26\]

set.seed(052023)
N <- 10
p_values_aov <- replicate(
  n = 1000, expr = {
    d <- data.frame(A = rnorm(N), B = rnorm(N), C = rnorm(N), D = rnorm(N))
    ps <- c(
      t.test(x = d$A, y = d$B)$p.value,
      t.test(x = d$A, y = d$C)$p.value,
      t.test(x = d$A, y = d$D)$p.value,
      t.test(x = d$B, y = d$C)$p.value,
      t.test(x = d$B, y = d$D)$p.value,
      t.test(x = d$C, y = d$D)$p.value
      )
    return(ps)
    }
  )
mean(
  apply(p_values_aov, MARGIN = 2, FUN = function(x){any(x <= .05)})
)
[1] 0.214

In unserer Simulation p_values_aov erhalten wir aber nur ein \(\bar{\alpha}=0.21\).

Das ist erklärungsbedürftig!

Werden die Variablen im Paar-Vergleich mehrfach herangezogen (z. B. der Vergleich A - B und A - C), clustern sich die falsch-signifikanten Ergebnisse innerhalb einer Serie. Weicht die Variable A zufällig vom Mittelwert ab, wird bei dem Vergleich mit B bzw. C oder D ein \(\alpha\)-Fehler wahrscheinlicher. Beim Auszählen von mindestens einem signifikanten Ergebnis wird der kumulierte \(\alpha\)-Fehler also geringer. Um das zu verdeutlichen vergleichen wir die Anzahl signifikanter Ergebnisse innerhalb einer Serie nochmal mit der der 1. Simulation:

# Vergleich mindestens 2 signifikante Ergebnisse in einer Serie

# Simulation 1
pc_6 <- matrix(p_values, nrow = 6)
sum(
  apply(pc_6, MARGIN = 2, FUN = function(x){sum(x <= .05) >= 2})
)
[1] 53
# Simulation 2 (ANOVA)
sum(
  apply(p_values_aov, MARGIN = 2, FUN = function(x){sum(x <= .05) >= 2})
)
[1] 71

Bei unabhängigen Stichproben ist die Wahrscheinlichkeit für mehr als ein signifkantes Ergebnis 0.053, bei Mehrfachvergleichen innerhalb eines Datensatzes steigt die Wahrscheinlichkeit hingegen auf 0.071. Die \(\alpha\)-Fehler bei Vergleichen mit den selben Variablen clustern sich innerhalb einer Testserie.

In dem Beitrag α-Inflation Teil 2 werden wir uns den Mehrfachvergleichen bei mehrfaktoriellen ANOVA-Designs widmen.