eine einführung in die statistik-software r
TRANSCRIPT
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
1/81
Eine Einfhrung in die
Statistik-Software R
Daniel Jones
16. September 2013
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
2/81
Dieses Skript basiert auf dem RRZN-Handbuch Statistik mit R- Grundlagen der Da-
tenanalyse, 1. Auflage, Mai 2011 sowie dem Buch Programmieren mit R von Uwe
Ligges, 3. Auflage, Juli 2008, sowie zu Teilen auf dem Skript Programmieren und Sta-
tistik mit R zum gleichnamigen Kurs von Tina Felber aus dem Sommersemester 2012.
Es stellt nur eine Einfhrung dar und erhebt keinen Anspruch auf Vollstndigkeit. Ins-besondere wird es durch die zugehrigen bungen ergnzt, so dass nicht alle Befehle
und Erklrungen im Skript auftauchen.
2
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
3/81
Inhaltsverzeichnis
1 Einfhrung 5
1.1 ber R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.1.1 Was ist R? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.1.2 WarumR? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.1.3 Literatur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.1.4 Starten vonR. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.1.5 Hinweise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.2 Rals Taschenrechner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.3 Hilfe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.4 Zuweisungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.5 Logik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.6 Der Arbeitsplatz (Workspace) . . . . . . . . . . . . . . . . . . . . . . . . 12
1.7 Das Skriptfenster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.8 Zusatzpakete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2 Datentypen und -strukturen 16
2.1 Datentypen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.2 Vektoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.2.1 Folgen und Wiederholungen . . . . . . . . . . . . . . . . . . . . . 18
2.2.2 Rechnen mit Vektoren . . . . . . . . . . . . . . . . . . . . . . . . 19
2.2.3 Indizierung von Vektoren . . . . . . . . . . . . . . . . . . . . . . . 20
2.3 Matrizen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.3.1 Rechnen mit Matrizen . . . . . . . . . . . . . . . . . . . . . . . . 222.3.2 Indizierung von Matrizen . . . . . . . . . . . . . . . . . . . . . . . 23
2.4 Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.5 Listen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.6 Dataframes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.7 Verschiedenes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.7.1 Eigenschaften von Datenstrukturen . . . . . . . . . . . . . . . . . 25
3
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
4/81
2.7.2 Faktoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3 Programmieren 27
3.1 Eigene Funktion definieren . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.2 Bedingte Anweisungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293.3 Schleifen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.4 Vektorwertiges Programmieren . . . . . . . . . . . . . . . . . . . . . . . . 34
3.5 Sonstiges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4 Datenmanagement 40
4.1 Data frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4.1.1 Indizierung und Teilauswahl . . . . . . . . . . . . . . . . . . . . . 41
4.1.2 Umbenennen und Lschen von Variablen . . . . . . . . . . . . . . 44
4.1.3 Hinzufgen neuer Variablen . . . . . . . . . . . . . . . . . . . . . 474.1.4 Aufteilen und Zusammenfhren von Datenstzen . . . . . . . . . 47
4.1.5 Verschiedenes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.2 Datenimport und Datenexport . . . . . . . . . . . . . . . . . . . . . . . . 51
4.2.1 Dateneingabe inR . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.2.2 Einlesen von externen Datenstzen . . . . . . . . . . . . . . . . . 53
4.2.3 Daten exportieren . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
5 Grafik 60
5.1 High-level Grafik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605.2 Konfigurierbarkeit von Grafiken . . . . . . . . . . . . . . . . . . . . . . . 62
5.3 Low-level Grafik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
5.4 Mathematische Beschriftung . . . . . . . . . . . . . . . . . . . . . . . . . 72
5.5 Grafiken exportieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
6 Statistik 76
6.1 Verteilungen und Stichproben . . . . . . . . . . . . . . . . . . . . . . . . 76
6.2 Einfache lineare Regression . . . . . . . . . . . . . . . . . . . . . . . . . . 79
6.3 Statistische Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 806.4 Ntzliche Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
4
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
5/81
Kapitel 1
Einfhrung
Dieses Kapitel beinhaltet eine (zum Teil) sehr knapp gehaltene Einfhrung.
1.1 ber R1.1.1 Was ist R?
Frei verfgbare Programmiersprache
Programmpaket zur statistischen Datenanalyse und Grafikerstellung
Basiert auf der Programmiersprache S (heute: S-PLUS)
Homepage von R:http://www.r-project.org/
Installation von R:
http://cran.r-project.org/mirrors.html
1.1.2 Warum R?
Vorteile von R:
kostenlos Open-Source-Software
keine Blackbox, alles kann nachvollzogen werden
Flexibilitt
Auf allen gngigen Rechnersystemen (Windows, Macintosh, UNIX) lauffhig
5
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
6/81
Aktualitt (Zusatzpakete)
weit verbreitetschnelle Hilfe
Nachteile von R:
Keine vollkommene Sicherheit bei der Verwendung
Keine graphische Oberflche, Zusatzpakete wie der R-Commander schaffen hierAbhilfe.
1.1.3 Literatur
Statistik mit R, RRZN-Handbuch. (Erhltlich im HRZ.)
Ligges, U. Programmieren mit R. Springer.
Wollschlger, D. Grundlagen der Datenanalyse mit R. Springer.
Chambers, J. Software for Data Analysis: Programming with R (Statistics andComputing). Springer.
1.1.4 Starten von R
Bei Rechnern im Mathebau ist R schon vorinstalliert. Start: Terminal aufrufen und ReingebenKonsole ffnet sich, siehe Abbildung
1.1
Nach dem Prompt (>) werden die Befehle eingegeben.
Durch Drcken von ENTER werden diese ausgefhrt.
1.1.5 Hinweise
R unterscheidet Gro- und Kleinschreibung. Kommentare knnen nach einer # eingegeben werden, Befehle nach einer # werden
ignoriert.
Leerzeichen sind erlaubt und machen Programme bersichtlicher.
ber .Last.valuekann der letzte berechnete Wert angesprochen werden
6
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
7/81
Abbildung 1.1: Screenshot der R Console unter Windows
1.2 R als Taschenrechner
Die blichen Rechenregeln werden natrlich beachtet.
Besteht der Imaginrteil einer komplexen Zahl nur ausimuss dieser mit 1ieinge-geben werden.
Per Voreinstellung zeigt R genau 7 Stellen des Ergebnisses an. Mitoptions(digits = a) werden a-stellige Ergebnisse (a 22) ausgegeben. Freine einmalige Ausgabe eines hherstelligen Ergebnisses bietet sich der Befehl
print(Berechnung, digits= a)an.
Viele elementare Funktionen sind in R bereits vorporgrammiert (vgl. Tabelle 1.1).
Funktionsaufruf geschieht wie folgt: funktionsname(Argument1 = x1,Argument2 = x2,...)
Fr manche Argumente gibt es Voreinstellungen (default). Diese mssen dannnicht zwingend angegeben werden
Beispiel: round(5.2) ergibt keine Fehlermeldung, da als Voreinstellung 0 Nach-kommastellen eingestellt sind.
7
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
8/81
Voreinstellungen fr Argumente findet man auf der Hilfeseite der Funktionen (siehenchster Abschnitt)
Symbol, Funktion Beschreibung
+, Addition, Subtraktion, / Multiplikation, Division
oder Potenz%/% Ganzzahlige Division
%% Modulo Division
max(), min() Maximum, Minimum
abs() Betrag
factorial() Fakultt
choose(n,k) Binomialkoeffizientnk
sqrt() Quadratwurzel
sum(), prod() Summe, Produkt
log(), log10(), log2(), log(x, base=b) Logarithmen
exp() Exponentialfunktion
sin(), cos(), tan(), asin(), ... trigonometrische Funktionen
round(), floor(), ceiling() Runden
pi
Inf, -Inf Unendlichkeit (infinity)
NaN nicht definiert (Not a Number)NA fehlende Werte (Not Available)
NULL leere Menge
Tabelle 1.1: Einige elementare Funktionen (und Symbole), die in R bereits vorporgram-
miert sind.
1.3 Hilfe
Die Benutzung der Hilfe gehrt zum Prozess des Lernens einer neuen Programmierspra-
che dazu. R bietet drei Klassen an Hilfemglichkeiten an, die ntzlich sind, wenn z.B.
nach einer korrekten Spezifikation der Argumente einer Funktion oder sogar nach dem
Namen der Funktion selbst gesucht wird.
8
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
9/81
1. Hilfe in Form von Literatur:
Es gibt sehr viele Bcher ber R (meist in englischer Sprache) und Handbcher.
Einige werden in der Regel mit dem Programm gleich mitinstalliert. Man findet
diese als pdf-Datei entweder im Men (nur Windows) unter Hilfe Handb-cher (PDF)oder in dem Ordnerverzeichnis, in dem R installiert wurde (meist un-terC:/Programme/R/R-2.12.1). Im Unterverzeichnis... /doc/manualssind
dann die Handbcher zugnglich. Ansonsten ffnet der Aufruf von help.start()
die R-Dokumentation (unabhngig vom Betriebssystem), auch dort findet man
Handbcher und FAQs.
2. Hilfe, die im Programm integriert ist:
Mit ?helpffnet sich das integrierte Hilfesystem von R und gibt eine kurze ber-
sicht ber die unterschiedlichen Arten, Hilfe in Anspruch zu nehmen.
Befehl Beschreibung
help(Name) Hilfe zur Funktion Name()
?Name Hilfe zur Funktion Name()
example(Name) Kurzes Beispiel zur Funktion Name()
help.search(Nam) Durchsucht alle Hilfeseiten nach Nam
??Nam Durchsucht alle Hilfeseiten nach Nam
apropos(Nam) Sucht Funktionen, in denen Nam vorkommt
Beendet wird die Hile im Terminal unter Linux mit der Taste q. Die Informationen
werden sehr knapp prsentiert, was am Anfang vielleicht etwas irritierend ist. Mit
etwas bung im Lesen solcher Hilfeseiten wird man jedoch irgendwann diesen
przisen Prsentationsstil zu schtzen wissen.
3. Hilfe, die online verfgbar ist:
ber die Mailingliste R-help. In Mailinglisten stellen Benutzer Fragen zum
Umgang mit R, ber die sie weder in der Literatur noch auf Hilfesei-
ten/Archiven fndig geworden sind. Meist wird die Frage innerhalb krzesterZeit von der R-Gemeinde umfassend beantwortet. Eine bersicht erhlt man auf
http://www.R-projct.org/mail.html.
9
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
10/81
1.4 Zuweisungen
Ergebnisse sollen beim Programmieren oft als Objekte gespeichert werden, damit
sie spter weiter verwendet werden knnen. Hierfr wird der Zuweisungspfeil ( a a # Erst nach Eingabe des Objektes . . .
[1] 3 # . . . wird das Ergebnis ausgegeben.
> (a a < pi # Falls Leerzeichen im Zuweisungspfeil, . . .[1] FALSE # . . . keine Zuweisung logische Abfrage.
> A # Gro- und Kleinschreibung wird beachtet.
Error: object A not found
1.5 LogikUm spter Funktionen zu schreiben, aber auch zur Analyse von Daten, werden logische
Ausdrcke bentigt.
Funktion, Operator, Wert Beschreibung
==, != gleich, ungleich
>, >= grer als, grer gleich
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
11/81
Die AbkrzungenT und F sind trgerisch, da man diese unter Umstnden als Variablen-
namen verwendet. Am besten sowohl diese beiden Abkrzungen, als auch die Belegung
von T und F vermeiden.
Zur Verdeutlichung der Operatoren einige Beispiele:
4< 3 FALSE(3 + 1) != 3 TRUE-3
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
12/81
Fehlende Werte
Eine weitere logische Konstante ist NA, was fr fehlenden Wert steht (Not Available).
Auch undefinierte Werte NaN(Nota Number) werden wie NAs behandelt. Weitere Ope-
rationen:
is.na()(Test auf fehlende Werte eines Vektors)
is.nan()(Test auf undefinierte Werte eines Vektors)
na.omit()(reduziert Vektoren um die fehlenden Werte)
1.6 Der Arbeitsplatz (Workspace)
Ergebnisse von Berechnungen ohne Zuweisung werden direkt in der Konsole ausgegeben,wohingegen Zuweisungen von R gespeichert und im sogenannten Workspace gelagert
werden.
Befehl Beschreibung
ls() Anzeigen aller Objekte im Workspace
rm(Objektname) Lschen eines Objektes aus Workspace
rm(list=ls()) Lschen aller Objekte aus dem Workspace
save(file=Pfadname.RData, Speichert die Objekte O1,..., On
O1,..., On) in eigenen Workspacesave.image(file=Pfadname.RData) Speichert den aktuellen Workspace
load(Pfadname.RData) Laden eines gespeicherten Workspaces
q() Beenden von R
getwd() Zeigt das Arbeitsverzeichnis an
setwd(Pfadname) ndert das Arbeitsverzeichnis
history() Anzeige der zuletzt eingegebenen Befehle
Die zugewiesenen Objekte werden nur fr die aktuelle R-Sitzung gespeichert. NachSchlieen von R und erneutem ffnen stehen diese Objekte dann nicht mehr zur Verf-
gung, es sei denn, man hat den Workspace vorher gespeichert. Um beim Speichern des
Workspaces mitsave.image(file=C:/R/Ausgaben/Test.RData)die Eingabe des
oft langen Pfadnamens zu vermeiden, kann man ihn mit save.image(Test.RData) im
Arbeitsverzeichnis speichern. Bei Schlieen von R wird man gefragt, ob der Workspace
12
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
13/81
gesichert werden soll. Klickt man auf Ja, wird der aktuelle Workspace in der Da-
tei .RDataim Arbeitsverzeichnis gespeichert. Zustzlich wird die history in der Datei
.Rhistory im Arbeistverzeichnis gespeichert. Diese beinhaltet eine komplette Liste der
bei der letzten R-Sitzung eingegebenen Befehle.
1.7 Das Skriptfenster
Das Skriptfenster (nur unter Windows) bietet sich besonders bei der Eingabe von hufig
verwendeten und langen Befehlen an. Man ffnet es im Men ber Datei NeuesSkript. Durch Markieren des Codes und Drcken von Strg+R wird die Funktion dann
in der Konsole ausgefhrt. Das Speichern der Skriptdatei geschieht ebenfalls ber das
Men, das Laden mit source(Pfadname.r).
Alternativ dazu bietet der R Commander eine graphische Oberflche (vgl. Abb. 1.2),
welche auch unter Linux luft. Paket installieren: install.packages(Rcmdr). Laden
und erstmaliges ffnen:library(Rcmdr). Ab dann mit Commander().
1.8 Zusatzpakete
ber 4500 Zusatzpakete zu diversen Themen sind erhltlich, darunter z.B. Themen wie
Differential Equations
13
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
14/81
Abbildung 1.2: Screenshot des RCommanders
Finance
Graphics
Optimization
Time Series
(...)
Eine bersicht (auch nach Themen geordnet) ber alle Zusatzpakete findet man unter
http://cran.r-project.org/web/packages/.
14
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
15/81
Befehl Beschreibung
install.packages(nortest) Installiert das Paket nortest
update.packages(nortest) Fhrt ein Update fr das Paketnortestdurch
update.packages(ask=FALSE) Alle installierten Pakete werden upgedatet
remove.packages(nortest) Lscht das Paket nortestsearch() Zeigt alle aktuell geladenen Pakete an
library() Zeigt installierten Pakete an
library(nortest) Ldt das Paket nortest in den Workspace
library(help=nortest) ffnet das Hilfefenster zum Paket nortest
detach(package:cluster) Entfernt das Paket nortest aus dem Workspace
15
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
16/81
Kapitel 2
Datentypen und -strukturen
In Rist alles ein Objekt (Vektoren, Matrizen, (...), Funktionen). Je nach Struktur ha-
ben die Objekte verschiedene Eigenschaften. In diesem Kapitel sollen die wichtigsten
Datenstrukturenvorgestellt werden. Hierbei handelt es sich um eine Art der Darstellung
von Daten. Je nach Problemstellung und Art der Daten gibt es verschiedene geeignete
Datenstrukturen. Wir werden kennenlernen:
Vektoren, Matrizen, Arrays
Listen
Dataframes
2.1 Datentypen
Bevor wir auf Datenstrukturen eingehen, ist es wichtig zu wissen, was fr Datentypenes
gibt. R unterscheidet je nach Werten eines Ob jektes zwischen verschiedenen Datentypen:
Tabelle 2.1: Die verschiedenen Datentypen.
Datentyp Beschreibung Beispiel
NULL die leere Menge NULL
logical logische Werte FALSE
numeric ganze und reelle Zahlen 3.14
complex komplexe Zahlen 2.13+5i
character Buchstaben, Zeichenfolgen Hallo
16
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
17/81
Die leere Menge ist bei den Datentypen ein Sonderfall und wird nur der Vollstndigkeit
halber in der Tabelle mit aufgefhrt. Fr die restlichen aufgefhrten Datentypen gilt,
dass jeder Datentyp durch die in der Tabelle unter ihm liegenden Datentypen dargestellt
werden kann, aber nicht umgekehrt. Man kann z.B. eine reelle Zahl immer als komplexe
Zahl interpretieren, (bei der der Imaginrteil Null ist,) aber niemals umgekehrt. BeimDatentyp logicalwird TRUE als 1und FALSE als 0 gespeichert:
>TRUE + FALSE + TRUE
[1]2
Wichtige Funktionen im Zusammenhang mit Datentypen:
Befehl Beschreibung
mode() Abfragen des Datentyps (Modus)is.Datentyp() Test, ob Objekt bestimmten Datentyp hat
as.Datentyp() Erzwingen eines Datentyps
Beispiel:
mode(3.7) "numeric"is.complex(3.7) FALSEas.complex(3.7)
3.7+0i
2.2 Vektoren
Vektoren sind diegrundlegende Datenstruktur in R, denn fast alle Datentypen werden
programmintern als Vektoren interpretiert. Mit der Funktion c() (steht fr combine
bzw. concatenate) kann man am einfachsten Vektoren erzeugen:
>(xx
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
18/81
Ein Vektor muss nicht nur aus Zahlen bestehen, beliebige Elemente aus Tabelle 2.1 sind
mglich. Dabei werden dann alle Elemente des Vektors als der im Vektor vorkommende
Datentyp interpretiert, der in der Tabelle am weitesten unten steht.
>(yc(WertA = 5, WertB = 4) # Benennen der Elemente
WertA WertB
5 4
2.2.1 Folgen und Wiederholungen
Ist es notwendig, Vektoren mit bestimmtem Regelmigkeiten zu erstellen (zum Beispiel
Indexvektoren), so existieren effektivere Mglichkeiten als c():
Befehl Beschreibung
a:b Ganzzahlige Zahlenfolge (a, b )seq(Startwert, Endwert, by=Schrittweite) Zahlenfolge beliebigen gleichen Abstands
seq(Startwert, Endwert, length=Lnge) Zahlenfolge mit vorgegebener Lnge
rep(Objekt, Anzahl der Wiederholungen) Wiederholen desselben Objektes
Beispiel:
>4:2 # Ganzzahlige Zahlenfolge[1]4 3 2 1 0 -1 -2
>seq(-1, 1, by = 0.5) # Zahlenfolge mit beliebigem Abstand
[1]-1.0 -0.5 0.0 0.5 1.0
>rep(c(1,2), 3) # 3-maliges Wiederholen des Vektors (1, 2)t
[1]1 2 1 2 1 2
18
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
19/81
>rep(c(1,2), each=3)
[1]1 1 1 2 2 2
>rep(c(1,2,3), 2:4 )
[1]1 1 2 2 2 3 3 3 3
2.2.2 Rechnen mit Vektoren
Das Rechnen mit Vektoren geschieht komponentenweise. Wenn die Lngen zweier Vekto-
ren nicht bereinstimmen, die Lnge des greren Vektors aber ein Vielfaches der Lnge
des kleineren Vektors ist, wird der krzere Vektor so oft wie ntig wiederholt. Stimmen
die Dimensionen auch nicht in Vielfachen berein, wird so lange aufgefllt, bis die
Dimension wieder passend ist, es erscheint jedoch eine Warnmeldung.
> (-2 : 2) 4 # komponentenweise[1] -8 -4 0 4 8
> c(1,2,3,4) c(0,10) # Wiederholung des krzeren[1]0 20 0 40 # Vektors
> c(1,2,3) c(0,10) # Wiederholung des krzeren[1] 0 20 0 # Vektors mit Warnmeldung
Warnmeldung: In a b : Lnge deslngeren Objektes ist kein Vielfaches
der Lnge des krzeren Objektes
Mchte man keine komponentenweise Multiplikation durchfhren, sondern eine Matrix-
multiplikation, so verwendet man den Operator % %:
> t((1:3)) %% (4:6) # Skalarprodukt[, 1]
[1, ] 32
Hier wird ersichtlich, dass R Vektoren standardmig als stehende Vektoren interpre-
tiert. Dasselbe Ergebnis erhlt man durch Eingabe von (1:3) %% (4:6). Wenn dieDimensionen nmlich nicht passen, aber durch Transponieren des ersten Vektors passend
gemacht werden knnen, berechnet R das Skalarprodukt. Das Matrixprodukt erhlt man
durch
19
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
20/81
> (1:3) %% t((4:6)) # Matrixprodukt: 2. Vektor transponieren![, 1] [, 2] [, 3]
[1, ] 4 5 6
[2, ] 8 10 12
[3, ] 12 15 18
Auch die Anwendung der elementaren Funktionen aus Tabelle 1.1 ist mglich und ge-
schieht wieder komponentenweise. Weitere ntzliche Funktionen im Zusammenhang mit
Vektoren sind
Befehl Beschreibung
crossprod() schneller als %%length() Lnge eines Vektors
mean() Arithmetisches Mittel aller Eintrge
sum() Summe aller Eintrge
cumsum() Kumulierte Summe aller Eintrge
prod() Produkt aller Eintrge
cumprod() Kumuliertes Produkt aller Eintrge
sort() Sortieren
order() Vektor der zum Sortieren gehrenden Indexzahlen
rank() Vektor der Rnge
rev() Umkehren eines Vektorsunique() entfernt mehrfach vorkommende Elemente
which() Index der Elemente, die TRUE sind
which.max() Zeigt den Index des maximalen Wertes an
numeric(n) erzeugt einen Vektor mit nNullen
2.2.3 Indizierung von VektorenEinzelne, aber auch mehrere Elemente eines Vektors gleichzeitig knnen mit Hilfe der
zugerigen Indizes angesprochen werden. Dabei ist es mglich, sich die Werte ausgeben
zu lassen, diese aber auch durch neue Werte zu ersetzen. Dies geschieht durch Nachstellen
der Indizes in eckigen Klammern. Mchte man also auf das 5. Element des Vektors x
zugreifen, so geschieht das durch x[5]. Die Indizierung ist aber nicht auf eine einzelne
ganze Zahl beschrnkt:
20
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
21/81
Es knnen mehrere Indizes auf einmal angesprochen werden.
Ein vorangestelltes Minuszeichen whlt alleauerden entsprechenden Indizes aus.
Auch logische Indizierung ist mglich, wobei TRUE bedeutet, dass ein Elementausgewhlt wird. Hierbei muss die Lnge des Indexvektors mit dem des angespro-chenen bereinstimmen.
Benannte Elemente werden ber ihren Namen angesprochen.
Eine Ersetzung von Elementen erfolgt durch den Zuweisungspfeil.
Eine leere eckige Klammer []ersetzt alle Elemente eines Vektors, anstatt ihn zuberschreiben.
Beispiele:
x
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
22/81
2.3 Matrizen
Matrizen kann man mit der Funktionmatrix()erstellen. Die Argumente dieser Funktion
sind
Argumentname Beschreibungdata Vektor mit Daten
nrow Zeilenzahl
ncol Spaltenzahl
byrow Falls TRUE, wird Matrix zeilenweise aufgebaut
Tabelle 2.2: Argumente der Funktion matrix().
Beispiel:
>(A (B
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
23/81
Befehl Beschreibung
det() Determinante
diag() Abfragen und Setzen der Hauptdiagonalen
dim(), nrow(), ncol() Anzahl von Zeilen und Spalten
dimnames() Zeilen- und Spaltennamencbind(), rbind() Matrizen/Vektoren spalten-/zeilenweise zusammenfgen
eigen() Eigenwerte und -vektoren
kappa() Konditionszahl einer Matrix
qr() QR-Zerlegung
solve() Berechnen der Inversen bzw. Auflsen des GLSAx= b
svd() Singulrwertzerlegung
2.3.2 Indizierung von Matrizen
Auch hier gilt die Analogie zu den Vektoren. Auf das Element mit Index (i, j)der Matrix
A greift man mit A[i, j]zu. Mchte man die i-te Zeile betrachten, so geschieht dies
ber A[i, ]. Vllig analog fr die j-te Spalte A[ ,j]. Beispiel mit der Matrix B von
oben:
B[1,2] 2B[3,1]
5
B[2, ] 3 4B[ ,1] 4 3 5
Hierbei wurden jetzt jeweils immer Vektoren zurckgegeben. Mchte man die Daten
wieder als Matrix auslesen, so muss das Argumentdropmit FALSEbelegt werden, mehr
dazu in den bungen.
2.4 ArraysArrayssind eine Verallgemeinerung von Matrizen und knnen beliebig viele Dimensionen
besitzen. Arrays werden mit dem Befehl array()gebildet:
23
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
24/81
>(A (L1
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
25/81
> L1[[1]] # 1. Element von L1
[1] 1 2 5 4
> L1[[2]][2, 1] # Element[2, 1]des 2. Elements von L1
[1] 2
> L1[[c(3, 2)]] # Rekursiv: zunchst das 3. Element von L1,[1] Welt # dann davon das 2.
Wie auch Vektoren knnen die Elemente einer Liste benannt sein. Dies kann bei kom-
plizierten Objekten von Vorteil sein.
>L2
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
26/81
Beispiel:
> (X class(X)
[1]matrix"
> length(X)
[1]6
> mode(X)
[1]numeric"
> attributes(X) # Eine Matrix hat Dimensionsattribute
$dim[ 1 ] 2 3
2.7.2 Faktoren
Mchte man qualitative (diskrete) Merkmale darstellen, so bedient man sich des Daten-
typs Faktor. Dieser ist kein atomarer Datentyp im Sinne von Tabelle 2.1. Intern wird bei
der Erzeugung von Faktoren durch factor()eine Nummer vergeben, nach auen wirddiese aber durch einen Namen reprsentiert.
> (geschlecht (factor.geschlecht
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
27/81
Kapitel 3
Programmieren
In diesem Kapitel sollen die wesentlichen Elemente bereitgestellt werden, die man zum
Programmieren von eigenen Programmen bentigt. Dabei wird zunchst erklrt, wie man
eine eigene Funktion definiert. Anschlieend werden verschiedene Konstrukte wie zum
Beispiel Schleifen erklrt. Zum Abschluss wird noch auf den Vorteil von vektorwertigem
Programmieren eingegeangen.
3.1 Eigene Funktion definieren
Wir haben R bereits als berdimensionalen Taschenrechner kennengelernt. Hat man
nun eine ganze Folge solcher Berechnungen auf einmal durchzufhren und mchte dabei
evtl. sogar Parameter und Startwerte variieren, so bietet es sich an, dafr eine eigene
Funktion zu schreiben. Eine Funktionsdefinition hat die Form
Funktionsname standardabweichung
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
28/81
+ sqrt((1 / (n-1)) sum((y-mean(y)) 2))
+ }
kann die empirische Standardabweichung
Sn=
1n 1
ni=1
(yi y)2
fr y= (y1, y2, . . . , yn)berechnet werden und mit
> standardabweichung(rnorm(1000))
[1] 0.9816088
wird die empirische Standardabweichung von 1000 standardnormalverteilten Zufalls-zahlen berechnet. Hierbei ist zu beachten, dass als Ergebnis des Funktionsaufrufes
immer das zuletzt definierte Objekt zurckgegeben wird. Der Aufruf der Funktion
standardabweichung2()definiert durch
> standardabweichung2
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
29/81
Man kann bei der Definition der Funktion auch Voreinstellungen definieren:
Funktionsname< function(Argument1 = Vorgabe1, Argument2 = Vorgabe2,...){Befehlsfolge}
Wrde man die Funktion standardabweichung()ohne Argument aufrufen, so gbe eseine Fehlermeldung. Spezifiziert man aber ein Argument als Voreinstellung, so geschieht
dies nicht mehr:
> standardabweichung4
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
30/81
um Abbruchkriterien fr bestimmte Programmablufe zu definieren
zur Abfrage der Korrektheit von Funktionsargumenten
if ... elseDie klassische if ... else-Abfrage wird bei R wie folgt umgesetzt:
if (Bedingung.1) {Ausdruck.1}else if (Bedingung.2) {Ausdruck.2}
else {Ausdruck.k}
Dabei wird zunchst geprft, ob die Bedingung.1 erfllt ist, hierbei muss es sich also um
einen Wahrheitswert handeln. Gilt Bedingung.1=TRUE, so wird Ausdruck.1 ausgewer-
tet. Hierbei kann es sich um einen Funktionsaufruf handeln, um eine weitere Abfrage,
um die Zuweisung eines Objektes etc. Die weiteren Ausdrcke mit vorangestelltem else
ifwerden in diesem Falle nicht ausgewertet. Gilt Bedingung.1=FALSE, so wird Bedin-
gung.2 berprft usw. Es wird also der erste Ausdruck ausgewertet, dessen zugehrige
Bedingung TRUE ist. Ist keiner der Ausdrcke TRUE, so wird der Ausdruck nach dem
elseausgewertet.
Beispiel:
> g h if (g
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
31/81
Da g 0 gilt, wird die erste Anweisung ignoriert und stattdessen direkt die zweiteAnweisung durchgefhrt. Htte man zum Beispiel g switch(2, a=11,b=12,c=13,d=14)
[1] 12
Hierbei wurde als Expr die Zahl 2 verwendet, womit der zweite mgliche Fall eintritt.
Es ist auch mglich, auf die benannten Elemente zuzugreifen:
> switch(c, a=11,b=12,c=13,d=14)
[1] 13
3.3 Schleifen
Sollen bestimmte Rechenoperationen oft wiederholt werden, so lsst sich das durch
Schleifen bewerkstelligen. Ein klassisches Besipiel ist die Monte-Carlo-Simulation, in der
die gleiche Rechenoperation immer wieder mit verschiedenen (Pseudo-) Zufallszahlen
durchgefhrt wird. Eine bersicht ber die einzelnen Mglichkeiten fr Schleifen:
31
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
32/81
Schleife bzw. Kontrollwort Beschreibung
repeat{Ausdruck} Wiederholung des Ausdruckswhile (Bedingung){Ausdruck} Wiederholung solange Bedingung erfllt istfor (i in M){Ausdruck} Wiederhole Ausdruck fr jedesiMnext Sprung in den nchsten Interationsschrittbreak Sofortiges Verlassen der Schleife
Repeat
Eine einfache Schleifenkonstruktion wird durch repeat{Ausdruck}erzeugt. Dabei wird
der Ausdruck in der Klammer immer wieder wiederholt, wenn die Schleife nicht durch
das Kontrollwort break abgebrochen wird. Da ein einfaches Einfgen von break zum
sofortigen Abbruch der Schleife fhren wrde, bietet sich eine bedingte Abfrage an.
Beispiel fr eine Endlosschleife:
> j repeat{j j repeat{
+ j 4) break}
Die repeat-Schleife wird in der Regel nicht so hufig benutzt, wie die anderen Schlei-
fenkonstrukte.
While
Bei der while-Schleife wird ein Ausdruck immer wieder berprft und im Falle eines
TRUEder nachstehende Ausdruck ausgewertet. Tritt einmal der Wert FALSEauf, bricht
die Schleife ab. Die Beispiele von oben lassen sich auch mit whilebewerkstelligen:
32
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
33/81
> j while(j > -1){
+ j j while(j < 5){
+ j M for(j in M){
+ print(j2)}
Bei der Menge M muss es sich aber nicht um einen Vektor ganzer Zahlen handeln, M
kann ein beliebiges Objekt sein:
> M for(j in M){
+ print(j[1])}
[1] 3
[1] Test
Ntzlich im Zusammenhang mit der for-Schleife ist das Argument along der Funk-
tion seq(), die wir bereits kennengelernt haben. Durch die Anweisung for (i in
33
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
34/81
seq(along=d))wird jeder Index des Objektes ddurchlaufen, was manchmal sehr ntz-
lich sein kann. Da bei dieser Anweisung auch der Fall abgegolten ist, dass das Objekt
ddie Lnge 0 besitzt, ist sie der Anweisung for (i in 1:length(d))vorzuziehen. In
Fall length(d)=0 wrde bei for (i in seq(along=d)) nichts passieren, wohingegen
bei for (i in 1:length(d))unerwnschterweise der Vektor(1, 0)durchlaufen werdenwrde.
3.4 Vektorwertiges Programmieren
In Kapitel 2 wurde bereits angesprochen, dass Vektorendiegrundlegende Datenstruktur
inRsind. Deshalb sollte man, wann immer dies mglich ist, auch vektorwertig program-
mieren und Schleifen vermeiden. Natrlich existieren zu dieser Regel auch Ausnahmen,
zum Beispiel wenn der Speicherplatz nicht ausreicht. Trotzdem sollte man das vektor-
wertige Programmieren immer im Hinterkopf haben. Insbesondere sind Funktionen, die
in Rbereits vorimplementiert sind und vektorwertig arbeiten, immer vorzuziehen.
Beispiel (schlecht):
> d for (i in seq( along = d)) {
+ d[i] d
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
35/81
Tabelle 3.1: Funktionen fr vektorwertiges Programmieren
Funktion Beschreibung
colSums(), rowSums() schnelle Spalten-/ Zeilensummen
colMeans(), rowMeans() schnelle Spalten-/ Zeilenmittel
apply() spalten- und zeilenweises Anwenden einer
Funktion auf Matrizen bzw. Arrays
lapply() elementweises Anwenden einer Funktion auf
Listen, Datenstze und Vektoren
sapply() wielapply(), gibt einfaches Objekt zurck
mapply() multivariates lapply()
tapply() Tabellen gruppiert nach Faktoren
apply()
Die Funktionapply()(engl: anwenden) eignet sich zur Anwendung von Funktionen auf
Spalten oder Zeilen von Matrizen, ohne das das Programmieren einer Schleife notwendig
wird. Analog kann sie auch auf Arrays eingesetzt werden. Die allgemeine Form der
Funktion sieht wie folgt aus:
apply(X, MARGIN, FUN, ...)
Als Argumente gehen dabei die Matrix/der Array Xein, die beizubehaltende Dimension
MARGINsowie die anzuwendende Funktion FUN. Auerdem knnen durch ... noch Ar-
gumente der Funktion FUNweitergegeben werden. Als einfaches Beispiel betrachten wir
die Matrix A:
> (A
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
36/81
> for(i in 1 : (dim(A)[1]))
+ print(max(A[i, ]))
[1] 4
[1] 4[1] 5
Einfacher geht es durch Anwendung von apply():
> apply(A,1,max)
[1] 4 4 5
Analog die spaltenweisen Maxima:
> apply(A,2,max)
[1] 4 5
Es ist auch mglich, anonyme(unbenannte) Funktionen zu verwenden:
> apply(A,2, function(x) diff(range(x)) )
[1] 2 2
Hierbei wurde die sogenannte Spannweite der beiden Spalten der Matrix berechnet, alsodie Differenz aus dem maximalen und dem minimalen Wert. Die Funktion function(x)
diff(range(x))heit deshalb anonym, weil sie keinem Objekt zugweisen wurde. Aus
diesem Grund ist sie nach dem Aufruf von apply()auch nicht mehr verfgbar.
lapply() und sapply()
Mit lapply()(l fr list) lassen sich Funktionen elementweise in hoher Geschwindigkeit
auf Listen, Datenstze (dataframes, siehe nchstes Kapitel) und Vektoren anwenden. Die
Argumente sind dabei analog zu denen von apply() mit der Ausnahme, dass MARGIN
nicht bentigt wird. Es wird eine Liste ausgegeben, deren Lnge der des ursprnglichen
Objektes entspricht.
Beispiel:
36
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
37/81
> L lapply(L, mean)
$x
[1] 5.5
$y
[1] 3+0i
$z
[1] 3.5
In diesem Falle wird eine Liste zurckgegeben, die Datentypen werden beibehalten. Die
Funktionsapply()arbeitet vllig analog zu lapply(), versucht aber, das auszugebende
Objekt zu vereinfachen. Sind die auszugebenden Werte pro Element Skalare, so wirdanstelle einer Liste ein Vektor mit der entsprechenden Lnge ausgegeben:
> L sapply(L, mean)
x y z
5.5+0i 3.0+0i 3.5+0i
Um einen Vektor auszugeben zu knnen, wurden alle Datentypen in complexumgewan-
delt.
mapply()
Bei mapply() handelt es sich um eine Art multivariate Version von sapply(). Ihre
Funktionsweise lsst sich am besten an einem Beispiel erklren:
> mapply(sum, 1:10, 10:1, 5) # 1+10+5, 2+9+5, 3+8+5, ...
[1] 16 16 16 16 16 16 16 16 16 16
Hier werden die drei Objekte elementweise summiert, wobei der Skalar wie gewohntentsprechend solange erweitert wird, bis die Lngen bereinstimmen.
tapply()
Diese Funktion kann verwendet werden, um Statistiken von Daten nach Faktoren zu-
sammenzufassen. Argumente sind ein Vektor mit Daten, ein Faktor, nach dem gruppiert
werden soll (mit gleicher Lnge wie der Datenvektor) sowie die Funktion, die angewendet
werden soll.
37
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
38/81
Als Beispiel wird der irisDatensatz verwendet, der bereits aus der Beispielsitzung aus
der bung bekannt ist2:
> attach(iris) # Datensatz anhngen
> tapply(Sepal.Length, Species, mean)
setosa versicolor virginica
5.006 5.396 6.588
> tapply(Sepal.Width, Species, range)
$setosa
[1] 2.3 4.4
$versicolor
[1] 2.0 3.4
$virginica
[1] 2.2 3.8
> detach(iris)
Hier wurde zunchst nach Arten (Species) getrennt die mittlere Kelchblattlnge
(Sepal.Length) ermittelt. Anschlieend wurde durch die Funktion range() pro Art
das Minimum und Maximum der Kelchblattbreiten ausgegeben. An der Art der Aus-
gabe wird die hnlichkeit zur Funktion sapply() deutlich: Im ersten Fall wurden die
Skalare zu einem Vektor zusammengefasst. Im zweiten war dies nicht mglich, weshalb
die Ausgabe als Liste erfolgte.
3.5 Sonstiges
Es wurde bereits angesprochen, dass Programmschleifen wenn mglich zu vermeiden
sind. Hier noch ein paar kleine Anmerkungen/Tipps:
Zu Beginn Objekte, die pro Schleifendurchlauf wachsen, vollstndig initialisieren.Beispiel (schlecht):
2Der Aufrufattach() zum Anhngen von Datenstzen wird im Folgekapitel behandelt.
38
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
39/81
> a for(j in 1:n){
+ a a for(j in 1:n){
+ a[j] a for(j in 1:n){
+ a[j] for(j in 1:n){
+ a[j] a
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
40/81
Kapitel 4
Datenmanagement
In diesem Kapitel werden die Mglichkeiten vorgestellt, auf Datenstzen zu operieren
und diese zu manipulieren. Zunchst wird die wichtige Datenstruktur data frames ein-
gefhrt.
4.1 Data frames
Die meisten Datenstze in R sind als sogenannte data framesgespeichert. Dabei han-
delt es sich um eine spezielle Liste mit der Eigenschaft, dass alle Listeneintrge dieselbe
Lnge haben mssen. Insbesondere knnen also unterschiedliche Listeneintrge unter-
schiedliche Datentypen enthalten. Durch diese Eigenschaften ensteht eine matrixhnli-
che Struktur, die sich anbietet, um multidimensionale Datenstze zu reprsentieren: Die
Spalten der Matrix entsprechen den verschiedenen Variablen, die Zeilen entsprechen denBeobachtungen.
Als Beispiel kann man sich Daten zum Verlauf einer bestimmten Aktie vorstellen. In den
Spalten stehen die Variablen Tag Tageshoch, Tagestief Schlusskurs etc. Greift man
eine bestimmte Zeile heraus, so erhlt man zu einem gegebenen Tag das Tageshoch, das
Tegestief sowie den Schlusskurs der Aktie.
Um die verschiedenen Mglichkeiten der Operation auf data frames zu veranschaulichen,
soll als Beispiel die folgende Einkaufsliste betrachtet werden:
> Einkaufen
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
41/81
So sieht das Ergebnis der Liste aus:
> Einkaufen
Produkt Abteilung Menge
1 Apfelsaft Getrnke 4
2 Quark Milchprod. 2
3 Joghurt Milchprod. 2
. . . . # usw.
Betrachten wir die Struktur des Datensatzes:
> str(Einkaufen) # Struktur des data frame:
data.frame: 7 obs. of 3 variables:
$ Produkt: Factor w/ 7 levels Apfelsaft,Bier,..: 1 4 3 ..
$ Abteilung: Factor w/ 3 levels Fleischw.,Get..,..: 2 3 3 ..
$ Menge: num 4 2 2 1 3 1 2
Hierbei fllt auf, dass die Zeichenketten als Faktoren interpretiert wurden. Im Falle
der Variable Abteilung macht dies sicherlich Sinn. Mchte man, dass die Funktion
data.frame()Zeichenketten nicht als Faktoren interpretiert, so muss man dies durch
das Argument stringsAsFactors spezifizieren.
4.1.1 Indizierung und Teilauswahl
Wegen der Nhe zur Datenstruktur Liste funktioniert die Indizierung von Dataframes
zum einen vllig anaolg zu der von Listen. Zum anderen ist ein dataframe auch eine Art
Matrix, weshalb auch diese Indizierung mglich ist.
Mchte man zum Beispiel auf das zweite Element des Eintrages Menge zugreifen, so
ist dies durch die folgenden Befehle mglich:
Einkaufen[[3]][2]
Einkaufen$Menge[2]
Einkaufen[2,3]
Einkaufen[2,Menge]
Oft interessiert man sich bei einem Datensatz fr fr eine Teilmenge von Beobachtun-
gen, fr die bestimmte Kriterien erfllt sind. Dazu sind logische Operatoren ntig, hier
nocheinmal eine bersicht:
41
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
42/81
R-Code Bedeutung
== gleich
!< ungleich
> grer
>= grer gleich< kleiner
Einkaufen[Einkaufen$Abteilung == Getrnke, ]
Produkt Abteilung Menge
1 Apfelsaft Getrnke 4
5 Wasser Getrnke 3
7 Bier Getrnke 2
Hierbei wurde die matrixhnliche Struktur des Datensatzes ausgenutzt. Zunchst wur-
de dabei ein Vektor mit logischen Werten produziert. Dieser hat dieselbe Lnge wie esBeobachtungen gibt und berprft den Listeneintrag Abteilung auf bereinstimmun-
gen mit Getrnke. Anschlieend werden durch diesen Vektor alle Zeilen der Matrix
extrahiert, die die gewnschte Eigenschaft besitzen. Diese Vorgehensweise erfllt ihren
Zweck, fr Dataframes gibt es aber eine bersichtlichere Methode:
subset()
Die Funktion subset()lsst sich am besten am Beispiel erklren: Die gleiche Auswahl
wie oben erhlt man durch
> subset(Einkaufen, Abteilung == Getrnke)
Es ist auch mglich, mehrere Filterkriterien zu kombinieren:
42
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
43/81
> subset(Einkaufen, Abteilung == Getrnke & Menge > 3)
Produkt Abteilung Menge
1 Apfelsaft Getrnke 4
Ebenso ist die Verwendung eines logischen ODERs mglich:
> subset(Einkaufen, Abteilung == Getrnke | Abteilung == Milchprod.)
Produkt Abteilung Menge
1 Apfelsaft Getrnke 4
2 Quark Milchprod. 2
3 Joghurt Milchprod. 2
5 Wasser Getrnke 3
7 Bier Getrnke 2
Eine elegantere Art, zu diesem Ergebnis zu kommen, ist
> subset(Einkaufen, Abteilung %in% c(Getrnke,Milchprod.)).
Diese bietet sich an, wenn viele solcher Kriterien zu berprfen sind. Die erste Lsung
kann dann doch schnell unbersichtlich werden.
Weiterhin bietet die Funktion subset()die Mglichkeit, Variablen aus dem Datensatz
auszuschlieen. Im ersten Beispiel wird die Spalte Abteilung des Datensatzes ber-flssig, da die gefilterten Daten alle in der gleichen Abteilung zu finden sind. Um diese
Spalte zu entfernen, wird das Argument selectverwendet:
> subset(Einkaufen, Abteilung == Getrnke, select=-2)
Produkt Menge
1 Apfelsaft 4
5 Wasser 3
7 Bier 2
Kennt man die betroffene Spaltenzahl nicht, so kann man sich folgendermaen helfen:
> subset(Einkaufen, Abteilung == Getrnke,
+ select=names(Einkaufen)!=Abteilung)
43
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
44/81
4.1.2 Umbenennen und Lschen von Variablen
Umbenennen von Variablen
Wie gerade gesehen, greift man auf die Variablennamen eines Datensatzes mit der Funk-
tion names()zu:
> names(Einkaufen)
[1] Produkt Abteilung Menge
Diese Ausgabe wird vonRals Vektor angesehen und kann dementsprechend manipuliert
werden. Der Befehl
> names(Einkaufen)[3] Einkaufen
Produkt Abteilung Anzahl
1 Apfelsaft Getrnke 4
2 Quark Milchprod. 2
3 Joghurt Milchprod. 2
. . . . # usw.
Der allgemeinere Lsungsansatz fr diese Zuweisung ist der folgende:
> names(Einkaufen)[names(Einkaufen)==Menge] Einkaufen$Abteilung
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
45/81
> Einkaufen
Produkt Anzahl
1 Apfelsaft 4
2 Quark 2
3 Joghurt 2. . . . # usw.
Zur Lschung mehrerer Variablen bietet sich folgendes an:
> Einkaufen Einkaufen[order(Einkaufen$Menge),]
Produkt Abteilung Menge
4 Schinken Fleischw. 16 Wurst Fleischw. 1
2 Quark Milchprod. 2
3 Joghurt Milchprod. 2
7 Bier Getrnke 2
. . . . # usw.
45
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
46/81
Fr ein absteigendes Sortieren, kann man im Falle von quantitativen Merkmalen (statt
das Zusatzargument decreasing=TRUE zu verwenden) dem Vektor, nach dem sortiert
werden soll, ein Minuszeichen voranstellen:
> Einkaufen[order(-Einkaufen$Menge),]
Produkt Abteilung Menge
1 Apfelsaft Getrnke 4
5 Wasser Getrnke 3
7 Bier Getrnke 2
3 Joghurt Milchprod. 2
. . . . # usw.
Bei der Sortierung nach einer einzelnen Variable wurde an der Reihenfolge sonst nichts
verndert. Das erkennt man zum Beispiel daran, dass der Indexvektor ganz links inner-
halb von Beobachtungen mit der gleichen Anzahl immer noch geordnet ist. Es ist auch
mglich, nach verschiedenen Variablen gleichzeitig zu sortieren. Der Befehl
> Einkaufen[order(Einkaufen$Menge,Einkaufen$Produkt),]
Produkt Abteilung Menge
4 Schinken Fleischw. 1
6 Wurst Fleischw. 1
7 Bier Getrnke 2
3 Joghurt Milchprod. 2
2 Quark Milchprod. 2
5 Wasser Getrnke 3
1 Apfelsaft Getrnke 4
.
sortiert den Datensatz zunchst nach der Variablen Menge. Existieren innerhalb dieser
Sortierung ties, also identische Beobachtungen, so wird hier nach dem zweiten Vektor
sortiert. Die Reihenfolge der Vektoren, die anorder()bergeben werden, spielt also eine
Rolle. Im Beispiel ist die Zeile mit Bier am weitesten oben von allen Beobachtungen
mit Menge=2, da im zweiten Schritt alphabetisch sortiert wurde.
Hinweis: Daten vom Typ Charakter werden alphabetisch sortiert. Faktoren hingegen
werden nach ihrem inneren Wert geordnet, unabhngig von der alphabetischen Reihen-
folge der labels. Im Beispiel wurde die Spalte mit den Produkten beim Erstellen des
Dataframe als Faktor kodiert. Bei diesem Vorgang wurden die inneren Werte entspre-
chend der alphabetischen Sortierung vergeben. So kam es zufllig zur alphabetischen
Sortierung im vorigen Beispiel.
46
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
47/81
4.1.3 Hinzufgen neuer Variablen
Mit dem Befehl
Preis (Preis (Einkaufen Einkaufen
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
48/81
$Fleischw.
Produkt Abteilung Menge Preis
4 Schinken Fleischw. 1 1.77
6 Wurst Fleischw. 1 0.09
$Getrnke
Produkt Abteilung Menge Preis
1 Apfelsaft Getrnke 4 0.58
5 Wasser Getrnke 3 1.88
7 Bier Getrnke 2 1.06
$Milchprod.
Produkt Abteilung Menge Preis
2 Quark Milchprod. 2 1.58
3 Joghurt Milchprod. 2 0.82
Jeder Eintrag in dieser Liste ist wieder ein Dataframe, der alle Beobachtungen des ur-
sprnglichen Datensatzes enthlt, die zur entsprechenden Ausprgung der Variable Ab-
teilung gehren. Der Aufruf von unsplit() mit den entsprechenden Faktoren, nach
denen aufgeteilt wurde, macht die Aufteilung des Datensatzes rckgngig.
Die Liste kann jetzt nach den bekannten Regeln aus Kapitel 2.5 bearbeitet werden.
Insbesondere kann man durch
split(Einkaufen, Einkaufen$Abteilung)$Abteilungsname
den Teil-Datensatz der Einkaufsliste herausgreifen, fr den die Variable Abteilung den
Wert Abteilungsname annimmt.
merge()
In manchen Fllen liegen einem zwei Datenstze vor, die zu einer oder mehreren iden-tischen Variablen komplementre Zusatzinformationen beinhalten. Diese knnen mit
merge()zu einem allumfassenden Datensatz zusammengefhrt werden. Wir fhren das
Beispiel der Einkaufsliste fort. Angenommen, bei gewissen Produkten kennen wird die
Marke, die immer am gnstigsten ist. Diese Information haben wir in folgendem Dataf-
rame abgespeichert:
48
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
49/81
> Marken merge(Einkaufen,Marken)
Produkt Abteilung Menge Preis Marke
1 Apfelsaft Getrnke 4 0.58 Nein!-Apfelsaft
2 Joghurt Milchprod. 2 0.82 Nein!-Joghurt
3 Wasser Getrnke 3 1.88 Nein!-Wasser
4 Wurst Fleischw. 1 0.09 Nein!-Wurst
Da die Dataframes unterschiedliche Lngen besaen, wurden nur die Zeilen mit berein-
stimmungen zusammengefasst. Mchte man trotzdem alle Produkte in der Einkaufsliste
stehen haben, so lsst sich dies durch
> merge(Einkaufen,Marken, all.x=TRUE)
Produkt Abteilung Menge Preis Marke
1 Apfelsaft Getrnke 4 0.58 Nein!-Apfelsaft
2 Bier Getrnke 2 1.06
3 Joghurt Milchprod. 2 0.82 Nein!-Joghurt
4 Quark Milchprod. 2 1.58
5 Schinken Fleischw. 1 1.77
6 Wasser Getrnke 3 1.88 Nein!-Wasser
7 Wurst Fleischw. 1 0.09 Nein!-Wurst
erreichen. Zum besseren Verstndnis der diversen Argumente empfiehlt es sich, die Hil-
feseite von merge()aufzurufen, und das angegebene Beispiel nachzuvollziehen.
4.1.5 Verschiedenes
Einhngen eines Datensatzes in den Suchpfad
Mchte man auf bestimmte Variablen eines Datensatzes immer wieder zugreifen, so ist
es umstndlich, jedes Mal mit dem $ Operator oder einer Indizierung zu arbeiten. Hier
schafft die Funktion attach() Abhilfe. Der Befehl attach(Einkaufen) ermglicht es,
die Variable Produktdirekt anzusprechen:
49
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
50/81
Anstatt
> Einkaufen$Produkt
kann man nun
> Produkt
schreiben. Vorsicht ist allerdings geboten bei neuen Zuweisungen. Mchte man das
Original-Objekt verndern, so muss man weiterhin mit Einkaufen$Produkt arbeiten.
Die Zuweisung
> Produkt[1] data(package = .packages(all.available=TRUE))
ein. Der Befehl ohne Zusatzargumente zeigt alle momentan verfgbaren Datenstze an.
> data()
Diese Liste ist evtl. krzer als die erste, da Datenstze nur verfgbar sind, wenn das
entsprechende Zusatzpaket geladen ist. Das Laden eines Zusatzpaketes wurde in Kapitel
1.8 beschrieben. Ist das Zusatzpaket geladen, so kann man den Datensatz mitattach()
in den Suchpfad einhngen und damit arbeiten. Eine bersicht ber die Datenstze eines
Paketes erhlt man ber die Funktion try(). Zum Beispiel gibt
> try(data(package=datasets))
eine Liste aller Datenstze des Paketes datasets.
50
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
51/81
Um Informationen ber einen Datensatz zu erhalten, kann man sich der Funktion help()
bedienen:
> help(Orange)
gibt eine bersicht ber den Datensatz Orange aus dem Paket datasets.
4.2 Datenimport und Datenexport
Im vorigen Kapitel haben wir gesehen, wie man mit Datenstzen arbeitet. Das For-
mat des Dataframe spielt auch deshalb in R eine groe Rolle, weil viele Datenstze,
die zum Beispiel als Excel-Datei abgespeichert sind, bereits diese Grundform besitzen.
In diesem Kapitel werden die wesentlichen Mglichkeiten dargestellt, solche externen
Datenstze einzulesen, um sie dann in R weiterbearbeiten zu knnen. Auch auf die ma-nuelle Dateneingabe sowie das Exportieren von Daten aus R in andere Dateiformate
wird eingegangen.
4.2.1 Dateneingabe in R
Dateingabe mit scan()
Eine sehr einfache Mglichkeit, Daten in R einzulesen, ist durch die Funktion scan()
gegeben. Die Zuweisung einer Variablen geschieht wie folgt:
> y
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
52/81
Die Funktion data.frame()
Die Funktion data.frame() haben wir bereits kennengelernt. Hat man whrend einer
RSitzung verschiedene Vektoren erzeugt, die Variablen eines Datensatzes entsprechen,
so kann man diese mit data.frame()zu einem Datensatz zusammenfgen:
> x y Daten Daten
x y
1 1 22 2 4
3 3 6
4 4 8
5 5 10
6 6 12
7 7 14
8 8 16
9 9 18
10 10 20
Manuelle Dateneingabe und -Bearbeitung
Die rudimentrste Methode der Dateneingabe bei R ist die manuelle Dateneingabe.
Dazu wird zunchst durch
> Daten fix(Daten)
manuell bearbeiten.
52
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
53/81
Durch den Aufruf ffnet sich der Dateneditor (vgl. Abbildung 4.1).
Abbildung 4.1: Screenshot der manuellen Dateneingabe.
Jetzt kann man nach einem Klick auf die Variablenfelder in der ersten Zeile deren Namen
und Typ (numeric oder character) festlegen. Anschlieend kann man die einzelnen Zellen
durch einen Klick anwhlen und Werte eintragen. Ist der Datensatz fertiggestellt, soschliet man den Editor wieder.
4.2.2 Einlesen von externen Datenstzen
Im Allgemeinen wird man Daten selten so einlesen, wie es im vorangegangen Kapitel
erklrt wurde. In der Praxis kommen die Daten im Regelfall aus anderen Quellen und lie-
gen in Formaten wie.xls,.txtoder.csvvor. In diesem Kapitel werden die gngigsten
Mglichkeiten zum Einlesen von externen Datenstzen vorgestellt.
ASCII-Dateien
Am einfachsten und sichersten ist der Import von externen Daten, wenn sie im ASCII1-
Format (z.B. .txtoder .csv) vorliegen.
1Die Abkrzung ASCII steht fr American Standard Code for Information Interchange.
53
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
54/81
Liegt eine Datei in einem solchen Format vor, so kann sie beispielsweise ber die
Funktionen read.table(), read.csv(), oder read.csv2() eingelesen werden. Eine
der am hufigsten verwendeten Methoden zum Einlesen von externen Daten in R ist
read.table(). Die Funktionsweise soll an einem Beispiel erklrt werden.
Beispiel
Die Dateikino.txt2 enthlt Daten zu einer fiktiven Umfrage. 20 Personen wurden nach
Alter, Geschlecht und der Anzahl der Kinobesuche im vergangenen Jahr befragt. Bevor
man die Daten importiert, empfiehlt es sich, den Originaldatensatz zu betrachten, um
Informationen darber zu erhalten, welche Trennzeichen verwendet wurden.
Abbildung 4.2: Der Datensatzkino.txtgeffnet im Editor.
In Abbildung 4.2 sieht man, dass als Trennzeichen das Semikolon verwendet wurde.Dezimaltrennzeichen sind nicht vorhanden, da es nur ganzzahlige Eintrge gibt.
2Kann heruntergeladen werden unter
http://www.rrzn.uni-hannover.de/buch.html?no_cache=1&titel=statistik_r
54
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
55/81
Die Datei kann nun durch den Befehl
> kino kino
id gender alter kino
1 A1 mnnlich 26 1
2 A2 mnnlich 43 5
3 A3 weiblich 17 9
...
18 A18 weiblich 31 3
19 A19 mnnlich 40 1
20 A20 weiblich 38 0
eingelesen werden und steht im Workspace zur Verfgung. Die Argumente von
read.table()erklren sich wie folgt:
file:Der Pfad mit sich anschlieendem Dateinamen. Ist das entsprechende Ver-zeichnis bereits als Arbeitsverzeichnis ausgewhlt, so reicht der Dateiname.
header:Ein Wahrheitswert. Gilt header=TRUE, so wird die erste Zeile des Daten-satzes fr die Variablennamen verwendet. Voreinstellung ist FALSE.
sep(kurz fr separator): Legt fest, welches Zeichen als Trennzeichen zwischen denSpalten des Datensatzes interpretiert werden soll. Voreinstellung ist, es wird also
jeglicher Leerraum als Trennzeichen verwendet - Tabulatoren oder Leerzeichen.
dec(decimal points): Dieses Zeichen bestimmt das Dezimaltrennzeichen. Vorein-stellung ist..
Liegt eine Datei im csv3-Format vor, so bietet sich je nach Trennzeichen read.csv()
oder read.csv2()zum Einlesen an, vergleiche Tabelle 4.2.2.
Funktion header sep dec
read.table() FALSE .
read.csv() TRUE , .
read.csv2() TRUE ; ,
3Die Abkrzung steht fr comma seperated values.
55
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
56/81
Manuelles Einlesen von Daten
Es ist auch mglich, Datenstze ber das Ordner-Men einzulesen, wie man es auch sonst
von Windows kennt. Diese Vorgehensweise spart die Spezifizierung des Argumentesfile.
Um Daten auf diese Weise einzulesen, verwendet man die Funktion file.choose().
Nach Eingabe des Befehls
> kino
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
57/81
Der Umweg ber die zwischenzeitliche Abspeicherung in einem anderen Format scheint
umstndlich, wird aber wegen der geringen Fehleranflligkeit in der Literatur meist
empfohlen.
Es existieren Zusatzpakete, die das direkte Einlesen von Excel-Dateien ermglichen,zum Beispiel RODBC, xlsReadWrite oder gdata. Auf diese wird hier aber nicht
eingegangen.
Mchte man nur einzelne Spalten eines Datensatzes einlesen, so kann man mit der Funk-
tion scan()arbeiten (vgl. Kapitel 4.2.1).
4.2.3 Daten exportieren
Auslesen eines einzelnen Vektors
Hat man whrend einer Sitzung einen einzelnen Vektor produziert, auf den man auch
auerhalb von R zugreifen mchte, so kann man diesen mit write() exportieren. Mit
dem folgenden Befehl erzeugen wir zunchst 100 standardnormalverteilte Zufallszahlen:
> Datenvektor write(Datenvektor, "C:/R/Datensaetze/Datenvektor.txt", ncolumns=1)
kann man den Vektor jetzt in einer .txt Datei abspeichern. Das Argument ncolumns
wurde deshalb spezifiziert, weil die Voreinstellung fnf Spalten vorsieht. Dadurch wrde
der Vektor auf fnf Spalten aufgeteilt werden.
Nach dem Abspeichern kann man den Datensatz mit dem Texteditor ffnen (vgl. Abbil-
dung 4.4).
Auslesen eines Datensatzes
Mchte man nicht nur einen einzelnen Vektor abspeichern, sondern einen ganzen
Datensatz, so verwendet man die Funktionen write.table(), write.csv(), oder
write.csv2(). Diese sind derart aufgebaut, dass man die gespeicherten Dateien mit
den Voreinstellungen ihrer Pendants read(vgl. Tabelle 4.2.2) wieder einlesen kann.
57
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
58/81
Abbildung 4.4: Der mit write()ausgelesene Datenvektor.
Als Beispiel betrachten wir den Datensatz Datenaus Kapitel 4.2.1:
> Daten
x y
1 1 2
2 2 4
3 3 6
4 4 8
5 5 10
6 6 12
7 7 14
8 8 16
9 9 18
10 10 20
Dieser wird mit dem Befehl
> write.table(Daten, "C:/R/Datensaetze/Datensatz.txt")
exportiert. Das mit dem Editor geffnete Ergebnis kann man in Abbildung 4.5 betrach-
ten. Mchte man verhindern, dass dem Datensatz die fortlaufenden Nummern als Extra-
spalte vorangestellet werden, so muss man das Argument row.namesaufFALSEsetzen.
Die Anfhrungsstriche bei den Variablennamen unterdrckt man durch das Argument
quote.
58
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
59/81
Abbildung 4.5: Der mit write()ausgelesene Datensatz.
Mchte man Daten nach dem Auslesen mit Excel ffnen, so bietet sich write.csv2()
an.
59
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
60/81
Kapitel 5
Grafik
InRexistiert eine Vielfalt an Mglichkeiten, Grafiken zu erstellen. Diese reichen von der
explorativen Grafik, mit der man sich einen kurzen berblick ber Daten verschafft bis zu
Grafiken von hoher Qualitt, die man fr Prsentationen oder Publikationen verwenden
kann. Durch den Aufruf des Befehls demo(graphics)erhlt man einen kurzen Einblick
in die verschiedenen Mglichkeiten, Grafiken mit Rzu erstellen.
Bei der Grafikerstellung mitRunterscheidet man zwischen den traditionellen Grafiken
und den sogenannten TrellisGrafiken. Letztere basieren auf dem Paket lattice und
bieten deutlich mehr Mglichkeiten in der Gestaltung, sind dafr aber etwas aufwndi-
ger zu porgrammieren. Zur statistischen Datenanalyse reichen meist die traditionellen
Grafiken aus, weshalb im Rahmen dieser Einfhrung auf die Trellis Grafiken verzichtet
wird.
5.1 High-level Grafik
High-levelGrafik-Funktionen ermglichen es, einen vollstndigen Plot der Daten zu er-
stellen, die als Argumente an die Funktion bergeben wurden. Je nach Art der Daten
werden Axen, Label und Titel automatisch erstellt. Eine bersicht ber einige der High-
level Grafik-Funktionen bietet Tabelle 5.1.
Eine der meistgenutzten Funktionen ist dabei plot(). Wie auch bei einigen anderen derHigh-level Grafikfunktionen handelt es sich bei plot() um eine sogenannte generische
Funktion. Eine solche Funktion ist derart aufgebaut, dass sie verschiedene Arten von
Objekten als Eingabe zulsst und die Ausgabe entsprechend anpasst. Die Art der Grafik,
die von plot() produziert wird, hngt also von den Eigenschaften des Objektes ab,
was als Argument bergeben wird. Beispielsweise wird bei Eingabe von zwei Vektoren
gleicher Lnger ein Streudiagramm erzeugt (Scatterplot), bei Eingabe eines lm-Objektes
60
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
61/81
Funktionsname Erluterung
barplot() Balkendiagramm
boxplot() Boxplot
contour() Hhenlinienplot (Konturplot)
curve() Funktion zeichnenhist() Histogramm
pairs() Scatterplotmatrix
persp() perspektivische Flchen
plot() je nach Datentyp: Scatterplot, Boxplot, Balkendiagramm u.a.
pie() Kreisdiagramm
pie3D() 3D-Kreisdiagramm nach Laden des Paketsplotrix
qqnorm() Q-Q-Diagramm fr die Normalverteilung
qqplot() Q-Q-Diagramm mit zwei Datenstzen
Tabelle 5.1: Einige High-level Grafikfunktionen.
(lineares Modell, wird im folgenden Kapitel behandelt) Grafiken zur Modellanalyse (z.B.
Residualplot) und bei Eingabe eines Zeitreihenobjektes wird eine mit Linien verbundene
Zeitreihe geplottet.
Als Beispiel betrachten wir den iris-Datensatz aus der Beispielsitzung aus der ersten
bung:
> attach(iris)
> plot(Petal.Length, Petal.Width, pch = as.numeric(Species))
> windows()
> hist(Petal.Length)
> detach(iris)
Der Aufruf windows() zwischen den beiden Plots ist notwendig, um beide Grafiken
parallel anschauen zu knnen. Ruft man nmlich eine High-level Grafik-Funktion auf, so
wird ein neuer Plot erstellt und - falls vorhanden - der aktuelle dadurch berschrieben.Durch die Eingabe von windows()ffnet sich ein neues Fenster fr den weiteren Plot.
Die Ergebnisse der beiden Aufrufe befinden sich in Abbildung 5.1. Durch das Zusatzar-
gumentpch(von point character) wurde dabei jeder Pflanzenart ein anderes Symbol zu-
gewiesen. Da die verschiedenen Pflanzenarten als Faktoren vorliegen, mussten sie durch
den Aufrufas.numeric()durch ihren inneren Wert ersetzt werden. Dabei ist zu beach-
61
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
62/81
1 2 3 4 5 6 7
0.5
1.0
1.5
2.0
2.5
Petal.Length
Petal.Width
Histogram of Petal.Length
Petal.Length
Frequency
1 2 3 4 5 6 7
0
10
20
30
Abbildung 5.1: Beispielgrafiken (Streudiagramm, Histogramm) mit den iris-Daten
ten, dass der Vektor Species die gleiche Lnge besitzt wie Petal.Length bzw.
Petal.Width.
5.2 Konfigurierbarkeit von Grafiken
Die im Beispiel gesehenen Grafiken reichen zu einer ersten Analyse der Daten vollstn-dig aus. Oft ist man aber in der Situation, dass man (zum Beispiel fr Publikationen
oder eine Prsentation) Grafiken noch erweitern bzw. anpassen mchte. Dies kann zum
Beispiel geschehen durch Beschriftung (berschriften, Axenbeschriftung, Beschriftung
einzelner Punkte, etc.), die Verwendung anderer Symbole, Lininenstrken, Farben, die
Vernderung der Skalierung usw. Eine Vielzahl dieser Anpassungen kann erreicht wer-
den, in dem man entsprechende Argumente direkt an die Plotfunktion bergibt. Dazu
gehren vor allem die Parameter, die in den Hilfen ?plot und ?plot.default aufge-
fhrt werden, aber auch ein Groteil der Argumente, die man in der Hilfe ?par findet.
In jedem Fall lohnt sich ein Blick in auf die einzelnen Hilfeseiten, um einen berblickber die verschiedenen Mglichkeiten zu bekommen.
Mit der Funktion par() lassen sich die wichtigsten Grundeinstellungen fr Grafiken
bearbeiten. Im Gegensatz zur direkten bergabe von Parametern an Plotfunktionen
ist hierbei zu beachten, dass die Vernderungen durch par()fr alle folgenden Grafiken
gelten. Dies bietet sich an, wenn man mehrere einheitliche Grafiken hintereinander erstel-
62
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
63/81
Argument Erluterung
axes Achsen sollen (nicht) eingezeichnet werden
bg Hintergrundfarbe
cex Gre eines Punktes bzw. Buchstaben
col Farbenlas Ausrichtung der Achsenbeschriftung
log Logarithmierte Darstellung
lty, lwd Linientyp (gestrichelt, ...) und Linienbreite
main, sub berschrift und Unterschrift
mar Gre der Rnder fr Achsenbeschriftung etc.
mfcol, mfrow mehrere Grafiken in einem Bild
pch Symbol fr einen Punkt
type Typ (l=Linie, p=Punkt, b=beides, n=nichts)
usr Ausmae der Achsen auslesen
xlab, ylab x-/y-Achsenbeschriftung
xlim, ylim zu plottender Bereich in x-/y- Richtung
xpd in die Rnder hinein zeichnen
Tabelle 5.2: Einige hufig benutzte Argumente in Grafikfunktionen und par().
len mchte. Zu den Parametern, die man standardmig durchpar()verndern wrde,
gehren zum Beispiel die Aufteilung der Plotregionen, Rnder oder Anzahl der Grafiken
in einem Plot. Eine Bildberschrift hingegen wrde man dem Plot individuell zuweisen,
weshalb dies auch kein Argument von par()ist. Eine bersicht von hufig verwendeten
Argumenten in Grafikfunktionen bzw. par()findet man in Tabelle 5.2.
Farben knnen auf verschiedene Art und Weise angegeben werden. Zunchst gibt es
die Standard-Farbpalette, die man durch den Befehlpalette()aufrufen kann: Die Zu-
> palette()
[1] black red green3 blue
[5] cyan magenta yellow gray
weisung einer Zahl zwischen 1 und 8 spezifiziert also die gewnschte Farbe. Alternativ
kann man aber auch eine Zeichenfolge in Anfhrungszeichen bergeben, zum Beispiel
green3. Eine vollstndige1 Liste der bekannten Farbnamen erhlt man durch die Ein-
1Eine Farbe fehlt in der Aufzhlung: transparent. Diese ist nicht fr alle mglichen Ausgaben verfg-
bar.
63
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
64/81
gabe voncolors(). Es ist auch mglich, RGB-Werte in Hexadezimaldarstellung zu ber-
geben, mehr Informationen dazu findet man in der Hilfe ?parunter Color Specification.
Ein besonderer Einsatz von Farbe ist die Verwendung des alpha-Kanals, mit dem
teilweise transparente Objekte erzeugt werden knnen. Auf dieser Art lassen sich ber-lagerungen verschiedener Objekte sichtbar machen, wie folgendes Beispiel verdeutlichen
soll:
> set.seed(321)
> x
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
65/81
Nun plotten wir dieselben Daten unter Verwendung des Argumentes alphader Funktion
rgb():
plot(x, y, col = rgb(0, 0, 0, alpha=0.1), pch = 16)
Es ergibt sich das folgende Bild, in dem die Struktur der Teilmenge des Datensatzesdeutlich zu Tage tritt:
3 2 1 0 1 2 3
3
2
1
0
1
2
3
x
y
Als nchstes soll an einem Beispiel aufgezeigt werden, wie die verschiedenen Parameter
verwendet werden knnen, um das Erscheinungsbild eines Plots zu verndern:
> set.seed(123)
> x par(las = 1) # alle Achsenbeschriftungen horizontal
> # Beschriftetes und manuell skaliertes Histogramm:
> hist(x, main = Dichte 100 N(0,1)-verteilter Zufallszahlen,
+ freq = FALSE, col = grey, ylab = Dichte,+ xlim = c(-5, 5), ylim = c(0, 0.6))
> # Hinzufgen der theor. Dichtefunktion - dick und gestrichelt:
> curve(dnorm, from = -5, to = 5, add = TRUE, lwd = 3, lty = 2)
Beim Beispiel wird zunchst eine Stichprobe standardnormalverteilter Zufallsvariablen
gezogen. Anschlieend wird mit dem Argument las fr kommende Grafiken die Achsen-
65
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
66/81
Dichte 100 N(0,1)verteilter Zufallszahlen
x
Dichte
4 2 0 2 4
0.0
0.1
0.2
0.3
0.4
0.5
0.6
Abbildung 5.2: Beispielgrafik - Histogramm und Dichtefunktion.
beschriftung horizontal ausgerichtet (der Standardwert ist derart, dass die Beschriftung
parallel zur Achse verluft). Danach wird ein Histogramm der Zufallszahlen erzeugtund mit einer berschrift und y-Achsenbeschriftung versehen. Auerdem werden die
Achsengrenzen explizit angegeben, die y-Achse beispielsweise soll sich von 0 bis 0.6 er-
strecken. Durch das Argument freq=FALSE wird dafr gesorgt, dass im Histogramm
keine absoluten Hufigkeiten angezeigt werden. Die Belegung von colmit greyfllt
die Flchen mit grauer Farbe. Abschlieend wird mit curve() die Dichte der Stan-
dardnormalverteilung (Funktion dnorm()) der Grafik hinzugefgt. Dabei wird durch
add=TRUE verhindert, dass dieser Plot in einem eigenstndigen Fenster erscheint. Die
Begrenzungen der x-Achse werden denen des Histogramms angepasst und die Dichte
wird mit einer dicken (lwd = 3), gestrichelten (lty = 2) Linie gezeichnet. Das Ergebnis
ist in Abbildung 5.2 zu sehen.
Oft ist man in der Situation, mehrere Grafiken nebeneinander oder untereinander dar-
stellen zu wollen. Dies erreicht man durch Belegung des Argumentes mfrowbzw. mfcol.
Bei beiden wird die Anzahl der Zeilen und Spalten angegeben, in die der Grafikbereich
aufgeteilt werden soll. Dann werden die Teilbereiche nach und nach mit Grafiken gefllt,
66
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
67/81
bei mfrowzeilenweise, beimfcolspaltenweise. Folgendes Beispiel soll die Vorgehensweise
verdeutlichen:
> par(las = 1, mfrow = c(2,2))
> set.seed(123)
> for (j in 1:4){
> x hist(x, main = Dichte 100 \n N(0,1)-verteilter Zufallszahlen,
+ freq = FALSE, col = grey, ylab = Dichte,
+ xlim = c(-5, 5), ylim = c(0, 0.6))
> curve(dnorm, from = -5, to = 5, add = TRUE, lwd = 3, lty = 2)}
Man beachte, dass der Code vom vorhergehenden Beispiel kaum verndert wurde. Es
wurde lediglich das sogenannte Device (in diesem Fall das Fenster, in dem die Grafik ge-ffnet wird) zunchst in zwei Spalten und Zeilen aufgeteilt. Anschlieend wurde in einer
Schleife vier mal der Code von vorher reproduziert. Das Ergebnis kann man in Abbildung
5.3 sehen. Die Teilgrafiken unterscheiden sich voneinander, da der Zufallszahlengenerator
nicht vor jedem Schleifendurchlauf initiiert wurde, sondern vor der Schleife.
Dichte 100
N(0,1)verteilter Zufallszahlen
x
Dich
te
4 2 0 2 4
0.0
0.1
0.2
0.3
0.4
0.5
0.6
Dichte 100
N(0,1)verteilter Zufallszahlen
x
Dich
te
4 2 0 2 4
0.0
0.1
0.2
0.3
0.4
0.5
0.6
Dichte 100
N(0,1)verteilter Zufallszahlen
x
Dichte
4 2 0 2 4
0.0
0.1
0.2
0.3
0.4
0.5
0.6
Dichte 100
N(0,1)verteilter Zufallszahlen
x
Dichte
4 2 0 2 4
0.0
0.1
0.2
0.3
0.4
0.5
0.6
Abbildung 5.3: Vier Plots in einer Grafik.
67
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
68/81
Plotbegrenzung
Grafikbegrenzung
uere Begrenzung
Plotbereich
Grafikbereich
Devicebereich
Abbildung 5.4: Aufteilung des Devices.
Wenn man mehrere Plots in einer Grafik darstellt, kann es sinnvoll sein, allen Plots eine
gemeinsame berschrift zuzuordnen. Dazu kann es notwendig sein, die Aufteilung des
Fensters, in dem die Grafik auftaucht, anzupassen. Standardmig ist das Device in ver-
schiedene Bereiche aufgeteilt: das Device selbst, den Grafikbereich und den Plotbereich,
wie Abbildung 5.4 verdeutlicht.
Dabei ist die Voreinstellung, dass der uere Bereich wegfllt, so dass der Grafik mg-
lichst viel Platz eingerumt wird. Fr Abbildung 5.4 wurden mittels par() folgende
Voreinstellungen festgelegt:
> par(mar=c(5, 4, 3, 2)) # Rnder zw Plot- und Grafikbegrenzung
> par(oma=c(3, 3, 3, 3)) # Rnder zw. Grafik- und uerer Begrenzung
Das Argumentmarsteht fr margin (Rand) undomasteht fr outer margin. Beide gebendie Anzahl an Zeilen an, die an den jeweilegen Rndern gelassen werden soll. Dabei
steht der erste Wert fr den unteren Rand, dann wird im Uhrzeigersinn weitergezhlt.
Im Beispiel wurde also der gesamte uere Rand auf drei Zeilen festgelegt, der Rand
zwischen unterer Plotbegrenzung und unterer Grafikbegrenzung auf fnf Zeilen, der
Rand zwischen linker Plotbegrenzung und linker Grafikbegrenzung auf vier Zeilen usw.
68
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
69/81
Die berschrift fr Abbbildung 5.3 lsst sich jetzt folgendermaen umsetzen: Man er-
weitert das Fenster durch den Aufruf von
> par(oma=c(0, 0, 4, 0))
um einen oberen Rand und lsst dann den identischen Code laufen. Abschlieend kann
man die berschrift via
> mtext(4 Plots der Dichte 100 \n N(0,1)-verteilter Zufallszahlen,
+ outer=TRUE, cex=1.5)
festlegen. Hierbei wurde die Schriftgre auf das 1.5-fache vergrert. Das Ergebnis ist
in Abbildung 5.5 zu sehen.
x
Dichte
4 2 0 2 4
0.0
0.1
0.2
0.3
0.4
0.5
0.6
x
Dichte
4 2 0 2 4
0.0
0.1
0.2
0.3
0.4
0.5
0.6
x
Dichte
4 2 0 2 4
0.0
0.1
0.2
0.3
0.4
0.5
0.6
x
Dichte
4 2 0 2 4
0.0
0.1
0.2
0.3
0.4
0.5
0.6
4 Plots der Dichte 100
N(0,1)verteilter Zufallszahlen
Abbildung 5.5: berschrift bei mehreren Plots im selben Device.
69
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
70/81
Bei allen Zuweisungen mit par()ist zu beachten, dass diese die Einstellungen dauerhaft
verndern. Deshalb ist es sinnvoll, die Defaulteinstellungen vor einem Plot abzuspei-
chern. Dies kann durch
> old_par par(old_par)
zurcksetzen.
5.3 Low-level Grafik
Low-levelGrafik-Funktionen stellen eine Erweiterung von High-level Grafik-Funktionen
dar. Sie dienen unter anderem dazu, Grafiken zu initialisieren (z.B. durch Bereitstellung
eines Koordinatensystems). Weiterhin knnen mit ihrer Hilfe zustzliche Elemente wie
Punkte, Geraden oder Beschriftungen in bestehende Grafiken eingezeichnet werden.
Funktionsname Erluterung
abline() intelligente Linie
arrows() Pfeile
axis() Achsengrid() Gitternetz
legend() Legende
lines() Linien
mtext() Text in den Rndern der Grafik
plot.new() Initiierung einer neuen Grafik
plot.window() Koordinatensystem initialisieren
points() Punkte
polygon() Polygone
qqline() fgt eine Gerade in ein Q-Q-Diagrammsegments() vektorwertige Linien
text() Text
title() Grafiktitel
Tabelle 5.3: Auswahl an Low-levelGrafik-Funktionen.
70
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
71/81
Eine Auswahl anLow-levelGrafik-Funktionen ist in Tabelle 5.3 aufgefhrt. Die meisten
dieser Funktionen sind intuitiv in ihrer Anwendung, weshalb eine kurze Konsultation
der zugehrigen Hilfeseite ausreichend ist. An dieser Stelle wird deshalb auf weitere Er-
klrungen verzichtet. Es soll lediglich das Beispiel aus Abschnitt 5.2 aufgegriffen werden.
Der Grafik soll eine Legende hinzugefgt werden, was durch Erweiterung des Codes umdie beiden Zeilen
> legend(-4.5, 0.55, legend = c(emp. Dichte, theor. Dichte),
+ col = c(grey, black), lwd = 5)
erreicht werden kann. Durch diesen Befehl wird eine Legende am Koordinatenpunkt
[-4.5, 0.55] (linker oberer Rand der Legende) eingezeichnet. Durch Spezifizierung des
Argumenteslwdwird dafr gesorgt, dass Linien neben den beiden Bezeichnungenemp.
Dichtebzw.theor. Dichteauftauchen. Weiterhin wurden den beiden Linien verschie-dene Farben entsprechend den Farben im Plot zugeordnet. Das Ergebnis kann man in
Abbildung 5.6 betrachten.
Dichte 100 N(0,1)verteilter Zufallszahlen
x
Dichte
4 2 0 2 4
0.0
0.1
0.2
0.3
0.4
0.5
0.6
emp. Dichte
theor. Dichte
Abbildung 5.6: Erweiterung der Histogrammgrafik um eine Legende.
71
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
72/81
5.4 Mathematische Beschriftung
Bei der Erstellung von Grafiken mit Rbesteht die Mglichkeit, mathematische Notation
als Beschriftung miteinzubinden. Gerade fr Publikationen im Bereich der Mathema-
tik ist dies von Vorteil. Dabei knnen komplexe Formeln, mathematische Symbole undgriechische Buchstaben verwendet werden. Bei den meisten Grafikfunktionen (wie z.B.
plot()) ist dies immer dort mglich, wo es um Beschriftung geht, also zum Beispiel bei
den Argumenten main, sub, xlabund ylab.
Mathematische Notation wird in Form von nicht ausgewerteten RAusdrcken angege-
ben, dabei werden Formeln nahezu inRSyntax spezifiziert. In der einfachsten Form lsst
sich das durch die Funktion expression() umsetzen. Dabei sind einige Schlsselwr-
ter an LATEX angelehnt, beispielsweise frac(Zhler, Nenner). Wie man es von LATEX
kennt, werden griechische Buchstaben in Lateinischer Schrift ausgeschrieben, wobei esauf Gro- und Kleinschreibung ankommt: aus sigmawird , aus Sigma. Die Formel
yi=0+1xi+e
kann als Unterschrift beispielsweise durch
> plot(1:10, sub = expression(y[i] == beta[0] + beta[1] * x[i] + e))
in eine Grafik eingefgt werden.
Hufig kommt es vor, dass Variablen in Formeln durch ihre Werte ersetzt werden sollen.Ist der Wert bekannt, so kann dies mit expressions()umgesetzt werden. Wird er aber
erst innerhalb einer Funktion berechnet und an die Grafik bergeben, so funktioniert
diese Vorgehensweise nicht mehr. Hier hilft die Verwendung der Funktionsubstitute().
Im folgenden Beispiel sei das Objekt wert zu einem frheren Zeitpunkt durch Berech-
nungen erzeugt worden:
> wert substitute(sigma == s, list(s = wert))
sigma == 0.5
Der Funktionsubstitute()wurde hier neben dem Ausdruck noch eine Liste mit Werten
bergeben. Da in dieser Liste ein Objekt mit dem Namen s existiert, wird dieses im
Ausdruck entsprechend durch seinen Wert ersetzt. Zurckgegeben wird ein sogenanntes
Sprachobjekt2, welches von Grafikfunktionen entsprechend interpretiert werden kann.
2Mehr Informationen zu Sprachobjekten finden sich im Buch von Ligges (2007)
72
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
73/81
Abschlieend soll das Beispiel des Histogramms noch um mathematische Beschriftung
erweitert werden. In der linken Hlfte der Grafik soll nun zustzlich die Formel fr die
Dichtefunktion der Normalverteilung
f(x) = 1
2 e
(x)2
22
erscheinen. Weiterhin sollen auf der rechten Hlfte der Grafik die Parameter mit ihren
Werten angegeben werden. Dazu wird die Funktion text()verwendet und der Code um
die folgenden zwei Zeilen erweitert:
> text(-5, 0.3, adj = 0, cex = 1.3,
+ expression(f(x) == frac(1, sigma * sqrt(2*pi))
+ e ^{frac(-(x - mu) ^2, 2 * sigma ^2)}))
>text(5, 0.3, adj = 1, cex = 1.3,
+ expression(mit {mu == 0} , {sigma == 1}))Dabei erzeugt adj = 0 rechts (bzw. adj = 1 links) an den angegebenen Koordinaten-
punkten ausgerichteten Text. Das doppelte Tildezeichen erhht den Abstand zwischen
Bruch und Exponentialfunktion. Das Ergebnis ist in Abbildung 5.7 zu sehen.
Dichte 100 N(0,1)verteilter Zufallszahlen
x
Dichte
4 2 0 2 4
0.0
0.1
0.2
0.3
0.4
0.5
0.6
emp. Dichtetheor. Dichte
f(x) =1
2 e
(x)2
22 mit = 0, = 1
Abbildung 5.7: Mathematische Beschriftung in der Histogrammgrafik.
73
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
74/81
Eine detaillierte Behandlung des Themas soll hier nicht weiter vorgenommen werden.
Dazu sei auf das die Hilfeseiten
> help(plotmath)
> example(plotmath)
> demo(plotmath)
verwiesen. Auch im Buch von Ligges (2007) und den Literaturangaben dort finden sich
weitere Details.
5.5 Grafiken exportieren
Wann imer eine Grafik produziert wird, muss ein Device (engl. fr Gert) bestimmt
werden, auf dem die Ausgabe erfolgt. Sofern man interaktiv mit R arbeitet, ist diesstandardmig das Device fr Bildschirmgrafik (X11()). Es ist aber auch mglich, Gra-
fiken zu exportieren, in dem man andere Devices verwendet, eine bersicht ber einige
Devices liefert Tabelle 5.5.
Beispielsweise wurde der linke Teil von Abbildung 5.1 durch den Befehl
> pdf(scat.pdf)
> attach(iris)
> plot(Petal.Length, Petal.Width, pch = as.numeric(Species))> detach(iris)
> dev.off()
erzeugt. Dabei wurde zunchst das Device zum Erzeugen von Grafiken im pdf-Format
geffnet. Dabei muss in Klammern der Dateiname inklusive Pfad angegeben werden,
unter dem die Grafik gespeichert werden soll. In diesem Fall wurde kein Pfad spezifiziert,
so dass die Datei im Arbeitsverzeichnis abgespeichert wurde. Abschlieend wurde das
Device mit dem Befehl dev.off()geschlossen.
Die Besonderheit bei den beiden Devices pdf() und postscript() ist, dass dort auch
mehrere Grafiken in einem Devices abgespeichert werden knnen. Fr jede neue Grafik
wird dann eine neue Seite erstellt.
74
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
75/81
Funktion Dateiformat Dateiendung
bmp() Bitmap-Datei .bmp
jpeg() JPEG-Datei .jpeg oder .jpg
pdf() PDF-Datei .pdf
pictex() PicTEX fr LATEX-Dokumente .texpng() PNG-Datei .png
postscript() Postscript-Datei .ps
Natrlich kann man Grafiken auch aus der Bildschirmgrafik exportieren. Bei einem
Rechtsklick auf die Grafik erscheinen dann die Mglichkeiten, diese abzuspeichern. Die-
se Vorgehensweise ist aber nicht zu empfehlen, da die Ausgabedatei abhngig von der
Gestalt des Grafikfensters in Rist. Weiterhin ist die Auswahl an Speicherformaten be-
schrnkt.
75
-
8/14/2019 Eine Einfhrung in die Statistik-Software R
76/81
Kapitel 6
Statistik
BeiR handelt es sich um eine Programmiersprache mit starkem Bezug zur statistischen
Datenanalyse. Nicht umsonst ist die Homepage von R mit der berschrift The R Project
for Statistical Computing versehen. Deshalb darf in einem Skript zu Rein Kapitel zu
diesem Thema nicht fehlen. Allerdings handelt es sich bei dem Kurs zu diesem Skript um
einen Einfhrungskurs, bei dem auer der Einfhrung in die Stochastik keine weiteren
Vorlesungen vorausgesetzt werden. Deshalb wird es in diesem Kapitel nur eine bersicht
ber die wichtigsten Befehle geben. Dabei wird vorausgesetzt, dass das Prinzip von
Zufallsvariablen, Verteilungen etc. bekannt ist.
6.1 Verteilungen und Stichproben
Verteilungen
Rstellt fr viele Wahrscheinlichkeitsverteilungen Funktionen bereit, mit denen sich Wer-
te fr Verteilungsfunktion, Quantile und Zufallszahlen ermitteln lassen. E