Willkommen bei Stats by Randolph. Hier geht es zur Hauptseite mit weiteren Informationen und Inhalten.

Autor:innen dieser Seite: An den Inhalten dieser Seite haben mitgearbeitet: Valentin Koob und Markus Janczyk. Der Inhalt dieser Seite wird in der Lehre in den Studiengängen Psychologie von der AG Forschungsmethoden und Kognitive Psychologie an der Universität Bremen verwendet, steht aber allen Interessierten zur Verfügung. Rückmeldungen/Fehler/Vorschläge können gesendet werden an .

Versionshistory:

  • v1.0: erste online-gestellte Version (03.03.2024)

1 Power Berechnung für Varianzanalyse-Designs

1.1 Power für einfaktorielle between-subject Designs

Im Zuge der einfaktoriellen Varianzanalyse in Statistik II (siehe Teil 3) wurde erläutert, wie die Power für eine einfaktorielle Varianzanalyse berechnet werden kann. Essenziell war hierbei die Betrachtung der Effektstärke \(f\) und wie diese sich zur non-zentralen \(F\)-Verteilung mit \(N-J\) Freiheitsgraden verhält (mit \(N\) = Gesamtstichprobengröße und \(J\) = Anzahl der Stufen).

Für die praktische Umsetzung mit R kann für die einfaktorielle Varianzanalyse die Funktion pwr.anova.test() aus dem pwr Paket genutzt werden. Analog zur R Funktion power.t.test (siehe Teil 14, Statistik 1) können hierbei für

  • ein Signifikanzniveau \(\alpha\),
  • eine Effektstärke \(f\),
  • eine Stichprobengröße pro Gruppe \(n\) und
  • eine Anzahl der Gruppen \(J\)

die Power \(1-\beta\) für ein konkretes Design berechnet werden. Auch hier gilt natürlich, dass alle Größen voneinander mathematisch abhängig sind und sobald 4 der 5 Werte gesetzt sind, die letzte Größe automatisch berechnet wird. Sie eignet sich also sowohl für die a-priori wie auch post-hoc Power-Betrachtung.

Als Beispiel wollen wir die benötigte Stichprobengröße für ein einfaktorielles Design mit \(J=3\) Stufen berechnen, bei der die angenommene Effektstärke \(f = 0.5\) ist und wir eine Power von \(1-\beta = 0.8\) erreichen wollen. Die Funktion für diesen Fall wird dann wie folgt aufgerufen:

library(pwr)
pwr.anova.test(k = 3,            # Anzahl der Faktorstufen (bei uns im Skript J)
               n = NULL,         # wird gesucht
               f = 0.5,          # angenommene Effektstärke
               sig.level = 0.05, # Signifikanzniveau (standard 5%)
               power = 0.8)      # gewünschte Power 
## 
##      Balanced one-way analysis of variance power calculation 
## 
##               k = 3
##               n = 13.89521
##               f = 0.5
##       sig.level = 0.05
##           power = 0.8
## 
## NOTE: n is number in each group

Die Funktion gibt ein \(n = 14\) (aufgerundet) pro Gruppe aus. Unsere gesamte Stichprobengröße müsste also \(N = 3 \cdot 14 = 42\) sein, um bei einem einfaktoriellen Design mit \(J=3\) Stufen, mit einer Power von \(80\%\) einen Effekt von \(f = 0.5\) aufdecken zu können.

1.2 Power Berechnung für komplexere Designs mit Superpower

Das Problem ist nun, dass die Funktion pwr.anova.test() nur für einfaktorielle between-subject Varianzanalysen einsetzbar ist. Für mehrfaktorielle Varianzanalysen oder Varianzanalysen mit Messwiederholung gilt sie nicht mehr. Allerdings sind die genauen Herangehensweisen für die Power-Berechnung je nach Design anders und auch die dahinterliegende Mathematik wird mit steigender Komplexität der Varianzanalyse immer komplizierter. Eine Lösung ist jedoch die Nutzung von Simulationen. Anstatt die Power analytisch durch geschlossene Formeln herzuleiten, nutzt man die Rechenleistung moderner Computer um die Power für ein gegebenes Design zu simulieren. In R gibt es hierfür das Paket Superpower (Lakens & Caldwell, 2021). Wir wollen hier an dieser Stelle das Paket nur grundlegend einführen, da es bereits ein gut verständliches Tutorial als Publikation gibt (siehe hier).

Im Gegensatz zu bisher betrachteten Funktionen (wie power.t.test() oder pwr.anova.test()) muss man bei Superpower eine Vermutung über die wahren Populationserwartungswerte bzw. Standardabweichungen formulieren, welche dann als Basis der Simulation dient. Diese Informationen beschreibt man mit Hilfe der Funktion ANOVA_design(). Die folgenden Annahmen über die Erwartungswerte und Standardabweichungen entsprechen in etwa der vorherigen Situation mit einer angenommen Effektstärke von \(f = 0.5\):

library(Superpower)
design_result <- ANOVA_design(design = "3b",      # dreistufig between-subject 
                              n = 14,             # 14 Versuchspersonen
                              mu = c(1, 2, 3.45), # Die angenommenen Erwartungswerte
                              sd = 2,             # Die angenommen Standardabweichung
                              labelnames = c("condition", "S1", "S2", "S3"))             

Eine Visualisierung der Annahmen erhält man auch direkt (dies ist besonders praktisch bei komplizierteren Designs). Explizit unterdrücken kann man dieses Verhalten, indem man das Argument plot = FALSE setzt.

Um die Power nun zur angenommen Situation auf Populationsebene zu berechnen kann man ANOVA_power() oder ANOVA_exact() nutzen. Im ersteren Fall werden immer und immer wieder Stichproben simuliert und die erzielte Power wird dann als relative Häufigkeit signifikanter Ergebnisse approximiert. Im zweiten Fall wird ein Datensatz simuliert, der den Spezifikationen auf Populationsebene exakt entspricht und dann als Grundlage zur Power-Berechnung dient. Der Vorteil von ANOVA_exact() ist, dass die Berechnung sehr schnell geht. Der Nachteil gegenüber ANOVA_power()ist allerdings, dass sie weniger flexibel ist, so kann ANOVA_exact() bspw. keine sequentielle \(\alpha\)-Korrektur berücksichtigten. Wenn allerdings nur die Power von Haupt- bzw. Interaktionseffekten interessieren, reicht i.d.R. die Funktion ANOVA_exact() aus.

Beispielhafter Aufruf von ANOVA_exact() (verbose = FALSE verhindert eine direkte Ausgabe der Ergebnisse):

power_out <- ANOVA_exact(design_result, 
                         verbose = FALSE)
power_out
## Power and Effect sizes for ANOVA tests
##             power partial_eta_squared cohen_f non_centrality
## condition 80.8232              0.2141  0.5219        10.6225
## 
## Power and Effect sizes for pairwise comparisons (t-tests)
##                             power effect_size
## p_condition_S1_condition_S2 24.71        0.50
## p_condition_S1_condition_S3 87.68        1.23
## p_condition_S2_condition_S3 45.52        0.73

Der Output enthält 2 wesentliche Informationen:

  • Die Power und Effektstärken der Omnibus Hypothese der Varianzanalyse
  • Power und Effektstärken für paarweise Kontraste der einzelnen Gruppen

Auch hier wird ausgegeben, dass wir mit dem beispielhaften Design und Annahmen bei \(n = 14\) Probanden in etwa eine Power von \(80\%\) erreichen.

Anmerkung: Die Effektstärke cohen_f von \(0.5219\) im Output entspricht nicht exakt der theoretischen Effektstärke von \(f = 0.5\) auf Basis der angenommenen Situation auf Populationsebene. Der Grund hierfür liegt darin, dass ANOVA_exact() eine Stichprobe simuliert, die von den Mittelwerten und Standardabweichungen her exakt den angenommenen Erwartungswerten und Varianzen entspricht. Das Effektstärkemaß \(f\) ist (so wie \(d\) auch) allerdings nicht erwartungstreu und überschätzt die wahre Effektstärke systematisch. In anderen Worten: Auf Stichprobenebene fällt \(f\) immer etwas größer aus als es sollte. Daher ist der ausgegebene Wert von \(0.5219\) leicht größer als die tatsächlich angenommene Effektstärke von \(f = 0.5\). Diese Überschätzung wird mit größerem \(n\) zunehmend kleiner.

Um nicht ständig neu die Funktion ANOVA_exact() für diverse n aufzurufen, bietet Superpower auch an eine Power-Funktion in Abhängigkeit von n zu plotten:

plot_power(design_result = design_result,   # welches Design? 
           min_n = 5,                       # minimale Stichprobengröße
           max_n = 30,                      # maximale Stichprobengröße
           desired_power = 80)              # angestrebte Power (%)

## Achieved Power and Sample Size for ANOVA-level effects
##    variable                  label  n achieved_power desired_power
## 1 condition Desired Power Achieved 14          80.82            80

Die wirkliche Stärke von Superpower kommt allerdings vor allem bei komplexeren Designs ins Spiel, bei denen eine Power-Berechnung zunehmend komplizierter wird. Zum Beispiel könnte es sein, dass wir die Power für eine Studie ausrechnen möchten, bei der eine \(2\times2\) Varianzanalyse mit Messwiederholung gerechnet wird. Während in diesen Fällen die analytische Übersetzung von Effektstärken in eine Power häufig unklar bleibt, kann mit Superpower eine theoretische Situation auf Populationsebene erstellt und die Power bzw. Effektstärke für diese berechnet werden.

design_result <- ANOVA_design(design = "2w*2w",        # 2 Faktoren, jeweils within-subject
                              n = 40,                  # 40 Versuchspersonen
                              mu = c(0.5, 0, 0.5, 0),  # Erwartungswerte
                              sd = 2,                  # Standardabweichungen
                              r = 0.8,                 # Korrelation zwischen den Bedingungen
                              label_list = list(condition = c("cheerful", "sad"), # Faktor 1
                                                voice = c("human", "robot")))     # Faktor 2

power_out <- ANOVA_exact(design_result,
                         verbose = FALSE)
power_out
## Power and Effect sizes for ANOVA tests
##                   power partial_eta_squared cohen_f non_centrality
## condition        5.0000              0.0000  0.0000            0.0
## voice           93.1525              0.2427  0.5661           12.5
## condition:voice  5.0000              0.0000  0.0000            0.0
## 
## Power and Effect sizes for pairwise comparisons (t-tests)
##                                                                 power
## p_condition_cheerful_voice_human_condition_cheerful_voice_robot 68.37
## p_condition_cheerful_voice_human_condition_sad_voice_human       5.00
## p_condition_cheerful_voice_human_condition_sad_voice_robot      68.37
## p_condition_cheerful_voice_robot_condition_sad_voice_human      68.37
## p_condition_cheerful_voice_robot_condition_sad_voice_robot       5.00
## p_condition_sad_voice_human_condition_sad_voice_robot           68.37
##                                                                 effect_size
## p_condition_cheerful_voice_human_condition_cheerful_voice_robot        -0.4
## p_condition_cheerful_voice_human_condition_sad_voice_human              0.0
## p_condition_cheerful_voice_human_condition_sad_voice_robot             -0.4
## p_condition_cheerful_voice_robot_condition_sad_voice_human              0.4
## p_condition_cheerful_voice_robot_condition_sad_voice_robot              0.0
## p_condition_sad_voice_human_condition_sad_voice_robot                  -0.4

Idealerweise sind dann die angenommenen Erwartungswerte, Standardabweichungen und Korrelationen entweder theoretisch gut begründet oder aus vorherigen Studien entnommen.

Anmerkung: Im Falle einer within-subject Varianzanalyse mit nur zweistufigen Faktoren, so wie im gerade betrachteten Beispiel, kann man alle Haupt- und Interaktionseffekte als Differenz darstellen und so das Design auf eine Reihe einfacher \(t\)-Tests herunterbrechen. Dies hat den Vorteil, dass die Power-Berechnung wieder mit der Funktion power.t.test() möglich ist. Weitere Informationen hierzu finden sich bei Langenberg et al. (2023). Ein R-Paket bzw. eine ShinyApp zur Publikation finden Sie hier.

2 Literatur

  • Lakens, D., & Caldwell, A. R. (2021). Simulation-based power analysis for factorial analysis of variance designs. Advances in Methods and Practices in Psychological Science, 4(1), 1-14. https://doi.org/10.1177/2515245920951503

  • Langenberg, B., Janczyk, M., Koob, V., Kliegl, R., & Mayer, A (2023). A tutorial on using the paired t test for power calculations in repeated measures ANOVA with interactions. Behavior Research Methods, 55, 2467–2484. https://doi.org/10.3758/s13428-022-01902-8