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 randolph@uni-bremen.
Versionshistory:
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
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.
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:
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.
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