2  R Code


3 Packete laden

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

3.1 Packete Aktivieren

library(tidyverse)
# Beispiel mit Tidyverse

3.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 setzen

5 Hilfsfunktionen in R

count() # Zählt

levels() # zeigt Kategorien der Variablen

class() # Zeigt Datentyp z.B. ob die Variable numerisch ist

factors() #erstellt kategorische Variablen

6 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) = NULL

Datensatz 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 gezogen

8.1.1 Zufallstichprobe aus Datensatz ziehen

sample_n(dataframe, "Anzahl", replace = False)

# Weight automatisch auf 1, replace kann t oder f sein

8.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 = standardabweichung

9 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() schreiben

12 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")

Streudiagramm Beispiel. Wichtig: abhängige Variable auf der y-Achse, unabhängige Variable auf der x-Achse!

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 plotten

15.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_b

Die 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 definiert

15.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
  ) 

m2

15.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 Aufgabe

16.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 kommen

16.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 kommen

16.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 ein

16.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_relf

17 Lineare Regressionsanalyse

17.1 Basis-Code

lm(stimmbeteiligungInProzent ~ Ländlichkeit, co2_mut)

# Analyse Speichern

lm1 = lm(x ~ y, data)

# Analyse drucken

lm1

Outcome = 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 angeben

17.3 Variablen korrelieren

cor(csim$y, csim$x1) #Korrelation zwischen y und x1

17.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_lugano

17.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 Funktion

18 R^2 in R berechnen

summary(lm1)

Summary gibt uns ALLE Details zum Modell

summary(lm1)$r.squared

Was 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.squared

19 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" schreiben

24.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 = variable

24.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))
?

Lernuhr
Uhrzeit
Lerntimer
🧮