RTutorial RC LMU
RTutorial RC LMU
LMU München
Seminar für Finanzökonometrie
Robert Czudaj
2
Inhaltsverzeichnis
1 Grundlagen 4
1.1 Was ist R, warum nutzen wir R? . . . . . . . . . . . . . . . . . . . . . 4
1.2 Installation von R und RStudio . . . . . . . . . . . . . . . . . . . . . . 4
1.3 Die Benutzeroberfläche . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.4 Die Dokumentation: wie war das noch gleich? . . . . . . . . . . . . . . 6
1.5 Installation und Nutzung neuer Pakete . . . . . . . . . . . . . . . . . . 6
2 Erste Schritte 7
2.1 Erstellen von Objekten . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.1.1 Datentypen und einfache Datenstrukturen . . . . . . . . . . . . 7
2.2 Rechnen mit R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2.1 Einfache Arithmetik . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2.2 Rechnen mit Vektoren und Matrizen . . . . . . . . . . . . . . . 11
2.2.3 Summen, Mittelwerte und andere Operationen . . . . . . . . . . 12
2.3 Wahrscheinlichkeitsverteilungen . . . . . . . . . . . . . . . . . . . . . . 13
2.4 Lineare Regression in R . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.5 Grafische Darstellung . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.5.1 Der Boxplot . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.5.2 Das Histogram . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.5.3 Das Kuchendiagramm . . . . . . . . . . . . . . . . . . . . . . . 19
2.5.4 Das Balkendiagramm . . . . . . . . . . . . . . . . . . . . . . . 20
2.5.5 Scatterplots und Linienplots . . . . . . . . . . . . . . . . . . . . 20
2.6 Einlesen von Daten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Funktionsübersicht 24
3
1 Grundlagen
1.1 Was ist R, warum nutzen wir R?
R ist eine Interpretersprache für statistische Anwendungen. Ihre Nutzergemeinde steigt
stetig an. Jeder kann zum R-Projekt beitragen, indem er eigene Pakete entwickelt und
den anderen Nutzern zur Verfügung stellt. Durch diesen Open Source-Charakter bietet R
eine Vielzahl von analytischen Möglichkeiten für seine Anwender. Beispielsweise gibt es
Pakete, um das Rechnen mit Zeitreihen zu vereinfachen oder aber um mit den API’s von
Facebook oder Twitter zu kommunizieren und so Social-Media-Daten abzufragen. Aber
auch die großen “Datenkraken” ihrerseits haben R als nützliches Werkzeug entdeckt.
Gerade die Analyse von ”Big Data”(rechen- und speicherintensiv) ist eine Stärke von R.
4
2. Die Editor-Software RStudio:
http://www.rstudio.com/products/rstudio/download/
Auch hier laden Sie die entsprechende Datei herunter.
Als erstes wird R installiert. Der Installationspfad kann beliebig gewählt werden. Shortcuts
sind nicht nötig. Nachdem die Installation von R erfolgreich war, installieren Sie RStudio.
Hier ist ein Shortcut auf dem Desktop oder im Startmenü sinnvoll.
5
Starten Sie RStudio. Die Benutzeroberfläche ist in vier Bereiche eingeteilt:
1. Der Editor
Erfüllt die gleichen Funktionen wie das Programm Editor unter Windows.
2. Protokoll-Fenster
Im Reiter Environment findet man eine Übersicht aller gespeicherten Objekte
(Variablen und Funktionen). Unter History wird der Verlauf des bisher ausgeführten
Codes angezeigt (quasi wie die Chronik im Browser). Presentation ist für unsere
Zwecke unwichtig. Es sei jedoch erwähnt, dass es möglich ist, Slides mit Codes
und Plots direkt in RStudio zu erstellen und anzuzeigen (R Markdown).
4. Die Konsole
Wollen wir unseren im Editor geschriebenen Code ausführen, senden wir ihn über
den Button Source (oben rechts im Editorfenster) zur Konsole. Alternativ kann
man seinen Code auch direkt in der Konsole eingeben.
Die Dokumentation kann auch nach einzelnen Stichwörtern durchsucht werden. Dazu
verwendet man einfach zwei Fragezeichen anstelle von einem.
6
Möchte man ein neu installiertes Paket verwenden, so muss man es in der aktuellen R-
Session noch importieren. Dies geschieht mit Hilfe der Funktion library(paketname).
Beispielsweise beinhaltet das Paket ”MASS” unter anderem einen Datensatz namens
geyser und die Funktion truehist(), mit deren Hilfe das Plotten von Histogrammen
verbessert werden kann.
40 50 60 70 80 90 100 110
waiting
2 Erste Schritte
Erstellen Sie ein neues R-Skript. Dazu klicken Sie im Menü auf File New File R Script
oder nutzen den Kurzbefehl Strg + + N . Im Editor-Fenster öffnet sich daraufhin eine
neue Datei.
7
x <- 10 # Erstelle Objekt x
Wir schreiben also zunächst den gewünschten Namen des Objekts und weisen diesem
mit Hilfe von <- einen Wert zu. Führen wir unser Skript über den Button Source aus,
wird der Code in der Konsole verarbeitet und im Reiter Environment erscheint unsere
Variable. Wie Sie vielleicht bereits vermuten, werden Kommentare in R durch eine Raute
gekennzeichnet. Alles, was in einer Zeile einer Raute folgt, wird von R ignoriert. Möchten
wir den Inhalt eines Objekts ausgeben, reicht es, dessen Namen zu schreiben:
## [1] 10
Im obigen Beispiel-Code und auch allen folgenden wird eine Konsolenausgabe durch
## gekennzeichnet. Natürlich kann man auch Objekte mit nicht-numerischen Werten
definieren:
## [1] "Maximilian"
Wie Sie sehen, erfolgt die Zuweisung hier mit Hilfe von Anführungszeichen. Damit
haben Sie bereits zwei Datentypen kennengelernt. Insgesamt kann man drei grundlegende
Datentypen abgrenzen:
1. numeric
Diese Klasse umfasst alle numerischen Werte inklusive Inf, -Inf und NaN (”Not a
Number”). Das Objekt x gehört dieser Klasse an.
2. character
Zeichenketten wie zum Beispiel der Wert des Objektes name.
8
Vektoren mit mehr als nur einem Element können mit Hilfe der Funktion c() erstellt
werden. Schauen Sie sich deren Funktionweise in der Dokumentation mit dem Befehl
help(c) an. Dort erfahren Sie, dass c() die übergebenen Argumente zusammenfügt
und (in der Regel) einen Vektor dieser zurückgibt.
Nachdem wir uns schlauer gemacht haben, erstellen wir einen (3 × 1) Vektor:
## [1] 1 2 3
Eine andere Möglichkeit, diesen Vektor zu erstellen, bietet die Funktion seq(). Deren
Argumente from, to und by stellen dabei den Start-, Endwert und das Inkrement einer
Sequenz dar. Eine Kurzschreibweise hierfür ist 1:3.
## [1] 1 2 3
## [1] 1 2 3
Möchten wir nur auf ein oder mehrere bestimmte Elemente eines Vektors zugreifen,
indizieren wir diesen mit Hilfe folgender Syntax:
## [1] 2
## [1] 1 2
Während c() seine Argumente aneinanderreiht, fügen die Funktionen rbind() und
cbind() ihre Argumente zeilen- bzw. spaltenweise zusammen.
9
D <- cbind(a, b) # spaltenweise zusammenfügen
D
## a b
## [1,] 1 4
## [2,] 2 5
## [3,] 3 6
Soeben haben wir zwei Matrizen erstellt. Objekt C ist eine (2 × 3) Matrix, während D die
Dimension (3 × 2) hat. An dieser Stelle möchte ich erwähnen, dass R “case-sensitive”
ist. Es macht also einen Unterschied, ob man Funktions- oder Objektnamen mit kleinen
oder großen Buchstaben aufruft.
Auch bei Matrizen erfolgt der Zugriff auf einzelne Elemente mit Hilfe von eckigen
Klammern. Dabei werden die Indizes der Zeilen und Spalten durch ein Komma getrennt.
## b
## 6
## [1] 1 2 3
## a b
## 2 5
## [1] 5 6
Möchte man eine Matrix direkt definieren, nutzt man den Befehl matrix(). Die Anzahl
der Zeilen (Spalten) wird mit Hilfe des Arguments nrow (ncol) festgelegt.
M1 <- matrix(1:6,nrow=2)
M1
10
M2
## [,1] [,2]
## [1,] "A" "D"
## [2,] "B" "E"
## [3,] "C" "F"
a <- 2
b <- 3
a + b # Addition
a - b # Subtraktion
a * b # Multiplikation
a / b # Division
b %% a # Division mit Rest (Modulo)
2^3 # Potenzierung
sqrt(2) # Quadratwurzel von 2
log(2) # Natuerlicher Logarithmus von 2
exp(2) # Wert der Exponentialfunktion an der Stelle 2
v %*% v
## [,1]
## [1,] 5
v %*% M
## [,1] [,2]
## [1,] 14 20
11
M %*% v
## [,1]
## [1,] 16
## [2,] 19
Für Operationen wie das Transponieren oder das Berechnen der Determinante stehen
wiederum entsprechende Funktionen zur Verfügung.
# Transponieren
t(M)
# Determinante
det(M)
a <- 1:3
M <- matrix(1:6, ncol=2)
## [1] 6
## [1] 21
## [1] 6 15
## [1] 6
sum(M[,2])
## [1] 15
12
Um den Mittelwert der Elemente des Vektors a zu ermitteln, könnte man natürlich die
soeben errechnete Summe einfach durch die Anzahl der Elemente des Vektors teilen.
Diese kann man mit length() ausgeben lassen. Die Funktion mean() nimmt einem
diesen Arbeitsschritt ab.
## [1] 3
## [1] 2
## [1] 2
## [1] 1
## [1] 1
b <- c(4,-5,6)
cov(a,b) # der Kovarianz,
## [1] 1
## [1] 0.1707
Nebenbei bemerkt lohnt es sich, ab und an einen Blick in die Dokumentation oder eine
Suchmaschine zu werfen, um zu prüfen, ob es nicht bereits implementierte Funktionen
(und somit Pakete) gibt, die vor unnötig viel Aufwand schützen (bei sinkendem Lerneffekt
versteht sich).
2.3 Wahrscheinlichkeitsverteilungen
Als statistische Software beherrscht R natürlich auch den Umgang mit Wahrscheinlich-
keitsverteilungen. Dazu zählen vor allem das Ziehen von Zufallszahlen oder aber das
Arbeiten mit den jeweiligen Dichte- und Verteilungsfunktionen. Als Beispiel schauen wir
uns an, wie die Normalverteilung in R implementiert ist. Rufen Sie dazu die Hilfe-Seite
13
?Normal auf.
Wie Sie im Abschnitt Usage erkennen können, stehen Ihnen vier verschiedene Funktionen
zur Verfügung, deren Namen sehr ähnlich sind:
1. rnorm()
Generierung von normalverteilten Zufallszahlen. Das r steht hier für ”random”.
2. dnorm()
Gibt die Dichte f (x) (d=”density”) einer Normalverteilung an einem oder mehreren
bestimmten Punkten wieder.
3. pnorm()
Gibt den Wert der Verteilungsfunktion F (x) einer Normalverteilung wieder. Hier
steht das p für ”probability”.
4. qnorm()
Stellt die Quantilsfunktion F −1 (x) (q = ”quantile”) einer Normalverteilung dar.
Nehmen wir an, wir möchten eine zufällige Zahl aus einer Normalverteilung mit Erwartungs-
wert 10 und Varianz 9 ziehen. Dies geschieht mit dem Befehl rnorm(1,mean=10,sd=3).
Das erste Argument steht für die Anzahl der zu ziehenden Zahlen, mean für den Er-
wartungswert und sd für die Standardabweichung (nicht die Varianz!) der Normalver-
teilung. Übergeben wir nur das erste Argument, setzt R den Erwartungswert und die
Standardabweichung automatisch auf 0 beziehungsweise 1, was dem Ziehen aus einer
Standardnormalvertielung entspricht.
## [1] 7.666
## [1] 0.5059
# Ziehe 5 Zufallszahlen
rnorm(5)
14
Je nachdem aus welcher Verteilung man ziehen möchte, ändern sich die Funktionsar-
gumente. Das Ziehen einer gleichverteilten Zufallszahl auf dem Intervall von 5 bis 10
beispielsweise ist mit der Funktion runif(1,min=5,max=10) möglich. Die Argumente
min und max sind dabei selbsterklärend.
## [1] 8.822
Die anderen drei Funktionen arbeiten ähnlich. Auch ihnen müssen die Parameter der
jeweiligen Verteilung übergeben werden. Sie unterscheiden sich hauptsächlich in ihrem
ersten Argument.
## [1] 0.3989
## [1] 0.95
## [1] 1.645
15
Durch die Funktion attach() importieren wir (vereinfacht gesagt) die 50 Beobachtungen
umfassenden Vektoren dist und speed des Beispieldatensatzes “cars”, um direkt über
ihren Namen Zugriff auf sie zu bekommen.
Der Rückgabewert von lm() ist ein Objekt der Klasse ”lm”, welches nichts anderes ist
als eine Liste mehrerer Komponenten der vorgenommenen Schätzung. Diese Liste können
Sie sich mit der Funktion names() ausgeben lassen.
## coefficients
## residuals
## effects
## rank
## fitted.values
## assign
## qr
## df.residual
## xlevels
## call
## terms
## model
Zugriff auf die einzelnen Komponenten einer Liste erhält man mittels des $ - Operators.
## (Intercept) speed
## -17.579 3.932
## 1 2 3 4 5 6
## 3.849 11.849 -5.948 12.052 2.120 -7.813
16
Einen Überblick über die Schätzung bekommen wir durch die Funktion summary(). Diese
kann auf beinahe jedes beliebige Objekt angewendet werden und liefert eine Übersicht der
deskriptiven Kennzahlen oder aber, wie hier, eine spezielle Aufbereitung der Schätzung.
summary(model)
##
## Call:
## lm(formula = dist ~ speed)
##
## Residuals:
## Min 1Q Median 3Q Max
## -29.07 -9.53 -2.27 9.21 43.20
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -17.579 6.758 -2.60 0.012 *
## speed 3.932 0.416 9.46 1.5e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 15.4 on 48 degrees of freedom
## Multiple R-squared: 0.651,Adjusted R-squared: 0.644
## F-statistic: 89.6 on 1 and 48 DF, p-value: 1.49e-12
17
2.5 Grafische Darstellung
Die Plotmöglichkeiten in R sind mittlerweile so vielfältig, dass nahezu jede gewünschte
Grafik, jedes Diagramm oder aber geografisches Kartenmaterial zur Visualisierung genutzt
werden kann. Im Rahmen dieser Einführung beschäftigen wir uns jedoch nur mit den
Basis-Funktionen.
Gerade in diesem Kapitel ist es wichtig, mit all den grafischen Funktionen und
Parametern (Dokumentation!) herumzuspielen. So lernt man schnell eine Viel-
zahl an Möglichkeiten kennen.
Am besten eignet sich dafür einer der internen Datensätze, wie zum Beispiel “cars” oder
“faithful”. Eine Übersicht aller Datensätze finden Sie übrigens mit library(help =
datasets).
Wir werden ein paar grundlegende Diagramm-Typen anhand des zuvor genutzten Daten-
satzes cars illustrieren. Laden Sie diesen erneut mittels attach(cars).
My First Plot
120
100
80
60
40
20
0
18
A histogram!
15
Frequency
10
5
0
0 20 40 60 80 100 120
dist
Pie Chart
Below 10mph
Above 10mph
19
2.5.4 Das Balkendiagramm
120
100
80
60
40
20
0
Observations
attach(cars)
# Punktewolke der Merkmale dist und speed mit
# blauen Punkten und Achsenbeschriftungen.
plot(y=dist,x=speed,col="blue", xlab="Speed",ylab="Distances")
20
120
100
80
Distances
60
40
20
0
5 10 15 20 25
Speed
Einen Linienchart schauen wir uns mit Hilfe von 50 Realisierungen einer standardnormal-
verteilten Zufallsvariable an. In der Regel macht ein solcher Plot bei Merkmalen Sinn, die
über die Zeit beobachtet wurden (Stichwort Zeitreihen, Bsp.: Aktienkurs).
0
−1
−2
−3
0 10 20 30 40 50
Index
Alle Plots können nachträglich noch durch weitere Komponenten ergänzt werden. Bei-
spielsweise könnte in eine Punktewolke noch eine Linie gezeichnet werden. Dies ist mit
den Funktionen abline() oder lines() möglich. Auch einzelne Punkte können mit
points() besonders markiert oder hinzugefügt werden. Als Beispiel nehmen wir den
soeben erstellten Scatterplot.
21
attach(cars)
# Punktewolke der Merkmale dist und speed
# mit zusätzlich eingezeichneter Regressionsgerade
model <- lm(dist~speed)
plot(y=dist,x=speed, xlab="Speed",ylab="Distances")
abline(model$coefficients,col="blue")
# Beobachtung 49 scheint ein Ausreißer zu sein.
# Markieren wir diesen in rot und mit einem Dreieck.
points(x=speed[49],y=dist[49],col="red",pch=2,lwd=2)
# 'pch' := 'plotting character'; 2 = Dreieck
# 'lwd' := 'line width'; Stärke der Linie/des Punktes
120
100
80
Distances
60
40
20
0
5 10 15 20 25
Speed
22
2.6 Einlesen von Daten
R ist in der Lage eine Vielzahl an Dateien zu lesen. Dazu zählen beispielsweise Dateien
vom Typ *.csv (”comma seperated values”) oder Excel-Spreadsheets mit den Endungen
*.xls und *.xlsx. Aber auch Datensätze die mit anderen statistischen Programmen wie
Stata erstellt wurden (*.dta), können importiert werden. Wer daran interessiert ist, sollte
einen Blick auf die Pakete foreign und XLConnect werfen.
An dieser Stelle gehe ich kurz auf das Einlesen von CSV-Dateien ein. Dazu verwendet
man die Funktion read.csv().
CSV-Dateien sind nichts anderes als Textdateien die Daten enthalten. Einzelne Beobach-
tungen sind in der Regel durch Kommata (oder ein anderes Zeichen) getrennt. Um das
zu verdeutlichen, erstellen wir einen Beispiel-Datensatz. Öffnen Sie dazu den einfachen
Text-Editor (TextEdit unter Mac) und schreiben Sie folgende drei Zeilen:
"x","y"
1.5,-3.5
-10,6.32
Wichtig ist, die letzte Zeile noch durch Drücken der Enter -Taste abzuschließen. Speichern
Sie anschließend die Datei unter dem Namen ”test.csv” auf dem Desktop ab.
Um die Daten nun einzulesen, müssen wir R mitteilen wo sie liegt, wie sie heißt und wie
sie formatiert ist. Dies alles geschieht mit folgendem Code:
## x y
## 1 1.5 -3.50
## 2 -10.0 6.32
Das Attribut dec legt also fest, welches Dezimalzeichen genutzt wird, während mit sep
das Zeichen übergeben wird, welches die einzelnen Beobachtungen trennt. In diesem Fall
das Komma.
Streng genommen ist die Endung der Datei in diesem Fall nicht wichtig. Auch eine
*.txt-Datei wird als CSV-Datei erkannt, sofern sie ebensolche Daten enthält. Sollte es
beim Einlesen von CSV-Dateien Probleme geben, schauen Sie sich die Dokumentation zu
oben genutzter Funktion an. Es gibt noch eine Reihe weiterer Argumente, mit denen das
Einlesen genau gesteuert werden kann.
23
Funktionsübersicht
abline, 21 matrix, 10
attach, 16 mean, 13
barplot, 20 pie, 19
boxplot, 18 plot, 20
pnorm, 14
c, 9
points, 21
cbind, 9
colSums, 12 qexp, 14
cor, 13 qnorm, 14
cov, 13
rbind, 9
det, 12 read.csv, 23
dnorm, 14 rnorm, 14
dunif, 14 rowSums, 12
exp, 11
sd, 13
head, 16 seq, 9
help, 9 solve, 12
hist, 18 sqrt, 11
sum, 12
install.packages, 6 summary, 17
length, 13, 19 t, 12
library, 7 truehist, 7
lines, 21
log, 11 var, 13
24