8 Moderation & Interaktion
8.1 Folien
8.2 Daten der heutigen Sitzung
8.3 Code und Ausgaben aus der Vorlesung
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_tableParameter | 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_tableParameter | 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_tableParameter | 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
- Zu 1) Siehe Code und Ausgaben aus der Vorlesung
- Zu 2) R Skript | HTML mit Output
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.
