Installation

R ist eine Open-Source-Programmiersprache welche speziell für statistische Berechnungen und Visualisierung von Daten und Modellen entwickelt wurde. Für die erleichterte Anwendung von R werden wir das IDE (Integrated Development Environment) namens Rstudio benutzen. Mit Rstudio wird R viel intuitiver durch Syntax Highlighting, Auto-Vervollständigung und einer besseren Übersicht über Grafiken, Packages und Datensätze.

R

Unter folgendem Link kann R heruntergeladen werden

DOWNLOAD R

RStudio

Unter folgendem Link kann Rstudio heruntergeladen werden

DOWNLOAD RStudio

Latex zum Erstellen von .pdf Reports

Unter folgenden Links kann die Latex Verteilung MiKTeX (Windows) bzw. MacTeX (Mac) heruntergeladen werden.

DOWNLOAD MiKTeX

DOWNLOAD MacTeX

Ansicht und Layout

Gleich zu Beginn ändern wir einmal globale Optionen zur Ansicht und Layout.

Zunächst klicken wir unter dem Reiter Tools -> Global Options

Als nächstes können wir unter Appearance verschiedene Einfärbungen wählen, welche die Ansicht von Rstudio etwas angenehmer machen (können).

Unter Layout können wir die folgende Anordnung der verschiedenen Panels benutzen, die generell etwas komfortabler ist.

Schauen wir uns jetzt einmal die vier Panels von Rsudio an:

Das Interface von Rstudio besteht aus vier Fenstern für 1) Erstellen einer Datei mit R-Skript, 2) Eingeben von R-Befehlen, 3) Anzeigen von Befehlsverläufen, 4) Anzeigen von Plots und mehr.

Oben links:

Code-Editor, der das R-Skript enthält. Ein neues R-Skript kann wie folgt erstellt werden: Datei -> Neu -> R-Skript.

Oben rechts:

R-Konsole zur Eingabe von R-Befehlen

Unten links:

  • Files: Dateien im working directory anzeigen

  • Plots: Zeigt die erstellten Grafiken an. Auf dieser Registerkarte kann man eine Grafik in eine PDF- oder eine Bilddatei exportieren

  • Packages: Zeigt externe R-Pakete an, die auf Ihrem Systemverfügbar sind. Wenn - diese Option aktiviert ist, wird das Paket in R geladen.

  • Help: Zeigt die Hilfe zu einer Funktion. (Aufrufbar mit ´?<>)

Unten rechts:

  • Environment: Zeigt die Liste der R-Objekte an, die während der R-Sitzung erstellt wurden.

  • History: Zeigt die History aller vorherigen Befehle an.

Basics

Zu aller erst ist R ein High-End Taschenrechner

1+1
## [1] 2
5*5
## [1] 25
500/2 + 3*6^2
## [1] 358

Aufgabe Berechne die Differenz zwischen 2017 und dem Jahr, an dem du begonnen hast zu studieren und dividiere das den Unterschied zwischen 2017 und dem Jahr, in dem du geboren wurdest. Multipliziere dies mit 100, um den Prozentsatz deines Lebens zu erhalten, den du an die Uni verbracht hast.

In R kann man je nach Rechenleistung zehntausende Datensätze auf einmal laden und verarbeiten. Das wird möglich da jeder Datensatz seinen eigenen Namen besitzt. Dieser muss mit einem Buchstaben beginnen, kann aber durchaus auch . oder _ oder Zahlen enthalten. Um ein Objekt einen Namen zuzuweisen wird <- eingesetzt. Objekte können einzelne Zahlen, Variablen oder auch Datensätze sein. Mit den Objektennamen kann genau erklärt werden, wie die Daten verarbeitet werden sollen.

x <- 1        #definiere x als 1
y <- 2        #definiere y als 2
z <- x + y    #addiere x und y und speicher das Ergebnis in z
z             #geb das Ergebnis aus
## [1] 3

Operatoren

  • + addieren
  • - subtrahieren
  • * multiplizieren
  • / dividieren
  • == (logisch) ist gleich
  • != (logisch) ist ungleich
  • %in% (string) ist gleich
  • > größer als
  • < kleiner als
  • >= größer gleich
  • <= kleiner gleich
  • is.na() ist NA
  • !is.na() ist ungleich NA

Boolean

  • & (logisch) und
  • | (logisch) oder
  • xor(x, y) x oder y
  • any()
  • all()
3 == 3
## [1] TRUE
4 > 5
## [1] FALSE

R gibt hier entweder TRUE oder FALSE aus, abhängig davon ob der benutzte logische Operator zutrifft oder nicht.

Vektoren

Vektoren in R sind einfach mehrere Werte die aneinander gebunden werden. Diese können Zahlen aber auch strings (Buchstabenfolgen) sein. Hiflreich dabei ist die c() Funktion (c steht für concatenate = verketten auf Deutsch).

vektor <- c(1,2,3,4,5) #definiere Vektor mit den Werten 1,2,3,4 und 5
vektor
## [1] 1 2 3 4 5

Operatoren können auch ganz einfach mit Vektoren angewandt werden.

vektor * vektor
## [1]  1  4  9 16 25
vektor == vektor
## [1] TRUE TRUE TRUE TRUE TRUE

Funktionen

Das Ziel einer Funktion ist es Daten zu verarbeiten. Dazu gibt es einen input und einen output.

Definieren wir doch mal eine Funktion, welche Werte die man als input eingibt wieder quadriert als output gibt.

quadrieren <- function(x) {
  result <- x^2
  result
}

quadrieren(2)
## [1] 4

Wir können auch zwei Argumente für die Funktion einfügen und am Ende ein Wert abziehen.

quadrieren_minus <- function(x, minus) {
 result <- x^2 - minus
 result
}

quadrieren_minus(2,1)
## [1] 3

Probieren wir das gleiche doch mal mit einer Funktion die jeder aus dem Physik - Unterricht kennen sollte: \[Distanz = \frac{Geschwindigkeit}{Zeit} \widehat{=} s = \frac{v}{t}\]

distanz <- function(v, t) {
 s <- v / t
 s
}

distanz(50,6)
## [1] 8.333333

Nun müssen wir allerdings nicht immer selber Funktionen definieren. Base R und die vielen Packages haben unzählige Funktionen, die Datenbearbeitung einfach machen. Beispielsweise gibt mean() den Mittelwert eines Vektors aus und sd() gibt die Standardabweichung.

mean(vektor)
## [1] 3
sd(vektor)
## [1] 1.581139

Datensätze

Vektoren können wir auch zu Datensätzen zusammenfügen. Wie? Ganz einfach mit der Funktion data.frame.

namen <- c("Trisha","Rabia","Halma","Franziska","Margarita",
          "Franz","Eugen","Rodriguez","Jan","Volker")
cm <- c(160,150,144,156,179,180,170,186,176,177)
geschl <- c("weiblich","weiblich","weiblich","weiblich","weiblich",
            "männlich","männlich","männlich","männlich","männlich")

dat<-data.frame(namen,cm,geschl)
dat
##        namen  cm   geschl
## 1     Trisha 160 weiblich
## 2      Rabia 150 weiblich
## 3      Halma 144 weiblich
## 4  Franziska 156 weiblich
## 5  Margarita 179 weiblich
## 6      Franz 180 männlich
## 7      Eugen 170 männlich
## 8  Rodriguez 186 männlich
## 9        Jan 176 männlich
## 10    Volker 177 männlich

Sehr Angenehm kann man auf einzelne Variablen mit Hilfe des Dollarzeichens in der Form data$variable zugegriffen werden.

dat$cm
##  [1] 160 150 144 156 179 180 170 186 176 177
dat$geschl
##  [1] weiblich weiblich weiblich weiblich weiblich männlich männlich
##  [8] männlich männlich männlich
## Levels: männlich weiblich

Hier könnten wir zum Beispiel auch einen t-test machen um herauszufinden ob die Größe einer Person sich signifikant zwischen den Geschlechtern unterscheidet:

t.test(dat$cm ~ dat$geschl)
## 
##  Welch Two Sample t-test
## 
## data:  dat$cm by dat$geschl
## t = 3.0758, df = 5.4886, p-value = 0.02443
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##   3.723044 36.276956
## sample estimates:
## mean in group männlich mean in group weiblich 
##                  177.8                  157.8

Das Ergebnis des t-tests zeigt, dass sich die Größe signifikant zwischen Männern und Frauen unterscheidet (t(5.5) = 3.0758, p = 0.02443)

Drei Variablen Haupttypen

  • Factor : Unveränderliche Ausprägungen (z.B. Gender, Religion).
  • Character : aka “String” oder ‘String’, veränderbarer Text.
  • Numeric : Jeglicher Zahleninput mit dem man rechnen kann.

Weitere

  • Boolean <>: [TRUE | FALSE], [T | F]
  • NA: Missing Values
  • NaN <>: 0/0 ‘Not a Number’
  • Infinity <+/- Inf>: 1/0

Tranformation zwischen den Datentypen

as.factor()

as.character()

as.numeric()

Datensätze sind aneinander gereihte Variablen der selben Länge. Mit Base kann ein Datensatz nach der Logik data[Zeilen, Spalten] oder data[rows, columns] angesteuert weden.

Hier sind einige Datenabfragen und -manipulationsweisen:

Datenabfrage und -manipulation R - Funktion/Befehl
Wie viele Zeilen? nrow(dat)
Wie viele Spalten? length(dat)
ncol(dat)
Welcher Datentyp? class(dat)
Welche Struktur hat ein Datenobjekt? str(dat)
Die ersten Fälle eines Datensatzes head(dat)
Die letzten Fälle eines Datensatzes tail(dat)
i. Zeile
j. Spalte
i. Spalte und j. Zeile
dat[i,]
dat[,i]
dat[i,j]
alle Elemente bis auf i. Zeile
alle Elemente bis auf j. Spalte
alle Elemente bis auf i. Zeile und j. Spalte
dat[-i,]
dat[,-i]
dat[-i,-j]
Die ersten fünf Zeilen
Die ersten fünf Spalten
Die ersten fünf Spalten und Zeilen
dat [1:5,]
dat [,1:5]
dat [1:5,1:5]
Spezifische Zeilen
Spezifische Spalten
dat[c(1,3,5),] Zeilen 1,2 u. 3
dat[,c(1,3,5)] Spalten 1,2 u. 3
Gibt es fehlende Werte? anyNA(dat)

Lasst uns ein bisschen rekodieren!

Datenimport und -export

Als erstes muss der Ordnerpfad festgelegt werden. Rechtsklick auf Datensatz -> Ordnerpfad. Bei Windows müssen die Slashes von  zu / geändert werden.

path_data <- "C:/Users/Fabio/Dropbox/9. Semester Master/Tutorium"
setwd(path_data)
getwd()
dir()

Rdata

Ist das R-native Datenformat.

Import

dat <- get(load("file_name.Rdata"))

Export

save(dat, file = "file_name.Rdata")

SPSS

Das package haven erlaubt es Datensätze zwischen den gängigsten Statistik-Programmen zu transportieren.

Import

# install.packages("haven")
library(haven) 

dat <- read_sav("file_name.sav")

Export

write_sav(dat, "file_name.sav")

CSV

Wenn ein Excel-Datensatz (.xlsx) vorliegt kann dieser einfach in csv (comma sperated values) abgespeichert werden.

Import

dat <- read.csv(file_name = "file.csv", 
               header = T, 
               sep = ",", 
               dec = ".", 
               stringsAsFactors = F)

Export

write.csv(dat, file = "file_name.csv", row.names = F)

Stata

Import

# install.packages("haven")
library(haven) 

dat <- read_dta("file_name.dta")

Export

write_dta(dat, "file_name.dta")

SAS

Import

# install.packages("haven")
library(haven) # the tidyverse (HW) delivers usful export/import functions

dat <- read_sas("file_name.sas7bdat")

Export

write_sas(d, "file_name.sas7bdat")

Datenmanipulation: Beispiel

Zunächsten werden wir einen SPSS Datensatz einladen. Um genauer zu sein, benutzen wir ein deutsches Subset des Eurobarometer (87.3) von Mai 2017.

path_data <- "C:/Users/Fabio/Dropbox/9. Semester Master/Tutorium"
setwd(path_data)

#install.packages("haven")
library(haven) 

euroGER <- read_sav("eurobarometer_GER_May2017.sav")

Lasst uns zuerst mal angucken wie der Datensatz aussieht:

head(euroGER)
## # A tibble: 6 x 631
##    studyno1  studyno2                 doi            version   edition
##   <dbl+lbl> <dbl+lbl>               <chr>              <chr> <dbl+lbl>
## 1      6863      6863 doi:10.4232/1.12847 1.0.0 (2017-08-25)         1
## 2      6863      6863 doi:10.4232/1.12847 1.0.0 (2017-08-25)         1
## 3      6863      6863 doi:10.4232/1.12847 1.0.0 (2017-08-25)         1
## 4      6863      6863 doi:10.4232/1.12847 1.0.0 (2017-08-25)         1
## 5      6863      6863 doi:10.4232/1.12847 1.0.0 (2017-08-25)         1
## 6      6863      6863 doi:10.4232/1.12847 1.0.0 (2017-08-25)         1
## # ... with 626 more variables: survey <dbl+lbl>, caseid <dbl>,
## #   uniqid <dbl>, serialid <dbl>, tnscntry <dbl+lbl>, country <dbl+lbl>,
## #   isocntry <chr>, split <dbl+lbl>, q1.1 <dbl+lbl>, q1.2 <dbl+lbl>,
## #   q1.3 <dbl+lbl>, q1.4 <dbl+lbl>, q1.5 <dbl+lbl>, q1.6 <dbl+lbl>,
## #   q1.7 <dbl+lbl>, q1.8 <dbl+lbl>, q1.9 <dbl+lbl>, q1.10 <dbl+lbl>,
## #   q1.11 <dbl+lbl>, q1.12 <dbl+lbl>, q1.13 <dbl+lbl>, q1.14 <dbl+lbl>,
## #   q1.15 <dbl+lbl>, q1.16 <dbl+lbl>, q1.17 <dbl+lbl>, q1.18 <dbl+lbl>,
## #   q1.19 <dbl+lbl>, q1.20 <dbl+lbl>, q1.21 <dbl+lbl>, q1.22 <dbl+lbl>,
## #   q1.23 <dbl+lbl>, q1.24 <dbl+lbl>, q1.25 <dbl+lbl>, q1.26 <dbl+lbl>,
## #   q1.27 <dbl+lbl>, q1.28 <dbl+lbl>, q1.29 <dbl+lbl>, q1.30 <dbl+lbl>,
## #   q1.31 <dbl+lbl>, q1.32 <dbl+lbl>, q1.33 <dbl+lbl>, q1.34 <dbl+lbl>,
## #   q1.35 <dbl+lbl>, q1.36 <dbl+lbl>, d70 <dbl+lbl>, d71a_1 <dbl+lbl>,
## #   d71a_2 <dbl+lbl>, d71a_3 <dbl+lbl>, d71b_1 <dbl+lbl>,
## #   d71b_2 <dbl+lbl>, d71b_3 <dbl+lbl>, polintr <dbl+lbl>,
## #   qa1a_1 <dbl+lbl>, qa1a_2 <dbl+lbl>, qa1a_3 <dbl+lbl>,
## #   qa1a_4 <dbl+lbl>, qa1a_5 <dbl+lbl>, qa1a_6 <dbl+lbl>,
## #   qa1b_1 <dbl+lbl>, qa1b_2 <dbl+lbl>, qa1b_3 <dbl+lbl>,
## #   qa1b_4 <dbl+lbl>, qa1b_5 <dbl+lbl>, qa2a_1 <dbl+lbl>,
## #   qa2a_2 <dbl+lbl>, qa2a_3 <dbl+lbl>, qa2a_4 <dbl+lbl>,
## #   qa2a_5 <dbl+lbl>, qa2a_6 <dbl+lbl>, qa2b_1 <dbl+lbl>,
## #   qa2b_2 <dbl+lbl>, qa2b_3 <dbl+lbl>, qa2b_4 <dbl+lbl>,
## #   qa2b_5 <dbl+lbl>, qa2b_6 <dbl+lbl>, qa2b_7 <dbl+lbl>,
## #   qa3a.1 <dbl+lbl>, qa3a.2 <dbl+lbl>, qa3a.3 <dbl+lbl>,
## #   qa3a.4 <dbl+lbl>, qa3a.5 <dbl+lbl>, qa3a.6 <dbl+lbl>,
## #   qa3a.7 <dbl+lbl>, qa3a.8 <dbl+lbl>, qa3a.9 <dbl+lbl>,
## #   qa3a.10 <dbl+lbl>, qa3a.11 <dbl+lbl>, qa3a.12 <dbl+lbl>,
## #   qa3a.13 <dbl+lbl>, qa3a.14 <dbl+lbl>, qa3a.15 <dbl+lbl>,
## #   qa3a.16 <dbl+lbl>, qa4a.1 <dbl+lbl>, qa4a.2 <dbl+lbl>,
## #   qa4a.3 <dbl+lbl>, qa4a.4 <dbl+lbl>, qa4a.5 <dbl+lbl>,
## #   qa4a.6 <dbl+lbl>, qa4a.7 <dbl+lbl>, qa4a.8 <dbl+lbl>, ...

Wir wollen alle diese Variablen nicht! Deswegen wählen wir einmal relevante Variablen aus. Diese sind:

qd2_1: EU CITIZENSHIP: FEEL TO BE EU CITIZEN

  • 1 = Yes, definitely

  • 2 = Yes, to some extent

  • 3 = No, not really

  • 4 = No, definitely not

  • 5 = DK 9 = Inap. (not 1 in eu28)

qa17b DEMOCRACY SATISFACTION - EUROPEAN UNION

  • 1 = Very satisfied

  • 2 = Fairly satisfied

  • 3 = Not very satisfied

  • 4 = Not at all satisfied

  • 5 = DK

  • 9 = Inap. (not 1 in eu28)

country COUNTRY/SAMPLE ID (SERIES STANDARD)

  • 4 = DE-W-Germany-West

  • 14 = DE-E-Germany-East

Subset eines Datensatzes erstellen mit select()

Mit select werden Spalten = Vektoren = Variablen mittels dem Variablennamen oder einer Hilfsfunktion ausgewählt.

#install.packages("tidyverse")
library(tidyverse)

euroGER_sub <- select(euroGER, qd2_1, qa17b, country)

Variablen umbenennen mit rename()

euroGER_sub <- rename(euroGER_sub,
      feel_EUcitizen = qd2_1,
      dem_sat = qa17b,
      eastwest = country)

head(euroGER_sub)
## # A tibble: 6 x 3
##   feel_EUcitizen   dem_sat  eastwest
##        <dbl+lbl> <dbl+lbl> <dbl+lbl>
## 1              2         5         4
## 2              1         2         4
## 3              2         2         4
## 4              1         5         4
## 5              2         2         4
## 6              2         2         4

Variablen umkodieren

Entweder so:

euroGER_sub$feel_EUcitizen[euroGER_sub$feel_EUcitizen == 5] <- NA
euroGER_sub$dem_sat[euroGER_sub$dem_sat == 5] <- NA

euroGER_sub$feel_EUcitizen <- 5 - euroGER_sub$feel_EUcitizen 
euroGER_sub$dem_sat <- 5 - euroGER_sub$dem_sat

euroGER_sub$eastwest[euroGER_sub$eastwest==4] <- "west"
euroGER_sub$eastwest[euroGER_sub$eastwest==14] <- "east"

Oder so:

euroGER_sub <- mutate(euroGER_sub, 
                      dem_sat = ifelse(dem_sat == 5, NA, 5 - dem_sat)) 

euroGER_sub <-  mutate(euroGER_sub, 
                       feel_EUcitizen = ifelse(feel_EUcitizen == 5, NA, 5 - feel_EUcitizen))

euroGER_sub <-  transmute(euroGER_sub, 
                          eastwest = ifelse(eastwest == 4, "west", "east"))

oder mit der pipe %>%

euroGER_sub <- euroGER %>% 
  select(qd2_1, qa17b, country) %>% 
  mutate(dem_sat = ifelse(qa17b == 5, NA, 5 - qa17b)) %>% 
  mutate(feel_EUcitizen = ifelse(qd2_1 == 5, NA, 5 - qd2_1)) %>%
  mutate(eastwest = ifelse(country == 4, "west", "east"))
library(texreg)
model1 <- lm(feel_EUcitizen ~  dem_sat, data=euroGER_sub)
model2 <- lm(feel_EUcitizen ~  dem_sat + eastwest, data=euroGER_sub)

htmlreg(list(model1,model2))
Statistical models
Model 1 Model 2
(Intercept) 2.13*** 2.01***
(0.07) (0.07)
dem_sat 0.43*** 0.39***
(0.03) (0.03)
eastwestwest 0.33***
(0.04)
R2 0.14 0.17
Adj. R2 0.14 0.17
Num. obs. 1483 1483
RMSE 0.79 0.77
p < 0.001, p < 0.01, p < 0.05
library(sjPlot)
## Install package "strengejacke" from GitHub (`devtools::install_github("strengejacke/strengejacke")`) to load all sj-packages at once!
sjp.lm(model2, type = "pred", vars = c("dem_sat", "eastwest"), facet.grid = FALSE)

sjp.scatter(x = euroGER_sub$dem_sat, 
            y = euroGER_sub$feel_EUcitizen, 
            grp = euroGER_sub$eastwest,
            fit.line.grps = TRUE,
            fitmethod = "lm",
            show.ci = T)
## auto-jittering values...

Inhalt R - Funktion/Befehl
Schnelle Häufigkeiten table(euroGER_sub$dem_sat)
Variablen Namen eines Datensatzes names(euroGER_sub)
colnames(euroGER_sub)
Schnelle deskriptive Statistik summary(euroGER_sub)
summary(euroGER_sub$dem_sat)
Skalenlimits min(euroGER_sub$dem_sat)
max(euroGER_sub$dem_sat)
range(euroGER_sub$dem_sat)
Schwerpunkte einer Verteilung mean(euroGER_sub$dem_sat)
median(euroGER_sub$dem_sat)
sd(euroGER_sub$dem_sat)
var(euroGER_sub$dem_sat)
Quantile quantile(euroGER_sub$dem_sat)
quantile(euroGER_sub$dem_sat, probs = seq(0,1, by = 0.1))