11  Übung 4 Lösung

NoteZu dieser Übung

In dieser Übung arbeiten wir mit dem Datensatz Selects2019.dta der Schweizer Wahlstudie SELECTS (Nachwahlbefragung im Jahr 2019). Dieser enthält Informationen zum Wahlverhalten und der politischen Einstellung von Schweizer:innen, sowie zahlreiche soziodemografische Merkmale. Die zentrale Frage in dieser Übung ist: Sind junge Frauen viel linker als junge Männer und ist dieser Unterschied bei den jungen Stimmbürger:innen so viel ausgeprägter bei als bei den anderen Altersgruppen?

11.1 Aufgabe 1

Lese den Datensatz in R ein. Im Folgenden stellt die politische Selbsteinschätzung (leftright) auf einer Skala von 0 (links) bis 10 (rechts) unsere abhängige Variable dar. Die Prädiktoren, an welchen wir hauptsächlich interessiert sind, sind das Alter (alter) einerseits sowie das Geschlecht (gender) andererseits.

Hinweis zum Einlesen: Nutze nach dem Einlesen den Code DATENSATZNAME[DATENSATZNAME == ""] <- NA, um fehlende Werte in R korrekt zu speichern.

  1. Auf welchem Skalenniveau befindet sich die abhängige Variable?
#| message: false

# Lade packages
pacman::p_load("sjPlot", "texreg", "haven", "readr", "readxl", "fixest", "MASS", "glm.predict", "scales", "tidyverse")

df_selects19 <- haven::read_dta("Selects2019.dta")
df_selects19[df_selects19 == ""] <- NA # NA's korrekt kodieren

glimpse(df_selects19)

Bei der politischen Selbsteinschätzung handelt es sich strenggenommen um eine ordinal skalierte Variable. Betrachte zwei Personen \(i\neq{j}\). Person \(i\) gibt den Skalenwert 2 an, während Person \(j\) den Skalenwert 7 angibt. Daraus können wir schliessen, dass Person \(i\) linker ist als Person \(j\), d.h. Relationen sind zulässig. Der Vergleich von Differenzen im Sinne von “Person \(j\) ist 3.5-mal so rechts wie Person \(i\)” ist strenggenommen nicht zulässig.


  1. Da wir lineare Regressionen nur für kontinuierliche abhängige Variablen schätzen können, behandeln wir leftright als kontinuierliche Variable. Recodiere leftright so, dass R diese als kontinuierlich interpretiert. Tipp: Verwende dazu unter anderem die Funktion as.numeric(). Schau dir die aktuellen Ausprägungen der Variable vorher allerdings genau an, allenfalls ist zusätzliches Recoding notwendig.
class(df_selects19$leftright)

Wir sehen, dass leftright als character eingelesen wurde. Schauen wir uns die verschiedenen Werte an, welche diese Variable annimmt.

df_selects19 %>% count(leftright)

Wir sehen, dass sowohl die minimale als auch die maximale Ausprägung Buchstaben enthalten. Daher wurde diese Variable nicht als numeric eingelesen. Zunächst recodieren wir diese Ausprägungen, sodass sie nur noch Zahlen enthalten. Anschliessend können wir die Variable zu einer numerischen transformieren.

# Recodiere "0 - Left" zu "0" und "10 - Right" zu "10"
df_selects19 <- df_selects19 %>% 
  mutate(
    leftright = as.numeric(case_when(
      leftright == "0 - Left" ~ "0",
      leftright == "10 - Right" ~ "10", 
      T ~ leftright))
  )


  1. Regressiere nun leftright auf alter (d.h. mit leftright als abhängiger und alter als unabhängiger Variable) und interpretiere die geschätzten Koeffizienten dieser einfachen linearen Regression. Behandle alter als stetige Variable.
class(df_selects19$alter)

# Falls Alter noch nicht numerisch kodiert wäre: df_selects19 <- mutate(df_selects19, alter = as.numeric(alter)) 

# Wir schätzen die Regression und speichern sie in einem Objekt
reg <- lm(leftright ~ alter, data = df_selects19) 
# Wir lassen uns mit coef() die Koeffizienten ausgeben, die im Objekt gespeichert sind
coef(reg)

Wir können einen leicht positiven Effekt beobachten. Steigt das Alter um ein Jahr, steigt der durchschnittliche Skalenwert um ca. r round(coef(lm(leftright ~ alter, data = df_selects19))[2], 2) Einheiten. Der Achsenabschnitt kann als durchschnittlicher Skalenwert einer 0-jährigen Person interpretiert werden. Da im Datensatz keine 0-jährige Personen enthalten sind, ist diese Interpretation jedoch bedeutungslos (Extrapolation).

  1. Regressiere nun leftright auf gender. Interpretiere die geschätzten Koeffizienten dieser Regression.
# Mit der folgenden Schreibweise können wir uns die Koeffizienten direkt ausgeben lassen, 
# ohne die Regression zuerst als Objekt abzuspeichern
coef(lm(leftright ~ gender, data = df_selects19))

Wir können erkennen, dass R den Steigungskoeffizienten genderMale genannt hat. Entsprechend nimmt genderMale für Männer den Wert 1 und für Frauen den Wert 0 an. Da der Achsenabschnitt den durchschnittlichen Skalenwert für genderMale = 0 darstellt, gibt er den durchschnittlichen Skalenwert für Frauen an. Anhand des Steigungskoeffizienten sehen wir, dass der durchschnittliche Skalenwert für Männer um ca. r round(coef(lm(leftright ~ gender, data = df_selects19))[2], 2) Einheiten höher ist als für Frauen. Kurz gesagt: Männer schätzen sich durchschnittlich etwas rechter ein als Frauen.


  1. Konvertiere die Variable gender zu einem Faktor, welcher für Frauen den Wert 1 und für Männer den Wert 0 annimmt. Alternativ kannst du auch eine neue numerische Variable genderFemale erstellen, welche für Frauen den Wert 1 und für Männer den Wert 0 annimmt. Wiederhole anschliessend die Regression aus Aufgabe 1d. Was fällt dir auf?
# Möglichkeit 1: Faktor
# Der erste Wert im levels Vektor wird als 0 und der zweite als 1 codiert
df_selects19 <- df_selects19 %>%
  mutate(gender = factor(gender, levels = c("Male", "Female")))

coef(lm(leftright ~ gender, data = df_selects19))

# Möglichkeit 2: Neue numerische Variable
df_selects19 <- df_selects19 %>%
  mutate(genderFemale = ifelse(gender == "Male", 0, 1))
# ifelse(): ist df_selects19$gender == "Male" TRUE nimmt die neue Variable den
# Wert 0 and, andernfalls nimmt sie den Wert 1 an.

coef(lm(leftright ~ genderFemale, data = df_selects19))

Wir sehen, dass der Geschlechterunterschied nun relativ zu den Männern interpretiert werden muss. Entsprechend ist dieser nun negativ: der durchschnittliche Skalenwert für Frauen ist um ca. r abs(round(coef(lm(leftright ~ gender, data = df_selects19))[2], 2)) Einheiten tiefer als für Männer. Der Achsenabschnitt gibt nun den durchschnittlichen Skalenwert für Männer an.

11.2 Aufgabe 2

  1. Regressiere nun leftright auf alter sowie gender. Interpretiere den Steigungskoeffizienten für gender.
selects_fit1 <- lm(leftright ~ alter + gender, data = df_selects19)
# Wir greifen auf den dritten Koeffizienten der Regression zu:
coef(selects_fit1)[3]

Der durchschnittliche Skalenwert für Frauen ist, ceteris paribus, um ca. r abs(round(coef(selects_fit1)[3], 2)) Einheiten tiefer als für Männer.


  1. Basierend auf der multiplen linearen Regression von 2a): vergleiche den vorhergesagten Links-Rechts-Skalenwert einer 50-jährigen Frau mit dem vorhergesagten Links-Rechts-Skalenwert eines 50-jährigen Mannes.
selects_fit1 <- lm(leftright ~ alter + gender, data = df_selects19)

# Vorhersagewerte berechenen mit predict(). Beachte, dass das Argument newdata
# einen Data Frame erwartet
y_hat1 <- predict(selects_fit1, 
                  newdata = data.frame(alter = 50, gender = "Female"))
y_hat2 <- predict(selects_fit1,
                  newdata = data.frame(alter = 50, gender = "Male"))

# Differenz Vorhersagen
y_hat1 - y_hat2

# Steigungskoeffizient für gender
coef(selects_fit1)

Da wir das Alter konstant halten, entspricht die Differenz der beiden Vorhersagewerte dem Steigungskoeffizienten für gender.


  1. Erstelle eine neue Variable alter_monate = 12 * alter, welche das Alter einer Person in Monaten angibt und füge diese als Prädiktor zur in Aufgabe 2a) geschätzten Regression hinzu. Betrachte alle geschätzten Parameter. Was fällt dir auf?
df_selects19 <- df_selects19 %>%
  mutate(alter_monate = 12 * alter)

coef(lm(leftright ~ alter + gender + alter_monate, data = df_selects19))

R setzt den Steigungskoeffizienten für alter_monate auf NA. Dies liegt daran, dass alter_monate eine Lineartransformation von alter darstellt. Sind zwei Prädiktoren perfekt linear voneinander abhängig (perfekte Kollinearität), muss einer der beiden entfernt werden, um die Regression schätzen zu können. Dies deshalb, weil die Regression bei perfekt korrelierten Variablen den Beitrag einer bestimmten Variable zur Variation in y nicht isolieren kann. Wenn dasselbe Merkmal in zwei verschiedenen Masseinheiten (z.B. Temparatur in Celsius oder Fahrenheit) in einem Datensatz enthalten ist, muss eine der beiden Variablen entfernt werden, da Einheitsumrechnungen in der Regel lineare Transformationen darstellen.

11.3 Aufgabe 3

Wir vermuten, dass der Geschlechterunterscheid bei der politischen Selbsteinschätzung vom Alter abhängt. Insbesondere vermuten wir, dass dieser Unterschied bei jungen Stimmbürger:innen stärker ausfällt als bei den übrigen Altersguppen.

  1. Schätze eine multiple lineare Regression welche der oben aufgestellten Hypothese Rechnung trägt. Interpretiere alle geschätzten Koeffizienten.

Um die vorangestellte Hypothese zu modellieren fügen wir der in Aufgabe 2a) geschätzten Regression einen Interaktionsterm zwischen alter und gender hinzu. In R können wir dazu den Befehl lm(Y ~ X1 * X2, data = ...) verwenden. Die beiden Hauptterme werden automatisch hinzugefügt.

# Geben wir nur den Interaktionsterm alter * gender an, werden die beiden
# Hauptterme automatisch hinzugefügt
selects_fit2 <- lm(leftright ~ alter * gender, data = df_selects19)
coef(selects_fit2)

# Alternativ könnten wir schreiben
#lm(leftright ~ alter + gender + alter:gender, data = df_selects19)
  • (Intercept) gibt den durchschnittlichen Skalenwert für einen 0-jährigen Mann an. Die Interpretation dieses Wertes ist wiederum bedeutungslos, da im Datensatz keine 0-jährigen Personen enthalten sind (Extrapolation).

  • alter: Steigt das Alter um ein Jahr, steigt der durchschnittliche Skalenwert für Männer um ca. r round(coef(selects_fit2)[2],2) Einheiten, ceteris paribus.

  • genderFemale: Für eine 0-jährige Frau ist der durchschnittliche Skalenwert um ca. r abs(round(coef(selects_fit2)[3],2)) Skalenpunkte tiefer als für einen 0-jährigen Mann, ceteris paribus. Beachte, dass die Interpretation dieses Wertes aufgrund der Extrapolation bedeutungslos ist.

  • alter:genderFemale: Der Effekt von alter auf die Selbsteinschätzung ist für Frauen um rund r round(coef(selects_fit2)[4],3) Skalenpunkte stärker als für Männer.


  1. Betrachte noch einmal die in Aufgabe 3a) geschätzte Regression: Was ist der Effekt des Alters auf die politische Selbsteinschätzung für Frauen?

Zunächst notieren wir die Regressionsgleichung der Aufgabe 3a). \[ \text{leftright}= \alpha + \beta_1 \cdot \text{alter} + \beta_2 \cdot \text{genderFemale} + \beta_3 \cdot \text{alter} \cdot \text{genderFemale} \tag{11.1}\]

Da wir den Alterseffekt für Frauen suchen, setzen wir für \(\text{genderFemale}\) eine 1 ein. \[ \text{leftright}= \alpha + \beta_1 \cdot \text{alter} + \beta_2 \cdot 1 + \beta_3 \cdot \text{alter} \cdot 1 \tag{11.2}\]

Wir fassen die Terme, welche mit \(\text{alter}\) multipliziert werden zusammen. \[ \text{leftright} = \underbrace{\alpha + \beta_2}_{\textrm{Achsenabschnitt}} + \underbrace{(\beta_1 + \beta_3)}_{\textrm{Steigung}} \cdot \text{alter} \tag{11.3}\]

Damit wird sichtbar, dass der Alterseffekt (bzw. die Steigung) für Frauen der Summe von \(\beta_1\) und \(\beta_3\) entspricht. Wenn wir die beiden Koeffizienten addieren, erhalten wir entsprechend einen gerundeten Alterseffekt von r round(coef(selects_fit2)[2],3) + r round(coef(selects_fit2)[4],3) = r round(coef(selects_fit2)[2],2)+round(coef(selects_fit2)[4],3). Für Männer beträgt der Effekt derweil r round(coef(selects_fit2)[2],3), da sich die Steigung zu \(\beta_1\) vereinfacht, wenn wir für \(\text{genderFemale}\) 0 statt 1 einsetzen.

  1. Visualisiere nun den Interaktionseffekt mit alter auf der x- und den vohergesagten Werten von leftright auf der y-Achse. Verwende dazu die Funktion plot_model() aus dem sjPlot-Package: plot_model(fit, type = "int", se = FALSE, ci.lvl = FALSE), wobei fit dein geschätztes Modell darstellt und wir mit type = "int" angeben, dass wir einen Interaktionseffekt visualisieren wollen. Vergiss nicht das sjPlot-Package vorgängig zu installieren und zu laden.
# Roher Plot mit plot_model()
plot_model(selects_fit2, type = "int", se = FALSE, ci.lvl = FALSE)
# Falls ihr eine veraltete Version des Packages sjPlot habt, müsst ihr allenfalls
# ci.lvl = NA schreiben, um das Konfidenzintervall auszublenden
# Den Plot können wir etwas schöner gestalten, indem wir zusätzliche Layer hinzufügen
plot_model(selects_fit2, type = "int", se = FALSE, ci.lvl = FALSE) +
  theme_bw() + # weisser statt grauer Hintergrund
  labs(x = "Alter", y = "Vorhergesagter Wert leftright", color = "Gender",
       title = "") # angepasste Achsenbezeichnungen ohne Titel

Wir können erkennen, dass Frauen sich selbst tatsächlich durchschnittlich linker einschätzen als Männer. Zudem scheint dieser Unterschied für junge Altersgruppen deutlich grösser zu sein als für ältere.

  1. Erstelle nun eine neue Variable alter_cat, welche alter in die folgenden Kategorien unterteilt: 18-34, 35-54, 55-74, 75+. Berechne für jede Altersgruppe die Mittelwertdifferenz von leftright zwischen den Geschlechtern. Optional: Stelle diese Differenzen in einem Balkendiagramm dar. Hinweis: Für diese Aufgabe könnte u.a. die Funktion pivot_wider() hilfreich sein.
# Erstelle neue Variable für Alterskategorie
df_selects19 <- df_selects19 %>% 
  mutate(alter_cat = case_when(alter <= 34 ~ "18-34", 
                             alter > 34 & alter < 55 ~ "35-54",
                             alter > 54 & alter < 75 ~ "55-74",
                             alter >= 75 ~ "75+"))
df_selects19 %>% 
  group_by(alter_cat, gender) %>% 
  summarize(mu = mean(leftright, na.rm = TRUE)) %>% 
  # Mit pivot_wider() erstellen wir zwei neue Variablen für Female und Male,
  # welche die jeweiligen Werte von mu pro Alterskategorie annehmen. Somit sind
  # die Werte für die Alterskategorie nun einzigartig und wir können die Differenzen
  # zwischen den Geschlechtern einfacher berechnen.
  pivot_wider(names_from = gender, values_from = mu) %>%
  mutate(mu_diff = Male - Female) %>% 
  ggplot(aes(x = alter_cat, y = mu_diff)) +
  geom_col(width = 0.5, fill = "#0028A5") +
  theme_bw() +
  labs(x = "Alterkategorie", y = "Mittelwertdifferenz")

Diese simple deskriptive Analyse bestätigt unser vorhin erhaltenes Resultat.

?

Lernuhr
Uhrzeit
Lerntimer