8  Moderation & Interaktion

8.1 Folien

Folien als Vollbild | Folien als PDF

8.2 Daten der heutigen Sitzung

8.3 Code und Ausgaben aus der Vorlesung

R Skript herunterladen

Laden der relevanten Pakete

library(report) # Einfaches Erstellen von statistischen Berichten
library(marginaleffects) # Vorhersagen aus Regressionsmodellen
library(patchwork) # Mehre Plots in einer Grafik kombinieren
library(tidyverse) # Datenmanagement und Visualisierung: https://www.tidyverse.org/
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.6
✔ forcats   1.0.1     ✔ stringr   1.6.0
✔ ggplot2   4.0.1     ✔ tibble    3.3.0
✔ lubridate 1.9.4     ✔ tidyr     1.3.1
✔ purrr     1.2.0     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

Lesen und Aufbereiten des Datensatz von Voegele & Bachl

# https://osf.io/72azd/
d <- haven::read_sav(here::here("data/Voegele_Bachl_2017.sav")) |>
  mutate(
    schwab = factor(c_0001, labels = c("Hochdeutsch", "Schwäbisch")), # Stimulus
    gender = as_factor(v_113), # Gender
    age = ifelse(v_114 == 0, NA, v_114), # Alter
    gesamt = v_126, # Gesamtbewertung des Politikers
    sym = rowMeans(pick(v_139, v_141)), # Sympathie des Politikers
    atol = rowMeans(pick(v_25, v_26_gedreht, v_27, v_28_gedreht, v_29)), # Einstellung zum schwäbischen Dialekt
    klang = rowMeans(pick(v_54, v_55_gedreht, v_57_gedreht)), # Klang der Stimme
    verst = rowMeans(pick(v_121, v_122, v_123, v_125)), # Verständlichkeit des Sprechers
    polint = rowMeans(pick(v_4, v_5))
  ) |>
  filter(v_104 == 1) |> # Filter: Nur Wahlberechtigte in BW
  filter(gender != 0) |> # Zur Vereinfachung: Ohne 1 Person ohne Gender- und Age-Antwort
  mutate(gender = fct_drop(gender)) |> # Zur Vereinfachung: Ohne 1 Person ohne Gender- und Age-Antwort
  select(schwab, gender, age, polint, atol, klang, verst, gesamt, sym)

Stichprobenbeschreibung

d |>
  select(schwab, gender, age, atol, gesamt) |>
  haven::zap_labels() |>
  report_sample(by = "schwab")
# Descriptive Statistics

Variable             | Hochdeutsch (n=146) | Schwäbisch (n=177) | Total (n=323)
-------------------------------------------------------------------------------
gender [männlich], % |                44.5 |               43.5 |          44.0
Mean age (SD)        |       39.34 (18.53) |      40.16 (19.10) | 39.79 (18.82)
Mean atol (SD)       |         3.33 (0.77) |        3.29 (0.79) |   3.31 (0.78)
Mean gesamt (SD)     |         3.84 (0.79) |        3.59 (0.90) |   3.71 (0.86)

Modell ohne Interaktion mit Kontrolle von Gender schätzen

m1 <- lm(gesamt ~ schwab + gender, data = d)

Regressionstabelle für Modell ohne Interaktion mit Kontrolle von Gender

m1 |>
  report_table(include_effectsize = FALSE, metrics = "R2_adj")
Parameter           | Coefficient |         95% CI | t(320) |      p |  Fit
---------------------------------------------------------------------------
(Intercept)         |        3.99 | [ 3.83,  4.15] |  49.21 | < .001 |     
schwab [Schwäbisch] |       -0.25 | [-0.44, -0.07] |  -2.69 | 0.007  |     
gender [männlich]   |       -0.33 | [-0.52, -0.15] |  -3.53 | < .001 |     
                    |             |                |        |        |     
R2 (adj.)           |             |                |        |        | 0.05

Vorhersagen des Modells ohne Interaktion mit Kontrolle von Gender

theme_set(theme_classic(base_size = 12))
plot_predictions(m1, condition = "schwab") +
  plot_predictions(m1, condition = c("schwab", "gender")) &
  ylim(c(3.2, 4.2))

Modell mit Moderator Gender schätzen

m2 <- lm(gesamt ~ schwab * gender, data = d)

Regressionstabelle für Modell mit Moderator Gender

m2_table <- m2 |>
  report_table(include_effectsize = FALSE, metrics = "R2_adj")
m2_table
Parameter                               | Coefficient |         95% CI | t(319)
-------------------------------------------------------------------------------
(Intercept)                             |        3.98 | [ 3.79,  4.16] |  42.58
schwab [Schwäbisch]                     |       -0.23 | [-0.47,  0.02] |  -1.79
gender [männlich]                       |       -0.30 | [-0.57, -0.02] |  -2.13
schwab [Schwäbisch] × gender [männlich] |       -0.06 | [-0.43,  0.31] |  -0.33
                                        |             |                |       
R2 (adj.)                               |             |                |       

Parameter                               |      p |  Fit
-------------------------------------------------------
(Intercept)                             | < .001 |     
schwab [Schwäbisch]                     | 0.074  |     
gender [männlich]                       | 0.034  |     
schwab [Schwäbisch] × gender [männlich] | 0.743  |     
                                        |        |     
R2 (adj.)                               |        | 0.05

Vorhersagen des Modells mit Moderator Gender

plot_predictions(m2, condition = c("schwab", "gender")) +
  plot_predictions(m2, condition = rev(c("schwab", "gender"))) +
  scale_color_brewer(type = "qual") &
  theme(legend.position = "bottom") &
  ylim(c(3.2, 4.2))

Modell ohne Interaktion mit Kontrolle von AtoL schätzen

m3 <- lm(gesamt ~ schwab + atol, data = d)

Regressionstabelle für Modell ohne Interaktion mit Kontrolle von AtoL

m3 |>
  report_table(include_effectsize = FALSE, metrics = "R2_adj")
Parameter           | Coefficient |         95% CI | t(320) |      p |  Fit
---------------------------------------------------------------------------
(Intercept)         |        3.41 | [ 2.99,  3.83] |  15.93 | < .001 |     
schwab [Schwäbisch] |       -0.24 | [-0.43, -0.06] |  -2.56 | 0.011  |     
atol                |        0.13 | [ 0.01,  0.25] |   2.12 | 0.034  |     
                    |             |                |        |        |     
R2 (adj.)           |             |                |        |        | 0.03

Vorhersagen des Modells ohne Interaktion mit Kontrolle von AtoL

plot_predictions(m3, condition = list("schwab", atol = "threenum")) +
  plot_predictions(m3, condition = rev(list("schwab", atol = "threenum"))) +
  scale_color_brewer(type = "qual") &
  theme(legend.position = "bottom") &
  ylim(c(3.2, 4.2))

Modell mit Moderator AtoL schätzen

m4 <- lm(gesamt ~ schwab * atol, data = d)

Regressionstabelle für Modell mit Moderator AtoL

m4 |>
  report_table(include_effectsize = FALSE, metrics = "R2_adj")
Parameter                  | Coefficient |         95% CI | t(319) |      p |  Fit
----------------------------------------------------------------------------------
(Intercept)                |        4.06 | [ 3.45,  4.66] |  13.11 | < .001 |     
schwab [Schwäbisch]        |       -1.39 | [-2.20, -0.58] |  -3.37 | < .001 |     
atol                       |       -0.06 | [-0.24,  0.11] |  -0.71 | 0.481  |     
schwab [Schwäbisch] × atol |        0.34 | [ 0.11,  0.58] |   2.85 | 0.005  |     
                           |             |                |        |        |     
R2 (adj.)                  |             |                |        |        | 0.05

AtoL zentrieren und Modell mit Moderation erneut schätzen

d <- d |> mutate(atol_c = atol - mean(atol))
m4_c <- lm(gesamt ~ schwab * atol_c, data = d)

Regressionstabelle für Modell mit zentriertem AtoL als Moderator

m4_c_table <- m4_c |>
  report_table(include_effectsize = FALSE, metrics = "R2_adj")
m4_c_table
Parameter                    | Coefficient |         95% CI | t(319) |      p |  Fit
------------------------------------------------------------------------------------
(Intercept)                  |        3.84 | [ 3.71,  3.98] |  55.26 | < .001 |     
schwab [Schwäbisch]          |       -0.24 | [-0.43, -0.06] |  -2.61 | 0.010  |     
atol c                       |       -0.06 | [-0.24,  0.11] |  -0.71 | 0.481  |     
schwab [Schwäbisch] × atol c |        0.34 | [ 0.11,  0.58] |   2.85 | 0.005  |     
                             |             |                |        |        |     
R2 (adj.)                    |             |                |        |        | 0.05

Vorhersagen des Modells mit zentriertem Moderator AtoL

plot_predictions(m4_c, condition = list("schwab", atol_c = "threenum")) +
  plot_predictions(m4_c, condition = rev(list("schwab", atol_c = "threenum"))) +
  scale_color_brewer(type = "qual") &
  theme(legend.position = "bottom") &
  ylim(c(3.2, 4.2))

plot_slopes(m4_c, variables = "schwab", condition = "atol_c") +
  geom_hline(yintercept = 0, linetype = 2)

m4_c_table
Parameter                    | Coefficient |         95% CI | t(319) |      p |  Fit
------------------------------------------------------------------------------------
(Intercept)                  |        3.84 | [ 3.71,  3.98] |  55.26 | < .001 |     
schwab [Schwäbisch]          |       -0.24 | [-0.43, -0.06] |  -2.61 | 0.010  |     
atol c                       |       -0.06 | [-0.24,  0.11] |  -0.71 | 0.481  |     
schwab [Schwäbisch] × atol c |        0.34 | [ 0.11,  0.58] |   2.85 | 0.005  |     
                             |             |                |        |        |     
R2 (adj.)                    |             |                |        |        | 0.05

plot_predictions(m4_c, condition = rev(list("schwab", atol_c = "threenum")))

plot_slopes(m4_c, variables = "schwab", condition = "atol_c") +
  geom_hline(yintercept = 0, linetype = 2)

8.4 Hausaufgabe

1) Vollziehen Sie die Analysen nach, deren Ausgaben wir in der Vorlesung besprochen haben.

  • Schreiben Sie kurze Ergebnistexte zur Beantwortung der Fragen bzw. zum Test der Hypothesen:
    • Unterscheidet sich der Effekt des Dialekts auf die Gesamtbewertung des Politikers in Abhängigkeit des Genders der Zuhörenden?
    • Je positiver die Einstellung zum schwäbischen Dialekt bei einer Versuchsperson, desto positiver (bzw. weniger negativ) ist der Effekt des Dialekts auf die Bewertung des Politikers.
    • Bei Personen, die dem Schwäbischen sehr negativ gegenüberstehen, hat der schwäbische Dialekt einen negativen Effekt auf die Gesamtbewertung des Politikers.

2) Modifizieren Sie die Moderationsanalysen aus der Vorlesung.

Weitere mögliche Moderatoren neben der Einstellung gegenüber dem Schwäbischen (atol) sind Alter (age) und politisches Interesse (polint). Weitere mögliche abhängige Variablen sind der wahrgenommene Klang der Stimme (klang), die Verständlichkeit des Sprechers (verst) und die Sympathie-Bewertung des Politikers (sym). Führen Sie zuerst notwendige Transformationen durch. Schätzen Sie dann das Regressionsmodell mit angepassten Variablen und erstellen Sie geeignete Grafiken. Interpretieren Sie die Ergebnisse in einigen Sätzen.

Lösung

8.5 Transkript

Das folgende Transkript wurde auf Basis der Aufzeichnung der Vorlesung erstellt. Die vollständige Aufzeichnungen inklusive der Bildschirminhalte sind in Blackboard🔒 verfügbar. Die Tonspur wurde mit VoiceAI transkribiert. Das Transkript wurde dann mit Sprachmodellen (v.a. Claude Sonnet 4.5) geglättet und formatiert. In diesem Prozess kann es an verschiedenen Stellen zu Fehlern kommen. Im Zweifel gilt das gesprochene Wort, und auch beim Vortrag mache ich Fehler.

Ich stelle das Transkript hier als experimentelles, ergänzendes Material zur Dokumentation der Vorlesung zur Verfügung. Noch bin ich mir unsicher, ob es eine sinnvolle Ergänzung ist und behalte mir vor, es weiter zu bearbeiten oder zu löschen.