3  Mittelwertvergleiche

Beispielanalyse

Hängt die Rezeptionswahrscheinlichkeit von Nachrichten auf Facebook von der Art der Kuratierung ab?

Quelle

Kümpel, A. S. (2019). Getting tagged, getting involved with news? A mixed-methods investigation of the effects and motives of news-related tagging activities on social network sites. Journal of Communication, 69(4), 373–395. https://doi.org/10.1093/joc/jqz019

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.

library(marginaleffects)
library(report)
library(tidyverse)
theme_set(theme_minimal())

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 rows

3.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.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.

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.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.

Vergleich zum t-Test
t.test(rw ~ modus_tag, data = kuempel19, var.equal = TRUE) |>
  report::report_table()
Two Sample t-test

Parameter |     Group | Mean_Group1 | Mean_Group2 | Difference |         95% CI
-------------------------------------------------------------------------------
rw        | modus_tag |        2.84 |        3.51 |      -0.67 | [-0.91, -0.43]

Parameter | t(522) |      p |     d |          d  CI
----------------------------------------------------
rw        |  -5.51 | < .001 | -0.48 | [-0.66, -0.31]

Alternative hypothesis: two.sided

Wir sehen, dass t- und p-Wert identisch mit dem GLM sind.

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.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.

Vergleich zu ANOVA
aov(rw ~ modus, data = kuempel19) |>
  report::report_table()
Parameter | Sum_Squares |  df | Mean_Square |     F |      p | Eta2 |  Eta2 95% CI
----------------------------------------------------------------------------------
modus     |       49.12 |   3 |       16.37 | 10.17 | < .001 | 0.06 | [0.02, 1.00]
Residuals |      837.19 | 520 |        1.61 |       |        |      |             

F- und p-Wert sowie das Gütemaß sind identisch zum GLM.

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.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.

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
  1. Prüfen Sie die Hypothese, das männliche Pinguine schwerer sind als weibliche.
  2. Unterscheiden sich die verschiedenen Pinguinarten nach ihrem Gewicht, und wie?