library(marginaleffects)
library(report)
library(tidyverse)
theme_set(theme_minimal())
3 Mittelwertvergleiche
Beispielanalyse
Hängt die Rezeptionswahrscheinlichkeit von Nachrichten auf Facebook von der Art der Kuratierung ab?
3.1 Pakete und Daten laden
Zunächst laden wir die üblichen R-Pakete sowie die Daten von Kümpel (2019). Neu ist das Paket marginaleffects
, mit dem wir aus Regressionsmodellen weitere Schätzungen, Vorhersagen oder Kontraste erhalten können.
Wir wählen nur die relevanten Variablen aus dem SPSS-Datensatz aus und benennen sie in modus
und rw
um. Anschließen setzen wir den Referenzwert für die Versuchsbedingung Modus auf den Wert Chronik. Für den Modus Tagging erstellen wir zudem eine dichotome Variable (0/1), d.h. Tagging vs. alle anderen Bedingungen. Schließlich wandeln wir die Rezeptionswahrscheinlichkeit in einen Zahlenwert um und löschen alle SPSS-Labels.
<- haven::read_sav("data/Kuempel_2019.sav") |>
kuempel19 select(
modus = Kurationsmodus_SNS,
rw = Rezeptionswahrscheinlichkeit
|>
) mutate(
modus = as_factor(modus) |> relevel("Chronik"), # Faktor mit Referenz Chronik
modus_tag = ifelse(modus == "Tag", 1, 0), # Dummy-Variable
rw = as.numeric(rw) # Numerische Variable
|>
) ::zap_labels()
haven
kuempel19
# A tibble: 524 × 3
modus rw modus_tag
<fct> <dbl> <dbl>
1 Tag 5 1
2 Chronik 2 0
3 Post 3 0
4 DM 1 0
5 Chronik 1 0 # ℹ 519 more rows
3.2 Deskriptivstatistik
|>
kuempel19 select(rw) |>
::report_table() report
Variable | n_Obs | Mean | SD | Median | MAD | Min | Max | Skewness
-----------------------------------------------------------------------
rw | 524 | 3.04 | 1.30 | 3.00 | 1.48 | 1.00 | 5.00 | -0.10
Variable | Kurtosis | percentage_Missing
---------------------------------------- rw | -1.13 | 0.00
|>
kuempel19 ggplot(aes(x = rw)) +
geom_histogram()
Neben der univariaten Auswertung des Outcomes betrachten wir auch schon die Gruppenmittelwerte der einzelnen Experimentalbedingungen.
|>
kuempel19 group_by(modus) |>
summarise(
n = n(),
M = mean(rw, na.rm = TRUE),
SD = sd(rw, na.rm = TRUE)
)
# A tibble: 4 × 4
modus n M SD
<fct> <int> <dbl> <dbl>
1 Chronik 141 2.88 1.20
2 Post 97 2.79 1.25
3 Tag 152 3.51 1.33 4 DM 134 2.84 1.28
Wir erkennen bereits, dass sich die Rezeptionswahrscheinlichkeit in der Stichprobe zwischen den Experimentalbedingungen unterscheidet.
3.3 Zwei Gruppen vergleichen
Zunächst testen wir den Unterschied zwischen dem Modus “Tagging” und allen anderen Versuchsbedingungen. Dies entspricht einem klassischen t-Test.
<- lm(rw ~ modus_tag, data = kuempel19)
m1_tag ::report_table(m1_tag) report
Parameter | Coefficient | 95% CI | t(522) | p | Std. Coef.
-----------------------------------------------------------------------
(Intercept) | 2.84 | [2.71, 2.97] | 43.26 | < .001 | -2.00e-16
modus tag | 0.67 | [0.43, 0.91] | 5.51 | < .001 | 0.23
| | | | |
AIC | | | | |
AICc | | | | |
BIC | | | | |
R2 | | | | |
R2 (adj.) | | | | |
Sigma | | | | |
Parameter | Std. Coef. 95% CI | Fit
-----------------------------------------
(Intercept) | [-0.08, 0.08] |
modus tag | [ 0.15, 0.32] |
| |
AIC | | 1738.84
AICc | | 1738.89
BIC | | 1751.62
R2 | | 0.05
R2 (adj.) | | 0.05 Sigma | | 1.27
Wir sehen, dass der Modus Tagging zu einer signifikant höheren Rezeptionswahrscheinlichkeit im Vergleich zu anderen Modi führt (B = 0.67, 95% CI [0.43, 0.91], t(522) = 5.51, p < .001). Der Mittelwert in den anderen Versuchsbedingungen (Tagging = 0) ist 2,84 auf einer Skala von 1-5. Der Effekt des Taggings ist eher schwach, wie wir am standardisierten Koeffizienten bzw. am \(R^2\) erkennen können.
3.4 Mehr als zwei Gruppen vergleichen
Der Code für die Auswertung mit mehr als zwei Gruppen ist identisch, lediglich hat die modus
Variable vier Ausprägungen.
<- lm(rw ~ modus, kuempel19)
m2_modus ::report_table(m2_modus) report
Parameter | Coefficient | 95% CI | t(520) | p | Std. Coef.
-------------------------------------------------------------------------
(Intercept) | 2.88 | [ 2.67, 3.09] | 26.95 | < .001 | -0.12
modus [Post] | -0.09 | [-0.41, 0.24] | -0.51 | 0.609 | -0.07
modus [Tag] | 0.63 | [ 0.34, 0.93] | 4.27 | < .001 | 0.49
modus [DM] | -0.04 | [-0.34, 0.26] | -0.28 | 0.776 | -0.03
| | | | |
AIC | | | | |
AICc | | | | |
BIC | | | | |
R2 | | | | |
R2 (adj.) | | | | |
Sigma | | | | |
Parameter | Std. Coef. 95% CI | Fit
------------------------------------------
(Intercept) | [-0.28, 0.04] |
modus [Post] | [-0.32, 0.19] |
modus [Tag] | [ 0.26, 0.71] |
modus [DM] | [-0.26, 0.20] |
| |
AIC | | 1742.57
AICc | | 1742.69
BIC | | 1763.88
R2 | | 0.06
R2 (adj.) | | 0.05 Sigma | | 1.27
Wir erhalten daher drei Regressionskoeffizienten, die jeweils die Differenz der Gruppe zur Referenzgruppe Chronik widergeben. Zum Beispiel ist die Rezeptionswahrscheinlichkeit in der Gruppe Post um 0,09 niedriger als bei Chronik. Diese Differenz ist nicht statistisch signifikant. Der Intercept von 2,88 entspricht dem Mittelwert in der Bedingung Chronik.
3.5 Referenzkategorie ändern
Wollen wir Differenzen zwischen anderen Versuchsgruppen prüfen, können wir die Referenzkategorie für modus
mit relevel()
ändern und das Modell noch einmal schätzen.
<- kuempel19 |>
kuempel19 mutate(modus_dm = relevel(modus, "DM"))
<- lm(rw ~ modus_dm, kuempel19)
m2_modus_dm ::report_table(m2_modus_dm) report
Parameter | Coefficient | 95% CI | t(520) | p | Std. Coef.
-------------------------------------------------------------------------------
(Intercept) | 2.84 | [ 2.62, 3.05] | 25.87 | < .001 | -0.15
modus dm [Chronik] | 0.04 | [-0.26, 0.34] | 0.28 | 0.776 | 0.03
modus dm [Post] | -0.04 | [-0.37, 0.29] | -0.25 | 0.804 | -0.03
modus dm [Tag] | 0.68 | [ 0.38, 0.97] | 4.50 | < .001 | 0.52
| | | | |
AIC | | | | |
AICc | | | | |
BIC | | | | |
R2 | | | | |
R2 (adj.) | | | | |
Sigma | | | | |
Parameter | Std. Coef. 95% CI | Fit
------------------------------------------------
(Intercept) | [-0.32, 0.01] |
modus dm [Chronik] | [-0.20, 0.26] |
modus dm [Post] | [-0.29, 0.22] |
modus dm [Tag] | [ 0.29, 0.75] |
| |
AIC | | 1742.57
AICc | | 1742.69
BIC | | 1763.88
R2 | | 0.06
R2 (adj.) | | 0.05 Sigma | | 1.27
Nun beziehen sich alle Regressionskoeffizienten auf die Referenzgruppe DM, die anderen Modellkoeffizienten sind unverändert.
3.6 Post-hoc Tests
Um alle paarweisen Post-Hoc-Vergleiche durchzuführen, nutzen wir die Funktion TukeyHSD()
, die allerdings ein ANOVA-Objekt erwartet, das wir vorher erstellen:
|>
m2_modus aov() |>
TukeyHSD()
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = m2_modus)
$modus
diff lwr upr p adj
Post-Chronik -0.08561819 -0.5170157 0.3457793 0.9563358
Tag-Chronik 0.63372527 0.2513524 1.0160981 0.0001354
DM-Chronik -0.04361173 -0.4381499 0.3509264 0.9919323
Tag-Post 0.71934346 0.2943555 1.1443314 0.0000912
DM-Post 0.04200646 -0.3939592 0.4779721 0.9946177 DM-Tag -0.67733700 -1.0648564 -0.2898176 0.0000485
Alternativ verwenden wir die etwas flexiblere Funktion avg_comparisons()
aus dem marginaleffects
-Paket. Mit variables = list(modus = "pairwise")
fordern wir alle paarweisen Vergleiche an. Die p-Werte sind im Vergleich zur oberen Funktion nicht für Anzahl Vergleiche korrigiert, weshalb sie hier leicht abweichen.
::avg_comparisons(m2_modus,
marginaleffectsvariables = list(modus = "pairwise")
)
Contrast Estimate Std. Error z Pr(>|z|) S 2.5 % 97.5 %
DM - Chronik -0.0436 0.153 -0.285 0.776 0.4 -0.344 0.256
DM - Post 0.0420 0.169 0.248 0.804 0.3 -0.290 0.374
DM - Tag -0.6773 0.150 -4.505 <0.001 17.2 -0.972 -0.383
Post - Chronik -0.0856 0.167 -0.512 0.609 0.7 -0.414 0.242
Tag - Chronik 0.6337 0.148 4.272 <0.001 15.7 0.343 0.925
Tag - Post 0.7193 0.165 4.362 <0.001 16.2 0.396 1.043
Term: modus Type: response
Wir sehen, dass sich die Rezeptionswahrscheinlichkeit in der Bedingung Tagging signifikant von jeder anderen Bedingung unterscheidet, die anderen drei Bedingungen aber nicht untereinander.
3.7 Übungsaufgaben
Für die Übung verwenden wir einen Standarddatensatz über Pinguine, der in R (seit Version 4.5) enthalten ist, aber auch separat heruntergeladen werden kann.
# Daten herunterladen, falls nicht schon vorhanden
<- readr::read_csv("https://raw.githubusercontent.com/rfordatascience/tidytuesday/main/data/2025/2025-04-15/penguins.csv")
penguins penguins
# A tibble: 344 × 8
species island bill_len bill_dep flipper_len body_mass sex year
<chr> <chr> <dbl> <dbl> <dbl> <dbl> <chr> <dbl>
1 Adelie Torgersen 39.1 18.7 181 3750 male 2007
2 Adelie Torgersen 39.5 17.4 186 3800 female 2007
3 Adelie Torgersen 40.3 18 195 3250 female 2007
4 Adelie Torgersen NA NA NA NA <NA> 2007
5 Adelie Torgersen 36.7 19.3 193 3450 female 2007 # ℹ 339 more rows
- Prüfen Sie die Hypothese, das männliche Pinguine schwerer sind als weibliche.
- Unterscheiden sich die verschiedenen Pinguinarten nach ihrem Gewicht, und wie?