12 Übung 5 Lösung
rm(list = ls())12.1 Aufgabe 1
In dieser Übung ist die politische Selbsteinschätzung (leftright) auf einer Skala von 0 (links) bis 10 (rechts) unsere abhängige Variable. Wir behandeln diese wie letzte Woche als kontinuierlich. Um diese wie in Übung 4 adäquat zu recodieren, kannst du den folgenden Code verwenden: df <- df %>% mutate(leftright = as.numeric(case_when(leftright == "0 - Left" ~ "0", leftright == "10 - Right" ~ "10", T ~ leftright))), wobei df der Objektname des eingelesenen Datensatz ist.
- Die Variable
anteil_landwirtschaftgibt den Anteil (in %) der in der Landwirtschaft tätigen Personen an der gesamten Erwerbsbevölkerung pro Kanton an. Diese verwenden wir als Proxyvariable für den Urbanisierungsgrad eines Kantons. Regressiere in einem ersten Schrittleftright(abhängige Variable) aufanteil_landwirtschaftund interpretiere den geschätzten Steigungsparameter, um den Zusammenhang zwischen der Ländlichkeit eines Kantons und der politischen Selbstpositionierung der Befragten abzubilden.
#| message: false
# Packages laden
pacman::p_load("sjPlot", "texreg", "haven", "readr", "readxl", "fixest", "MASS", "glm.predict", "scales", "tidyverse")
load("df_selects19.RData")
# Recodiere leftright zu numerischer Variable
df_selects19 <- df_selects19 %>%
mutate(
leftright = as.numeric(case_when(
leftright == "0 - Left" ~ "0",
leftright == "10 - Right" ~ "10",
T ~ leftright))
)
# Einfache lineare Regression
lm(leftright ~ anteil_landwirtschaft, data = df_selects19)Steigt der Anteil der in der Landwirtschaft tätigen Personen um einen Prozentpunkt, steigt der durchschnittliche Skalenwert um knapp 0.1 Einheiten. Personen, welche in ländlichen Kantonen wahlberechtigt sind, scheinen im Durchschnitt rechter zu sein als solche, welche in urbanen Kantonen wahlberechtigt sind.
- Deine Kollegin meint, dass der Generationenunterschied in der politischen Selbsteinschätzung auf dem Land geringer ist als in urbanen Regionen. Während junge Stimmbürger:innen in urbanen Kantonen deutlich linker seien als ältere, soll dieser Unterschied auf dem Land weniger stark ausgeprägt sein. Überprüfe diese Hypothese durch eine geeignete lineare Regression. Interpretiere alle geschätzten Parameter. Überlege dir zusätzlich, bei welchen der soeben betrachteten Koeffizienten die Interpretation sinnvoll ist und ob die Hypothese deiner Kollegin zutreffend ist.
Interaktionsterm: wenn der Effekt einer Variable X1 auf Y vom Wert einer ander anderen Variable X2 abhängt. (Der Effekt des Alters auf leftright ist also nicht fix, sondern variiert je nach Ländlichkeit der Gemeinde.)
# Lineare Regression mit Interaktion
selects_fit1 <- lm(leftright ~ alter * anteil_landwirtschaft, data = df_selects19)
coef(selects_fit1)Der geschätzte negative Koeffizient für den Interaktionsterm ist mit der aufgestellten Hypothese vereinbar, der Effekt ist jedoch klein: steigt der Anteil der Landwirtschaft um einen Prozentpunkt, sinkt der Effekt des Alters auf die politische Selbsteinschätzung durchschnittlich um 0.001 Einheiten. Die übrigen Koeffizienten (oder: Parameter) können wie folgt interpretiert werden:
(Intercept): Durchschnittlicher Skalenwert für eine 0-jährige Person, welche in einem Kanton mit einem Anteil der in der Landwirtschaft tätigen Personen von 0 % stimmberechtigt ist.alter: Für eine in einem Kanton mit einem Anteil der in der Landwirtschaft tätigen Personen von 0 % wohnhaften Person gilt: Eine Erhöhung des Alters um ein Jahr ist mit einer durchschnittlichen Erhöhung der politischen Selbsteinschätzung um ca. 0.02 Skalenpunkte assoziiert.anteil_landwirtschaft: Für eine 0-jährige Person gilt: Eine Erhöhung der in der Landwirtschaft tätigen Personen um einen Prozentpunkt ist mit einer durchschnittlichen Erhöhung der politischen Selbsteinschätzung um ca. 0.18 Skalenpunkte assoziiert.
Da im Datensatz weder Kantone mit einem Anteil der in der Landwirtschaft tätigen Personen von 0 % noch 0-jährige Personen enthalten sind, ist nur die Interpretation des Koeffizienten des Interaktionsterms (alter:anteil_landwirtschaft) unmittelbar sinnvoll.
- Vergleiche die marginalen Effekte des Alters auf die politische Selbsteinschätzung einer Person im Kanton Basel Stadt mit einer Person im Kanton Appenzell Innerrhoden basierend auf dem in 1 b) geschätzten Modell.
Wir erhalten den marginalen Effekt des Alters, indem wir die Regressionsgleichung partiell nach der Altersvariablen ableiten:
Marginaler Effekt: Um wie viel ändert sich Y, wenn X1 um eine Einheit steigt, gegeben alles andere bleibt konstant?
–> Bei Interaktion ist das eine Funktion!! (der marginale Effekt variiert also je nach dem X2)
\[\begin{align} \text{leftright}&=\alpha+\beta_1\text{alter}+\beta_2\text{anteil\_landwirtschaft}+\beta_3(\text{alter}\times\text{anteil\_landwirtschaft})+e\\ \frac{\partial\text{leftright}}{\partial\text{alter}}&=\beta_1+\beta_3\text{anteil\_landwirtschaft} \end{align}\]
Der Anteil der in der Landwirtschaft tätigen Personen im Kanton Basel Stadt beträgt ca. r round(min(df_selects19$anteil_landwirtschaft), 3) %, während jener im Kanton Appenzell Innerrhoden mit rund r round(max(df_selects19$anteil_landwirtschaft), 3) % deutlich höher ist. Um die marginalen Effekte für die beiden Kantone zu berechnen, setzen wir diese Werte in (2) ein.
Basel Stadt: \(0.023-0.002\cdot0.049\approx0.023\)
Appenzell Innerrhoden: \(0.023-0.002\cdot11.315\approx0.0004\)
Für das ländliche Appenzell Innerhoden ist der marginale Effekt des Alters deutlich schwächer wie für die urbane Stadt Basel—die Selbstpositionierung ändert sich über das Alter mehr in Basel denn in Appenzell.
- Vergleiche nun die vorhergesagten Skalenwerte zweier im Kanton Basel Stadt stimmberechtigten Personen: Die eine ist 20 Jahre alt, und die andere ist 80 Jahre alt. Wiederhole den Vergleich für zwei Stimmberechtigte im Kanton Appenzell desselben Alters.
# 20-jährige Baslerin
yhat_20_bs <- predict(selects_fit1, newdata = data.frame(alter = 20,
anteil_landwirtschaft = 0.05))
# 80-jähriger Basler
yhat_80_bs <- predict(selects_fit1, newdata = data.frame(alter = 80,
anteil_landwirtschaft = 0.05))
# Differenz Basel Stadt
yhat_80_bs - yhat_20_bs
# 20-jähriger Appenzell Innerrhoder
yhat_20_ai <- predict(selects_fit1, newdata = data.frame(alter = 20,
anteil_landwirtschaft = 11.32))
# 80-jährige Appenzell Innerrhoderin
yhat_80_ai <- predict(selects_fit1, newdata = data.frame(alter = 80,
anteil_landwirtschaft = 11.32))
# Differenz Appenzell Innerhoden
yhat_80_ai - yhat_20_aiWir sehen, dass der 80-jährige Basler um rund r round(yhat_80_bs - yhat_20_bs, 2) Skalenpunkte rechter ist als der 20-jährige Basler. Demgegenüber ist die 80-jährige Appenzellerin nur um rund r round(yhat_80_ai - yhat_20_ai, 2) Skalenpunkte rechter als die 20-jährige Appenzellerin.
- Die in den Teilaufgaben 1 c) und 1 d) berechneten Werte sind mit Vorsicht zu geniessen. Weshalb?
Die hier geschätzten Regressionsmodelle sind rein deskriptiver Natur und erlauben keine kausalen Schlussfolgerungen. Insbesondere kann aus dem geschätzten Zusammenhang zwischen dem Anteil der in der Landwirtschaft tätigen Personen und der politischen Selbsteinschätzung nicht geschlossen werden, dass die Ländlichkeit eines Kantons die politische Einstellung (oder den Alterseffekt auf diese Einstellung) kausal beeinflusst. Ein zentrales Problem ist Confounding sowie mögliche Selbstselektion: Personen mit bestimmten politischen Präferenzen könnten sich gezielt für einen Wohnort in urbanen bzw. ländlichen Regionen entscheiden. Dadurch wäre der beobachtete Zusammenhang nicht auf einen Effekt der Ländlichkeit zurückzuführen, sondern auf systematische Unterschiede zwischen den Personen, die in unterschiedlichen Kantonen leben. Um einen kausalen Effekt der Ländlichkeit identifizieren zu können, bräuchte es exogene Variation in der Wohnortzuweisung (z.B. durch ein Experiment oder ein natürliches Experiment) oder ein Forschungsdesign, das Confounding glaubwürdig ausschliessen kann.
Dazu kommt, dass kein anderer Kanton einen so hohen Anteil der in der Landwirtschaft tätigen Personen wie Appenzell Innerrhoden aufweist. Zusätzlich ist die Anzahl befragter Personen aus dem Kanton sehr gering r sum(df_selects19$Kanton == "Appenzell Innerrhoden") Personen. Das bedeutet, dass der geschätzte marginale Effekt des Alters in Appenzell Innerrhoden nur auf sehr wenigen Beobachtungen beruht, was unser Vertrauen in diesen Schätzwert schmälert. Anhand der Verteilung von anteil_landwirtschaft in unserem Datensatz können wir dieses Problem gut erkennen:
df_selects19 %>%
ggplot(aes(x = anteil_landwirtschaft)) +
geom_histogram(binwidth = 0.8, fill = "darkblue", color = "white") +
theme_bw() +
labs(x = "Anteil der in der Landwirtschaft Beschäftigten",
y = "Anzahl Befragte")- Stelle nun den Interaktionseffekt des Regressionsmodells mit Hilfe der Funktion
plot_model()aus demsjPlot-Packet dar:plot_model(fit, type = "int", se = FALSE, ci.lvl = FALSE). Wie gehtplot_model()damit um, dass zwei kontinuierliche Variablen miteinander interagiert werden?
# Wenn wir die Ästhetik des Plots anpassen möchten, können wir zur Grundfunktion
# "plot_model" mit dem "+" ggplot-layer hinzufügen
plot_model(selects_fit1, type = "int", se = FALSE, ci.lvl = FALSE) +
theme_bw() +
labs(x = "Alter", y = "Politische Selbsteinschätzung",
color = "Anteil Landwirtschaft (%)",
title = "")plot_model() stellt den Effekt analog zu unserem Vorgehen in 1 c) dar. alter wird auf der x-Achse abgebildet und dessen marginaler Effekt auf leftright jeweils für den minimalen und maximalen Wert von anteil_landwirtschaft dargestellt. Geben wir in der Spezifikation der Formel in lm() zuerst anteil_landwirtschaft an, wird stattdessen anteil_landwirtschaft auf der x-Achse abgebildet und dessen marginaler Effekt auf leftright jeweils für den minimalen und maximalen Wert von alter dargestellt. Die vorhergesagten Werte unterscheiden sich insbesondere am unteren Ende der jeweils horizontalen Achse stark.
lm(leftright ~ anteil_landwirtschaft * alter, data = df_selects19) %>%
plot_model(type = "int", se = FALSE, ci.lvl = FALSE) +
theme_bw() +
labs(x = "Anteil Landwirtschaft (%)", y = "leftright", color = "Alter",
title = "")Zusatz: Wenn wir den marginalen Effekt des Landwirtschaftsanteils für bestimmte Alterswerte (statt dem Minimum und dem Maximum) darstellen möchten, können wir folgenden Code verwenden.
–> das machen wir mit type = “pred”. So können wir selbst gewählte Werte des Moderators angeben (hier 18, 40 und 65 Jahre) anstatt nur Min/Max
# Wir passen den Parameter "type" an und spezifizieren zusätzlich die Werte,
# welche wir darstellen möchten
lm(leftright ~ anteil_landwirtschaft * alter, data = df_selects19) %>%
plot_model(type = "pred", se = FALSE, ci.lvl = FALSE,
terms = c("anteil_landwirtschaft", "alter[18, 40, 65]")) +
theme_bw() +
labs(x = "Anteil Landwirtschaft (%)", y = "leftright", color = "Alter",
title = "")12.2 Aufgabe 2
Manchmal sind die Zusammenhänge, die wir untersuchen wollen, nicht linear. Im Folgenden betrachten wir den Zusammenhang zwischen dem Alter und der Meinung zur Einführung der Ehe für gleichgeschlechtliche Paare meinung_gleichgeschlechtliche_ehe.1 Es könnte sein, dass die Zustimmung hierzu in höherem Alter schneller abnimmt als in jüngerem Alter.
- Wir behandeln
meinung_gleichgeschlechtliche_eheals stetige Variable. Recodiere diese, sodass diese Werte auf einer Skala von 1 (stark dagegen) bis 5 (stark dafür) annimmt.
T ~ NA_real: stellt sicher, dass die neue Variable numerisch ist.
df_selects19 %>% count(meinung_gleichgeschlechtliche_ehe)
df_selects19 <- df_selects19 %>%
mutate(meinung_gleichgeschlechtliche_ehe =
case_when(meinung_gleichgeschlechtliche_ehe == "Strongly against" ~ 1,
meinung_gleichgeschlechtliche_ehe == "Rather against" ~ 2,
meinung_gleichgeschlechtliche_ehe == "Neither nor" ~ 3,
meinung_gleichgeschlechtliche_ehe == "Rather in favor" ~ 4,
meinung_gleichgeschlechtliche_ehe == "Strongly in favor" ~ 5,
T ~ NA_real_)) # beachte, dass die Variable NAs enthält!- Schätze eine lineare Regression mit
meinung_gleichgeschlechtliche_eheals abhängiger undalterals unabhängiger Variable. Füge dieser Regression einen quadratischen Term füralterhinzu. Beachte, dass du dafür in der Formel zwingend die Inhibit-FunktionI()verwenden musst:I(alter^2). Was ist der marginale Effekt des Alters?
Was die Interaktion mit sich selbst konkret bedeutet: Die Ablehnung der Ehe für alle nimmt mit dem Alter schneller zu: d.h. der Alterseffekt ist nicht konstant, sondern verstärkt sich. -> nicht-linearer Zusammenhang, den eine einfache Gerade nicht abbilden kann.
selects_fit4 <- lm(meinung_gleichgeschlechtliche_ehe ~ alter + I(alter^2), data = df_selects19)
summary(selects_fit4)Wir schätzen die folgende lineare Regression, wobei mge die Meinung zur Öffnung der Ehe für gleichgeschlechtliche Paare ist:
\[\text{mge}=\alpha+\beta_1\text{alter}+\beta_2\text{alter}^2+\varepsilon\tag{4}\]
Beachte, dass die Interpretation von \(\hat{\beta}_1\) als ceteris paribus Effekt logisch unsinnig ist, da eine Veränderung in alter äquivalent zu einer Veränderung in \(\text{alter}^2\) ist. Den marginalen Effekt des Alters erhalten wir, indem wir (4) nach alter ableiten:
\[\frac{d\text{mge}}{d\text{alter}}=\beta_1+2\cdot\beta_2\cdot\text{alter}\tag{5}\]
Aufgrund von (5) sehen wir die durch das Hinzufügen von \(\text{alter}^2\) als zweiter Prädiktor hinzugefügte Nicht-Linearität: Der marginale Effekt des Alters hängt davon ab, wie alt eine Person ist. Beispielweise beträgt dieser für eine 20-jährige Person rund r round(coef(selects_fit4)[2] + 2 * coef(selects_fit4)[3] * 20, 3), während er für eine 80-jährige Person mit etwa r round(coef(selects_fit4)[2] + 2 * coef(selects_fit4)[3] * 80, 3) absolut gesehen etwas stärker ist. Dies liegt am negativen Vorzeichen von \(\hat{\beta}_2\): die in (4) berechnete Funktion ist konkav.
Konkav: b2 < 0 –> Funktion ist konkav (sie wölbt sich nach unten): die Kurve fällt mir zunehmenden Alter (Zustimmung für unser y, Ehe für alle, sinkt) und sie fällt immer steiler (der negative Effekt verstärkt sich)
- Stelle nun den Zusammenhang zwischen
alterundmeinung_gleichgeschlechttliche_ehein einem Streudiagramm dar. Da es sich beimeinung_gleichgeschlechttliche_ehestrenggenommen um eine diskrete Variable handelt, kannst dugeom_point(position = "jitter")verwenden. Damit wird zur Position jedes Punktes eine geringe Menge zufälliger Variation hinzugefügt, was verhindert, dass die Punkte auf 5 horizontalen Linien zu liegen kommen. Füge dieser Punktewolke die in 2 b) geschätzte Regression hinzu.2
df_selects19 %>%
ggplot(aes(x = alter, y = meinung_gleichgeschlechtliche_ehe)) +
geom_point(position = "jitter") +
geom_smooth(formula = y ~ x + I(x^2), method = "lm", color = "red",
linewidth = 1.75, se = FALSE) +
theme_bw() +
labs(x = "Alter", y = "Meinung gleichgeschlechtliche Ehe (1-5)")
# Wie Warnmeldung sagt uns hier lediglich, dass die 23 Observationen mit NA automatisch entfernt wurden (weil nicht darstellbar). Wir können diese Warnmeldung unterdrücken, indem wir die Beobachtungen mit NA vorgängig entfernen (bspw. mit drop_na(meinung_gleichgeschlechtliche_ehe))wichtig bei geom_smooth() mit Interaktionen: bei formula = y ~ x + I (x^2) angeben! (sonst wäre der default einfach eine lineare Regression!)
Anhand der erstellten Grafik können wir die Nicht-Linearität der geschätzten Funktion gut erkennen. Für zunehmende Werte von alter, nimmt der negative Effekt von alter auf meinung_gleichgeschlechtliche_ehe zu (d.h. die Steigung wird stärker negativ).
12.3 Aufgabe 3
- Schätze nun eine multiple lineare Regression ohne Interaktion, welche
leftrightdurch die beiden Prädiktorenalterundgendererklärt. Interpretiere den Koeffizienten für die Altersvariable.
selects_fit2 <- lm(leftright ~ alter + gender, data = df_selects19)
coef(selects_fit2)Eine Erhöhung des Alters um ein Jahr ist, ceteris paribus, mit einer Erhöhung des durchschnittlichen Links-Rechts Skalenwerts um ca. 0.019 Einheiten assoziiert. Je älter eine Person ist, desto rechter ist sie.
- Was ist der \(R^2\)-Wert der in 3 a) geschätzten Regression? Wie interpretierst du diesen Wert? Tipp: Verwende dazu
summary(fit), wobeifitdein geschätztes Modell darstellt.
R-Squared: misst den Anteil der Varianz in Y, der durch das Modell erklärt wird
summary(selects_fit2)
# mit $r.squared erhalten wir nur den R^2-Wert des summary-Outputs
summary(selects_fit2)$r.squaredDurch das geschätzte Modell können wir nur ca. 3 % der Varianz in der politischen Selbsteinschätzung erklären.
- (herausfordernd) Füge dem Selects-Datensatz nun eine simulierte Variable
var_simhinzu, welche normalverteilt ist mit Mittelwert 3 und Varianz 9. Verwende dazu einenseedvon1. Füge diese neue Variable anschliessend dem Regressionsmodell aus 3 a) hinzu. Verwende die Funktionscreenreg()aus dem Packagetexregund vergleiche die \(R^2\)- sowie die angepassten \(R^2\)-Werte zwischen dem hier und in 3 a) geschätzten Modellen. Beachte, dass wir die geschätzten Modelle mitlist(fit1, fit2)zusammenfügen müssen, dascreenreg()als erstes Argument eine Liste erwartet. Verwende das zusätzliche Argumentdigits = 5, um die Werte besser vergleichen zu können. Was fällt dir auf?
set.seed(1)
df_selects19 <- df_selects19 %>%
mutate(var_sim = rnorm(n = nrow(df_selects19), mean = 3, sd = 3))
# beachte, dass die Länge des generierten Vektors der Anzahl Zeilen in
# df_selects19 entsprechen muss
selects_fit3 <- lm(leftright ~ alter + gender + var_sim, data = df_selects19)
screenreg(list(selects_fit2, selects_fit3), digits = 5)
# Hinweis für Forschungsarbeiten:
wordreg(list(selects_fit2, selects_fit3), digits = 5, file = "regtable.docx")Wir können erkennen, dass der \(R^2\)-Wert für die Regression, welche die zufällig generierte Variable var_sim enthält, einen leicht höheren \(R^2\)-Wert aufweist, als die Regression ohne var_sim. Fügen wir einem Regressionsmodell mit \(p\) Prädiktoren \(k\) weitere Prädiktoren hinzu, wird die erklärte Varianz \(SSR=\sum_{i=1}^n(\hat{Y}_i-\hat{Y})^2\) des Modells mit \(p+k\) Prädiktoren niemals kleiner sein als \(SSR\) für das Modell mit \(p\) Prädiktoren. Daher wird der Determinationskoeffizient \(R^2\) immer ansteigen (oder gleich bleiben), wenn wir einem Modell weitere Prädiktoren hinzufügen, selbst wenn diese wie var_sim völlig zufällige Werte enthalten.
Im Gegensatz zum \(R^2\) hängt das angepasste \(R^2\) (engl. adjusted \(R^2\)) von der Anzahl Prädiktoren in einem Modell ab und bestraft das Hinzufügen von Prädiktoren, welche nicht mit der abhängigen Variable zusammenhängen. Dementsprechend sehen wir, dass das angepasste \(R^2\) für das Modell, welches var_sim als zusätzlichen Prädiktor enthält etwas geringer ist wie für das Modell ohne var_sim.
mit r-Squared: jede neue Variable gibt dem Modell einen zusätzlichen Freiheitsgrad, um sich den Daten anzupassen (selbst eine Zufallsvariable wie var_sim passt zufällig ein kleines bisschen9
–> die erklärte Varianz kann durch Hinzufügen von Prädiktoren nie sinken
–> Adj. r-squared korrigiert dies durch die Freiheitsgrade (n-p-1): je mehr Prädiktoren p, desto grösser der Nenner (das “bestraft” unnötige Variablen)