pacman::p_load("sjPlot", "texreg", "haven", "readr", "readxl", "fixest", "MASS",
"glm.predict", "scales", "tidyverse")2 R Code
Inhaltsverzeichnis
- 3 Packete laden
- 4 Grundsätzliche zur R Syntax
- 5 Hilfsfunktionen in R
- 6 Daten filtern in R
- 7 Daten betrachten
- 8 Datensätze bearbeiten
- 9 Eigenes Dateframe erstellen
- 10 Mittelwert und Standardabweichung berechnen
- 11 Konfidenzintervall aus Regression ziehen
- 12 Wissenschaftliche Notation umwandeln
- 13 Prozentsätze und Perzentile
- 14 Datensätze zusammenklebben
- 15 Diagramme erstellen
- 16 Statistische Tests
- 17 Lineare Regressionsanalyse
- 18 R^2 in R berechnen
- 19 Mittelwertsvergleich
- 20 Visualisierung von Linearen Regressionen/Interaktionen
- 21 Feols: Fixed effect models mit panel daten
- 22 Funktionen in R schreiben (passives Verständnis)
- 23 For-Schleifen in R (passives Verständnis)
- 24 GLM in R (logit / probit)
3 Packete laden
3.1 Packete Aktivieren
library(tidyverse)
# Beispiel mit Tidyverse3.2 Daten einlesen
df_xy = read.table(choose.files(), sep = ";")
# wenn unklar ist, welche Art von Daten vorhanden sind
# sep = definieren, wie Daten getrennt sind
df_xy = read.table(choose.files(), sep = ",", header = TRUE)
# wenn man die oberste Spalte entfernnen will
#c csv. einlesen (andere Option)
read.csv(choose.files()) 3.3 RData einlesen
load("beispiel.dokument")3.4 .tab einlesen
read_tsv("example.tab")3.4.1 Daten ohne “choose.files()” einlesen
dataset = read.csv("ordner/name das dokument")4 Grundsätzliche zur R Syntax
== #gleich
!= #nicht gleich
| #oder
< # grösser als
> # kleiner als
#Größer oder gleich:
>=
#Kleiner oder gleich:
<=
# Pipe Operator
%>%
? #wenn Probleme, Fragezeichen vor Funktion setzen5 Hilfsfunktionen in R
count() # Zählt
levels() # zeigt Kategorien der Variablen
class() # Zeigt Datentyp z.B. ob die Variable numerisch ist
factors() #erstellt kategorische Variablen6 Daten filtern in R
%in%%in% bedeutet in r “ist Element von” “. Wir können damit prüfen ob ein Wert in einem Set an Möglichkeiten enthalten ist.
==
== bedeutet in r “ist gleich”. Wir können damit einen Wert mit genau einem anderen Wert vergleichen
6.0.1 Daten speichern
saveRDS #<- zum Daten speichern!!
#immer zuerst dataframe, dann wie es gespeichert werden soll in ""7 Daten betrachten
head(df_xy, n = x) # mit n = x (irgendeine Zahl), definiere ich wieviele
#Spalten ich anschaue!
# Spalten auswählen
select(df_xy$ssss, df_xy$sss) #mit select kann man das tun
#Kurze Übersicht über Datensatz
glimpse(name_datensatz)7.1 Daten betrachten - Advanced
# Spalten auswählen und nur eine gewissen Anzahl zeilen Ausgeben und neu Speichern
df_neu = df_xy %>% # hier neues Frame
head(n = x) %>% # hier Zeilenanzahl
select(df_xy$ssss, df_xy$ssss) # Hier Spalten, Pipe Operator %>% verbindet
# Daten filtern
df_xy %>% #Datensatz auswählen
filter(ClosenessPopulistParty > 7 & ClosenessPopulistParty < 9) #filter
# fitlerd die Variablen aus nach Werten welche mit "=, <, etc..." festgellegt werden.8 Datensätze bearbeiten
# Variablen zu Datensatz hinzufügen
df_xy = df_xy %>% #Hier wird es gerade gespeichert mit df_xy = df_xy
mutate(variable = "was sie sein soll") # mutate macht neue Variablen
#Variablen von Datensatz entfernen
df_xy = df_xy %>%
select(-z_ScreenTime) #mit dem Minus wird Variable entfernt
#Datensatz bereinigen, duplikate entfernnen
df_male <- df_male %>%
distinct(ID, .keep_all = TRUE) #keep all ganz wichtig, ID kann man ersetzen
#Neue Variable erstellen im Datensatz
df_female = df_female %>%
mutate(Gender = "female") #Speichern & und mutate benutzen!
# Zeilennamen resetten
rownames(df_joined) = NULLDatensatz mit gefilterten Daten nach coditions erstellen
Hier: Beispiel-Code, man muss dass nach Problen anpassen!
df_save = bvg_data_set %>%
filter(case_decision == "dismissed" | case_decision == "upheld") %>%
group_by(judge_party, case_decision) %>%
count() %>%
mutate(n / sum(n)) %>%
filter(case_decision == "dismissed")8.0.1 Zeilen und Spaltennamen ändern
colnames(resultate) <- c("unten", "oben")
rownames(resultate) <- c(1,2,3,4) 8.1 Einzelner Wert aus Datensatz ziehen und abspeichern
x_lugano <- df_co2_exklZH %>%
filter(mun_name == "Lugano") %>%
pull(anzahlStimmberechtigte) #mit pull wird wert gezogen8.1.1 Zufallstichprobe aus Datensatz ziehen
sample_n(dataframe, "Anzahl", replace = False)
# Weight automatisch auf 1, replace kann t oder f sein8.2 Daten recodieren
df_select2019[df_select2019 == "0 - Left"] <- "0"
# Datensatz angeben, dann sagen was zu was rekodiert werden soll!8.2.1 Daten/Variablen numerisch recodieren
df_select2019$leftright <- as.numeric(as.character(df_select2019$leftright))8.2.2 Alle NA aus dem Datensatz löschen (meistens nicht nötig)
df_select2019 <- na.omit(df_select2019)8.2.3 Daten recodieren advanced - alles in einem (mehrere gleichzeitig)
df_selects19 <- df_selects19 %>%
mutate(
leftright = as.numeric(case_when(
leftright == "0 - Left" ~ "0",
leftright == "10 - Right" ~ "10",
T ~ leftright))
)
# Dieser Code macht Daten gleichzeitig numerisch und rekodiert sie!8.3 Kategorien von Daten erstellen
df_select2019 = df_select2019 %>% #Hier wird es gerade gespeichert mit df_xy = df_xy
mutate(alter_cat =
cut(alter,
breaks = c(18, 34, 54, 74, 10000),
labels = c("18-34", "35-54", "55-74", "75+"),
right = FALSE
))8.4 Pivot_wider: aus “langen” Datensätze zu “breiten” Datensätze
pivot_wider(names_from = gender, values_from = Mean)8.5 Pivot_longer: aus “breiten” Datensätze zu “langen” Datensätze
pivot_longer(cols = c(Frau, Mann),
names_to = "Geschlecht",
values_to = "Mean") 8.6 Daten umbennen
rename(Alterssegment = "alter_cat")8.6.1 Daten bearbeiten advanced -> neue Spalte erstellen mit Daten, welche nach Normalverteilung simmuliert werden
csim2 = csim %>%
mutate(x4 = 0.15 * csim$y + rnorm(nrow(csim), mean = 3, sd = 6))
# rnorm = normalverteilung
# mean = mittelwert
# sd = standardabweichung9 Eigenes Dateframe erstellen
tibble(means = resultate.container) # Hier Umwandlung mit bestehenden Objekt
tibble() <- erstellt eigene Dataframes!10 Mittelwert und Standardabweichung berechnen
# Mittelwert und Standardabweichung berechnen
mean(df_xy$z_ScreenTime) #immer eingeben welche Daten!
sd(df_xy$z_ScreenTime)
#Mittelwerte berechnen von zwei Gruppen
df_joined %>%
group_by(Gender) %>%
summarize(mu = mean(ClosenessPopulistParty))11 Konfidenzintervall aus Regression ziehen
confint(lm)
# regression speichern zu vor oder regression direkt in confint() schreiben12 Wissenschaftliche Notation umwandeln
# Wissenschaftliche Notation -> dezimale Notation
format("Deine Zahl", scientific = FALSE)13 Prozentsätze und Perzentile
#Prozentsatz/Anteil berechnen
nrow() / nrow(df_xy) * 100 #gesamter Datensatz auswählen, durch neuer Datensatz mal 100
# 10% Perzentil
perz10 <- quantile(df_male$ScreenTime, probs = 0.1)
perz10 #hier wird die Berechnung gespeichert
# 90% Perzentil
perz90 <- quantile(df_male$ScreenTime, probs = 0.9)
perz90 #hier wird die Berechnung gespeichert
# Höchste Werte
df_male %>%
arrange(desc(ClosenessPopulistParty)) %>%
head(n = 3) #n = 3 definiert, die ersten drei höchsten, n = 4 wäre die höchsten vierte werte!
# Tiefste Werte (ohne desc!)
df_male %>%
arrange(ClosenessPopulistParty) %>%
head(n = 3)13.0.1 Daten in 1000er-Schritten anzeigen
df_co2 <- df_co2 %>%
mutate(anzahlStimmberechtigte = anzahlStimmberechtigte / 1000)14 Datensätze zusammenklebben
Variante 1:
# Datensätze zusammenkleben - DATENSÄtze verbinden
df_joined = df_female %>%
bind_rows(df_male) #df_female und male kann man tauschen Variante 2
df_co2 <- df_co2 %>%
left_join(df_turn, by = c("canton_id", "canton_name", "mun_id", "mun_name"))14.0.1 Übersicht über diverse zusammenklebe-Befehle in R
# Verbinden von Datensätzen über Schlüsselspalten
left_join(): #Alle Zeilen von links, passende von rechts
right_join(): #Alle Zeilen von rechts, passende von links
inner_join(): #Nur Zeilen, die in beiden vorkommen
full_join(): #lle Zeilen aus beiden Tabellen
# Datensätze stumpf zusammenkleben
bind_rows(): #Tabellen untereinander stapeln (gleiche Spalten)
bind_cols(): #Tabellen nebeneinander kleben (gleiche Zeilenanzahl)15 Diagramme erstellen
15.1 Balkendiagramm
ggplot(aes(y = Gender, x = mu)) + #festlegen, was auf x und y Achse ist!
geom_col(width = .2, fill = "blue") + #geom_col = Balkendiagramm
theme_bw() +
labs(y = "Geschlecht", x = "Durchschnittliche Nähe zu pop. Partei")15.2 Streudiagramm
df_joined %>%
ggplot(aes(x = ScreenTime, y = ClosenessPopulistParty, color = Gender)) +
geom_point() + #geom_point = Streudiagramm
scale_color_manual(values = c("male" = "blue4", "female" = "red4"), # Benutzerdefinierte Farben, siehe bspw. https://sape.inf.usi.ch/quick-reference/ggplot2/colour
labels = c("weiblich", "männlich")) +
theme_bw() +
labs(x = "Bildschirmzeit", y = "Nähe zu pop. Partei", color = "Geschlecht")
15.2.1 Balkendiagramm Version Advanced (mit Balken, mit verschiedenen Farben)
df_verworfen %>%
ggplot(aes(x = Prverworfen * 100, y = judge_party, fill = judge_party)) +
geom_col(width = 0.5) +
scale_fill_manual(values = c("BDP" = "#E6C820", "FDP" = "blue",
"GLP" = "#C4C43D", "GPS" = "#84B547",
"Mitte" = "#D6862B", "SP" = "skyblue",
"SVP" = "#4B8A3E")) +
theme_bw() +
theme(legend.position = "none") +
labs(x = "Anteil verworfener Fälle", y = "Parteizugehörigkeit") +
xlim(0,100)15.3 Säulendiagramm
ggplot(Plot1, aes(fill = Geschlecht, x = Alterssegment, y = Mean)) +
geom_col(position = position_dodge()) +
theme(legend.position = "none") + scale_fill_manual(values = c("Frau" = "#E6C820", "Mann" = "blue"
)) +
theme_dark() +
labs(x = "Alter", y = "Mittelwert Links-Rechts")15.4 Histogramm
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")15.4.1 Histogramm mit Base R
h_1 <- hist(resultate.container2, plot = FALSE)
plot(h_1)
#plot = False, tut es nicht direkt plotten15.5 Boxplot mit ggplot
guns %>%
ggplot(aes(x = factor(stateid), y = vio)) + geom_boxplot() + theme_minimal()15.6 Liniengraph
15.6.0.1 GGPlot berechnet Werte
datensatz %>%
ggplot(aes(x = time, y = variable, color = gruppe)) +
geom_vline(xintercep = 0, linetype = "dashed") +
stat_summary(fun = "mean", geom = "lime") + theme_bw()15.6.0.2 Werte von Hand berechnen
#Möglichkeit 1: Werte händisch berechnen
df_postage %>%
#gruppieren nach Zeit und Gruppe
group_by(group, time) %>%
#durchschnittliche Abweichung für jeden Zeitpunkt pro Gruppe berechnen
summarize(mean_diff = mean(turnout_diff, na.rm = T)) %>%
#gruppieren um beide linien darstellen zu können
ggplot(aes(x = time, y = mean_diff,
color = group)) +
#vertikale Linie für Zeitpunkt 0
geom_vline(xintercept = 0, linetype= "dashed") +
#trend darstellen
geom_point() +
geom_smooth(se = F) +
theme_bw()15.6.1 Streudiagramm mit eingebauter Regressionsanalyse
Variante 1:
# Schritt 1: Streudiagramm erstellen und abspeichern
plot_a <- df_co2 %>%
ggplot(aes(x = Proz_Agric, y = stimmbeteiligungInProzent)) +
geom_point()
plot_a
# Schritt 2: Lineare Regressions hinzufügen
plot_b <- plot_a +
geom_abline(slope = co2_fit1$coefficients[2], intercept = co2_fit1$coefficients[1],
color = "red")
plot_bDie Lineare Regressions muss vorher definiert und gespeichert werden.
Variante 2: (alles in einem)
df_co2 %>%
ggplot(aes(x = Proz_Agric, y = stimmbeteiligungInProzent)) +
geom_point(size = .8, color = "#0028A5") +
geom_smooth(method = "lm", formula = y ~ x, se = FALSE, color = "#FF3333", # mit geom_smooth können wir Analyse direkt machen!
linewidth = .5) +
geom_hline(aes(yintercept = mean(stimmbeteiligungInProzent)),
linetype = "dashed", linewidth = 1, color = "magenta") +
geom_vline(aes(xintercept = mean(Proz_Agric)),
linetype = "dashed", linewidth = 1, color = "magenta") +
theme_bw() +
labs(x = "Anteil Landwirtschaftsfläche (in %)", y = "Stimmbeteiligung (in %)")15.6.2 Mittelwerte von Variablen als geraden in Streudiagramm darstellen
plot_c <- plot_b +
geom_hline(yintercept = mean(df_co2$stimmbeteiligungInProzent)) +
geom_vline(xintercept = mean(df_co2$Proz_Agric))
plot_c
# hier wird zum diagramm die beiden Linien hinzugefügt, das Diagramm wird vorher definiert15.6.3 Standardfehler in Diagramm anzeigen
m2 = m1 + geom_ribbon(
aes(ymin = upper, ymax = lower), #ymin & ymax = boundaries
fill = "red",
alpha = 0.2 # alpha verändert dicke des bandes
)
m215.7 Coplot: Zwei Diagramme nebeinander vergleichen
library(cowplot)
plot_grid(streu1, streu2, ncol = 1) #nccol steuert das Layout, wie viele Spalten, wie viele Zeilen?, wenn ncol = 1, alles untereindander
# Man muss die Diagramme vorher abspeichern!!15.7.0.1 Farbcodes in R

16 Statistische Tests
16.1 Nachvolziehbarkeit beim Rechnen
set.seed(1) #Zahl steht evtl. auf Aufgabe16.2 Zweistichproben t-test
Den Zwei-Stichproben-t-Test verwendet man, um zu prüfen, ob sich die Mittelwerte von zwei unabhängigen Gruppen signifikant unterscheiden 📊. Voraussetzung ist, dass die Daten metrisch sind und ungefähr normalverteilt vorliegen.
t.test(ScreenTime ~ Gender, data = df_joined) #Screen Time und Gender wird vergliche,
#data sagt, von wo Daten kommen16.2.1 Werte aus t.test ziehe - Beispiel
Syntax: Mit “$” nach test kann man einzelne Werte aus Test ziehen
t.test(ScreenTime ~ Gender, data = df_joined)$p.value #Screen Time und Gender wird vergliche,
#data sagt, von wo Daten kommen16.3 Pearson R berechnen
Der Pearson correlation coefficient misst die Stärke und Richtung des linearen Zusammenhangs zwischen zwei metrischen Variablen 📈. Der Wert von r liegt zwischen -1 und +1, wobei +1 einen perfekten positiven und -1 einen perfekten negativen Zusammenhang bedeutet. Ein Wert nahe 0 zeigt, dass kein linearer Zusammenhang besteht.
cor.test(df_joined$ClosenessPopulistParty, df_joined$ScreenTime, method = "pearson") 16.3.1 Interpretation Pearson R
| Wert | Interpretation |
|---|---|
| +1 | perfekt positiver Zusammenhang |
| 0 | kein Zusammenhang |
| -1 | perfekt negativer Zusammenhang |
16.3.1.1 Häufigkeiten berechnen
#absolute Häufigkeit
df_asylentscheide %>% #vor Pipe Operator, Datensatz schreiben
count(case_decision) #nach count variable, die gezählt werden soll
# Relative Häufigkeiten
df_asylentscheide %>%
count(case_decision) %>%
mutate(freq_rel = n / sum(n)) #hier fügen wir die relative Häufigkeit mit mutate direkt in datensatz ein16.4 Kreuztabelle erstellen
# einfache Kreuztabelle
table(df_asylentscheide$case_decision,
df_asylentscheide$judge_party, useNA = "ifany") %>%
addmargins()
# Kreuztabelle mit Relativen Häufigkeiten
tbl_relf <- table(df_asylentscheide$judge_party,
df_asylentscheide$case_decision, useNA = "ifany") %>%
prop.table(margin = 1) %>%
round(2)
tbl_relf17 Lineare Regressionsanalyse
17.1 Basis-Code
lm(stimmbeteiligungInProzent ~ Ländlichkeit, co2_mut)
# Analyse Speichern
lm1 = lm(x ~ y, data)
# Analyse drucken
lm1Outcome = y variable, das ist das erste im LM
Treatment = x variable, das ist das zweite im LM
17.1.1 Lineare Regression mit mehr als 2 Variablen
lm(x ~ y1 + y2, data)17.1.2 Interaktion in linearen Regression
lm(x * y, data)17.2 Einzelne Koeffizienten berechnen
summary(lm1)
# zuerst modell definieren (lm1)!!!17.2.1 Einzelne Koeffizienten anzeigen
coef(lm_csim)["x1"]
# Regression und Name des Koeffizienten angeben17.3 Variablen korrelieren
cor(csim$y, csim$x1) #Korrelation zwischen y und x117.3.1 Korrelationsmatrix erstellen mit Tidyverse-Syntax
csim %>% # Datensatz auswählen
select(y, x1, x2) %>% #Variablen auswählen, die wir in Matrix wollen
cor()17.3.2 Korrelationsmatrix erstellen mit Base R
cor(data[, c("y", "x1", "x2")])
# Datensatz (data, nach c alle Variablen angeben)17.4 Werte vorhersagen in R
predict(lm1, newdata = data.frame(variable = 1, variable = 2))Wir müssen zuerst die Funktion lm (siehe Lineare Regressionsanalyse) definieren. Mit data.frame können wir festlegen, wo wir schätzen.
17.5 Parameter vergleichen
coef(datansatz)17.5.1 Einzelner Paramenter berechnen
coef(guns_lm)[2]17.5.2 Tabelle mit Parameter erstellen
screenreg(list(linear1, linear2,), digits = 2)
# hier vergleichen wir 2 Modelle
# digitis = definiert wie viele nachkommastellen wir bekommen!17.6 Werte von Hand ausrechnen (beta) und Werte vorhersagen
# Von Hand ausrechnen
beta0 <- coef(co2_fit4)[1] # Achsenabschnitt
beta1 <- coef(co2_fit4)[2] # Steigung
x_lugano <- df_co2_exklZH %>%
filter(mun_name == "Lugano") %>%
pull(anzahlStimmberechtigte)
# In Formel einsetzen
y_hat_lugano <- beta0 + beta1*x_lugano
y_hat_lugano17.7 Residuum
Von Hand:
y_modell - y_tatsächlich Y_modell wird berechnet (siehe: Werte vorhersagen in R). Y_tatsächlich wird aus Datensatz gezogen (siehe: Einzelner Wert aus Datensatz ziehen und abspeichern)
Automatisch:
df_co2_exklZH %>%
mutate(residuum = resid(co2_fit4)) %>%
filter(mun_name == "Lugano") %>%
pull(residuum)
# resid Funktion18 R^2 in R berechnen
summary(lm1)Summary gibt uns ALLE Details zum Modell
summary(lm1)$r.squaredWas sagt uns das 𝑅^2 ?
Hohe Werte → unabhängige Variable kann Y gut vorhersagen
Tiefe Werte → unabhängige Variable kann Y schlecht vorhersagen
Beispiel: Wenn R^2 = 0.32, dann kann unser Modell 32% der Variation erklären.
summary(m3)$adj.r.squared19 Mittelwertsvergleich
data_set %>%
group_by(xy) %>%
summarize(Mean = mean(yx, na.rm = TRUE))20 Visualisierung von Linearen Regressionen/Interaktionen
library(sjPlot)
# Packet wird benötigt um dies zu tun!20.1 Modelle visualisieren
plot_model(lm(x ~ y, df_x), type = "int")plot_model(modell2, type = "int")
# hier haben wir die Analyse gespeichert als modell2!Type = “int” -> Interaktion! Type = “pred” -> predict -> R findet heraus, ob es eine Interaktion oder Regression ist.
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 = "")20.2 Modelle in Tabelle vergleichen
screenreg(list(lm_1, lm_2))
Folgendes Output mit diesen Code vorhanden. Sterne zeigen, wie viel der “p-Wert” ist -> wie gut ist das Modell?
20.3 Confounding in multiple linearen Regression

21 Feols: Fixed effect models mit panel daten
Gleich wie lm() Syntax.
feols(y ~ x | time + year, dataset)fixed terms immer hinter |, mit + verbinden falls mehrere Fixed terms
Wir kontrollieren eine Variable. Hilft uns confounders zu berücksichtigen. Wir können aber keine Unterschiede in der kontrollierten Variable zeigen!
22 Funktionen in R schreiben (passives Verständnis)
# Aufbau einer Funktion
name <- function(argumente) {
# Code der ausgeführt werden soll
}Beispiel einer Funktion
game <- function(type, size) {
sample(type, size = size, replace = TRUE)
}23 For-Schleifen in R (passives Verständnis)
for (i in 1:10) {
x <- i*2 # im ersten Durchgang ist i = 1, dann i = 2, dann i = 3, usw.
print(x)
}i = 1, dann i = 2, dann i = 3 usw… bis i = 10
24 GLM in R (logit / probit)
model = glm(y ~ x + x2, family = binomial(link = "logit"), data = example)
# statt "logit" kann man auch "probit" schreiben24.1 Werte vorhersagen mit GLM
24.1.1 Logit
plogis(coef(modell)[1])24.1.2 probit
pnorm(coef(modell)[1])24.1.3 oder automatisch
set.seed(666)
predicts(lm3, "median;0-80,5;median", type = "simulation")24.2 Modellgüte in Logit und Probit
table(m1$model$survived, pred.out.01)
#m1 = model, model = model, survived = variable24.2.1 Vorhersagen für alle Beobachtungen
pred.out = predict(m1, type = "response")
# Einzelne Beobachtung
pred.out.01 = cut(pred.out, breaks = c(-Inf, 0.5, Inf), labels = c(0,1))