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.
kuempel19 <- haven::read_sav("data/Kuempel_2019.sav") |>
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
) |>
haven::zap_labels()
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 rows3.2 Deskriptivstatistik
kuempel19 |>
select(rw) |>
report::report_table()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.00kuempel19 |>
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.28Wir 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.
m1_tag <- lm(rw ~ modus_tag, data = kuempel19)
report::report_table(m1_tag)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.27Wir 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.
m2_modus <- lm(rw ~ modus, kuempel19)
report::report_table(m2_modus)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.27Wir 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"))
m2_modus_dm <- lm(rw ~ modus_dm, kuempel19)
report::report_table(m2_modus_dm)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.27Nun 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.0000485Alternativ 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.
marginaleffects::avg_comparisons(m2_modus,
variables = 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
penguins <- readr::read_csv("https://raw.githubusercontent.com/rfordatascience/tidytuesday/main/data/2025/2025-04-15/penguins.csv")
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?