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.
Unter folgenden Links kann die Latex Verteilung MiKTeX (Windows) bzw. MacTeX (Mac) heruntergeladen werden.
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.
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 gleichis.na() ist NA!is.na() ist ungleich NABoolean
& (logisch) und| (logisch) oderxor(x, y) x oder yany()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
Weitere
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!
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()
Ist das R-native Datenformat.
Import
dat <- get(load("file_name.Rdata"))
Export
save(dat, file = "file_name.Rdata")
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")
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)
Import
# install.packages("haven")
library(haven)
dat <- read_dta("file_name.dta")
Export
write_dta(dat, "file_name.dta")
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")
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))
| 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)) |