1 Einführung in:

Andreas Behr, Ulrich Pötter

Einführung in die Statistik mit R, page 8 - 23

2. Edition 2010, ISBN print: 978-3-8006-3599-3, ISBN online: 978-3-8006-4878-8, https://doi.org/10.15358/9783800648788_8

Series: Vahlens Kurzlehrbücher

Bibliographic information
E Vor jeder praktischen Arbeit mit Daten und vor jeder Statistik sollte man sich einen ersten Überblick über die wichtigsten Sprachelemente von R verschaffen. Hierzu und zur Beschreibung einer angemessenen Arbeitsumgebung dient dieses Kapitel. 1.1 Eine Vorbemerkung zu R 1.2 Arbeitsumgebung 1.3 Die Bedienung von R 1.4 R-Objekte 1.4.1 Typen 1.4.2 Typen- und Klassenänderung 1.4.3 Datenfelder: data.frame 1.5 Zusätzliche Pakete 1.6 Hilfe, Manuals und Mailinglisten . Eine Vorbemerkung zu R R ist als Programmiersprache zur Analyse von Daten und deren graphischer Darstellung entworfen worden. Damit unterscheidet sich das Programm von den meisten klassischen Statistik-Programmen. Viele dieser klassischen Programme bestehen aus einer Sammlung fix vorgegebener statistischer Prozeduren, deren Verhalten durch einige wenige Parameter kontrolliert werden kann. In dieser Welt kann der Nutzer nur zwischen den verschiedenen vorgegebenen Optionen des Programms wählen, er kann aber nicht eigene Varianten ausprobieren, und es ist auch unmöglich, intern programmierte Versionen statistischer Verfahren zu überprüfen. Zudem sind die Programmiermöglichkeiten oft nachträglich entwickelt worden, so dass es keine einheitliche, auf statistische Auswertungen zielende Programmierumgebung gibt. Insbesondere fehlen häufig einfache Konstruktionen, die zwar in allgemeinen Programmiersprachen bereitgestellt werden, in den Statistik-Programmen aber fehlen. Das behindert Einführung in vielen Fällen gerade die Datenaufbereitung, die in jeder statistischen Analyse den Großteil der Arbeit beansprucht. Da R eine Open Source Software ist, ist der Quellcode für alle Nutzer frei zugänglich und damit zumindest im Prinzip überprüfbar. Und da R zunächst als Programmiersprache entwickelt wurde, gibt es viele Sprachelemente, die den Umgang mit Daten, die Datenaufbereitung und die Berechnung von Statistiken erleichtern. R zeichnet sich einerseits dadurch aus, dass es ein breites Spektrum statistischer Methoden bereitstellt, die in Form von Prozeduren vorliegen. Mit fast Zusatzpaketen werden nicht nur alle denkbaren klassischen und modernen statistischen Verfahren abgedeckt, auch verschiedenste Varianten des Datenzugangs (über das Netz, über Datenbanken, den Import anderer Datenformate etc.), der Zugriff auf externe (mathematische und andere) Programme, die (automatische) Dokumentation der Ergebnisse, die Erzeugung publikationsfähiger Graphiken in höchster Qualität und die Möglichkeiten zur Erzeugung von Animationen sind implementiert. Andererseits ist R als Programmierumgebung bestens geeignet, flexible Statistiklösungen selbst zu programmieren. Das erleichtert die Aufbereitung von Daten, denn die Sprachelemente von R sind speziell für diese Anwendung entwickelt worden. Zudem können alle bereitgestellten Prozeduren in eigenen Programmen aufgerufen und sogar modifiziert werden, ohne dass zunächst spezielle Programmierumgebungen aufgerufen werden müssen. Im Rahmen dieser Einführung in R wird die Anwendung wichtiger vordefinierter R-Prozeduren erläutert. In den Prozeduren sind statistische Verfahren implementiert, die durch Anweisungen beim Aufruf der Prozeduren zu spezifizieren sind. Die Prozeduren enthalten in der Regel eine Vielzahl von Optionen, deren Syntax nicht immer selbsterklärend ist. Nützlich sind hier jedoch die von R bereitgestellten Hilfen. Neben der Anwendung von Prozeduren steht im Rahmen dieser Einführung jedoch das Programmieren in R im Vordergrund, da in R in effizienter Weise statistische Verfahren vom Anwender selbst programmiert werden können. Wie bei praktisch allen Programmierumgebungen ist zunächst ein gewisser Einarbeitungsaufwand in diese spezifische Sprache zu leisten. Nach Überwindung dieser Schwierigkeiten stellt R jedoch ein sehr flexibles Instrument dar. In die Programmierung in R wird anhand verschiedener Beispiele eingeführt. In der praktischen Arbeit ergeben sich oft Aufgaben, die nicht oder nur mit größerem Aufwand mit der Basisinstallation von R zu bewerkstelligen sind. Wir haben daher an vielen Stellen auf wichtige Zusatzpakete hingewiesen, die solche Aufgaben automatisieren oder zumindest erleichtern. Wir haben uns dabei an eigenen Erfahrungen im Umgang mit sozialwissenschaftlichen Datensätzen und an entsprechenden Beratungsanfragen orientiert. Natürlich Die jeweils aktuelle Version von R (der Quellcode ebenso wie einfach installierbare Pakete für Windows, Mac, Linux,. . . ) kann von http://www.R-project.org kostenlos heruntergeladen werden. Die hier zugrundeliegende Version von R ist . . . . Arbeitsumgebung bleiben Lücken, sowohl Fragen, die nicht beantwortet werden als auch nützliche Pakete, die wir übersehen haben. Aber ein Buch dieser Art muss mit diesen Unzulänglichkeiten leben. . Arbeitsumgebung Die Nutzung von R wird deutlich komfortabler, wenn ein separater Editor zur Erstellung des Programmcodes verwandt wird. Auf diese Weise können bequem Programmdateien erstellt werden, die den reinen Code enthalten und nicht mit Protokollinformationen und Output vermischt sind. Der Code kann mit Kollegen ausgetauscht werden und dient der Dokumentation von Arbeitsschritten und Ergebnissen. Einige Editoren erlauben es auch, im Editor erstellten Code ganz oder teilweise an das R-Programm zu übergeben und die Ergebnisse in einem weiteren Editorenfenster anzuzeigen. Außerdem kennen diese Editoren die Syntax von R und zeigen an, ob Klammern richtig gesetzt wurden bzw. geben umgebungsabhängige Hilfen. Für MS-Windows Systeme gibt es z.B. Tinn R (http://www.sciviews.org/Tinn-R/). Weitere Editoren, auch für andere Betriebssysteme, sind auf der Seite http://www.sciviews.org/_rgui/ angegeben. In der MS-Windows Version kann man nach dem Start von R einige Einstellungen wie Schriftarten, -größen, die Zahl der Zeilen an Aus- und Eingaben, die gespeichert werden, sowie die Art der Behandlung mehrerer Fenster (SDI: Mehrere unabhängige Fenster, MDI: Alle Fenster innerhalb eines globalen R Fensters) ändern. Die Optionen finden sich unter Bearbeiten -> Gui Einstellungen. Hat man sich passende Optionen gewählt, sollte man sie speichern. Wichtig ist noch, sich ein Arbeitsverzeichnis zu erstellen und nur darin Programme, Daten und Ergebnisse zu einem Projekt zu speichern. In der MS-Windows Version kann man unter dem Menü Datei -> Verzeichnis wechseln das Verzeichnis wählen, in dem R Daten sucht und Ergebnisse und Graphiken speichert. Erstellen Sie für jedes Projekt ein neues Verzeichnis, in dem Sie Ihre Daten und Programme abspeichern. Vergessen Sie dann nicht, zu Beginn einer R Sitzung das jeweilige Arbeitsverzeichnis anzugeben. . Die Bedienung von R Nach dem Aufruf von R meldet es sich (nach einigen Zeilen mit der Versionsangabe, Copyright etc.) mit dem Eingabeprompt > Hinter dem Eingabeprompt kann man nun Eingaben machen und mit der RETURN Taste abschicken. Insbesondere kann man nun R wie einen Taschenrechner benutzen: > 5+2 Einführung [1] 7 Da im Rahmen einer R-Sitzung leicht ein umfangreicher Programmcode zustande kommt, ist es sehr hilfreich, die wichtigsten Schritte eines Programms mit einem Kommentar kurz zu erläutern. In einer Zeile werden alle Zeichen nach dem speziellen Zeichen # von R ignoriert. > 5+2 #Dies ist ein Kommentar: 5+2=7 [1] 7 Fortsetzungszeilen werden durch + angezeigt. R nimmt an, dass eine Fortsetzungszeile folgt, wenn ein Befehl noch nicht vollständig abgeschlossen ist, etwa > 5∗ + 3 [1] 15 Man kann also lange Befehlszeilen an den Stellen umbrechen, an denen noch ein Argument nach einem Operator folgen muss. Gleiches gilt, wenn noch nicht alle Klammerausdrücke wieder geschlossen wurden: > (((1+2)∗3) + ∗2) [1] 18 Leerzeichen zwischen Objektnamen, Operatoren und Zahlen werden überlesen. Man kann also etwa durch Einrücken Programme übersichtlicher und lesbarer gestalten. Sollen mehrere Befehle auf einer Zeile angegeben werden, sind sie durch ; zu trennen: > 5+2 ; 7+3; 2∗5 [1] 7 [1] 10 [1] 10 Funktionen in R werden durch deren Namen aufgerufen, die Argumente werden in runden Klammern angegeben. Betrachten wir den Befehl c(), der die in der Klammer genannten Objekte verbindet. > c(1,2) [1] 1 2 Wollen wir den erzeugten Vektor später weiterverwenden, müssen wir ihn benennen, etwa mit dem Namen a: > a < c(1,2) Dem Objekt mit dem Namen a ist durch den Zuweisungsoperator < der Wert des Ausdrucks c(1,2) zugewiesen worden. Das Objekt mit dem Namen a enthält jetzt den Vektor mit den Einträgen , . Um den Inhalt eines Objektes auszugeben, muss nur sein Name angegeben werden (Abschluss mit derReturn- Taste): . Die Bedienung von R > a [1] 1 2 Namen vonObjekten können beliebige Kombinationen vonBuchstaben, Zahlen, sowie des Zeichens "." sein, dürfen aber nicht mit einer Zahl beginnen. Achtung: R unterscheidet Groß- und Kleinschreibung! Das Objekt mit dem Namen a kann nicht durch A angesprochen werden. > A Fehler: Objekt "A" nicht gefunden Auf das Objekt mit dem Namen a können wir nun zugreifen; z.B. können wir das Objekt der Funktion mean() übergeben, die das arithmetische Mittel der Elemente in a berechnet: > mean(a) [1] 1.5 Der Inhalt des Gui-Fensters kann gespeichert werden, und ebenso kann die Abfolge aller Befehle (die history, also der Inhalt der Befehlszeilen ohne Rs Antworten) gespeichert werden. In der Praxis sollte man aber lediglich den Programmcode (z.B. in tinn r oder WinEdt), nicht jedoch das Protokoll und den Output aus dem R-Gui speichern. Die R-Sitzung wird durch q() beendet. > q() R fragt dann nach, ob man den workspace speichern möchte. Man sollte immer NEIN antworten. Denn ein gespeicherter workspace enthält alle während einer Sitzung erstellten Symbole und Objekte. Sie werden beim nächsten Start von R automatischwieder geladen. R ist dannwieder im gleichenZustandwie amEnde der letzten Sitzung. Das kann zu völlig unerwarteten Ergebnissen in der neuen Sitzung führen. Alte Zwischenergebnisse sollten immer durch den gespeicherten Code wiederhergestellt werden. Sollte doch einmal derworkspace einer Sitzung gespeichert worden sein, dann kann man die entsprechende Datei .Rdata einfach löschen. Auch das Zeichen "_" kann verwandt werden. Da es in alten Versionen auch als Zuweisungszeichen benutzt wurde, vermeiden viele Autoren die Verwendung des Zeichens in Namen von Objekten und bevorzugen ".". Auch Umlaute können benutzt werden. Ihre Verwendung sollte aber vermieden werden, weil sonst der Code auf verschiedenen Rechnern anders (oder gar nicht) abläuft. Denn die Interpretation von Umlauten und anderen Sonderzeichen (ebenso wie die Sortierung von Symbolen etc.) hängt von den lokalen Einstellungen des jeweiligen Rechners ab. Wir schreiben das Dezimaltrennzeichen in diesem Buch mit ".". Dies entspricht der R Konvention (und eine Konvention wie diese erleichtert den Datenaustausch). Um Missverständnisse zu vermeiden, verwenden wir daher keine Tausendertrennzeichen. Man kann sowohl die Speicherung als auch die Wiederherstellung des Workspaces durch Startoptionen von R verhindern. Die Startoption --no-save verhindert die Speicherung des Workspaces, die Option --no-restore verhindert das Laden gespeicherter Workspaces. Einführung . R-Objekte R ist objektorientiert. „Objekt“ ist dabei eine ganz allgemeine Bezeichnung, hinter der sich verschiedenste Dinge verbergen können, etwa ein Vektor oder eine Matrix, aber auch eine Tabelle oder das Ergebnis einer Regression. Alle Objekte haben einen Namen und können mit diesem Namen angesprochen werden. Man erhält eine Liste der Namen aller definierten Objekte mit der Funktion ls(). Objekte können aus dem Speicher durch die Funktion rm() gelöscht werden: > a < c(0,2) > ls() [1] "a" > rm(a) > ls() character(0) Objekte können verschiedenen Klassen angehören. Die Klasse eines Objektes entscheidet darüber, wie es am Bildschirm dargestellt wird (oder wie mit ihm Graphiken gestaltet werden, Statistiken berechnet werden, etc.). Die am häufigsten verwandten Klassen sind diejenigen, die mehrere Objekte in einer bestimmten Anordnung zusammenfassen. Dazu gehören insbesondere: list vector matrix array data.frame Listen sind Sammlungen von beliebigen Objekten, die in einer festen Reihenfolge angeordnet sind. Da sie beliebige Elemente enthalten können, werden sie häufig als Objekte erzeugt, die die Ergebnisse statistischer Berechnungen enthalten. Denn die Ergebnisse eines statistischen Modells werden oft sowohl durch Vektoren als auch durch Matrizen und Texte (z.B. bei Warnmeldungen) oder weitere Objekte zusammengefasst, die im Anschluss an Berechnungen einheitlich zur Verfügung stehen sollten. Eine spezielle Liste ist die leere Liste (eine Liste, die keine Elemente enthält). Sie hat den Namen NULL. Vektoren sind spezielle Listen, in denen alle Elemente keine weitere Struktur haben (sie sind im R-Jargon atomic, also nicht selber Listen, oder Vektoren, etc.) und alle vom gleichen Typ sind. ImGegensatz zu Vektoren gibt es in Matrizen und Arrays eine zusätzliche Anordnung der Elemente in der Form von Rechtecken (Matrizen) oder beliebigen Quadern (Arrays), wobei aber deren Elemente weiterhin atomic sein müssen. Die Länge von Listen und Vektoren kann durch die Funktion length() abgefragt werden. Matrizen, Felder und data.frame Objekte haben ein Dimensionsattribut, das mit der Funktion dim() abgefragt (und verändert) werden kann. . . Typen Die Elemente von Vektoren, Matrizen, Arrays können zu einem (und nur einem) der folgenden Typen gehören: Etwas genauer: Das Objekt mit dem Namen NULL ist eine leere Paarliste (pairlist). . R-Objekte character logical numeric complex integer factor character sind beliebige Folgen alphanumerischer Zeichen. Ihre Darstellung wird durch Einschließung in Anführungszeichen von Befehlen unterschieden, etwa "Alter", numeric ist der Oberbegriff für die Darstellung ganzer oder rationaler oder reeller oder komplexer Zahlen (in der Darstellung und Rechnergenauigkeit des Rechners), integer bezeichnet ganzzahlige Werte , logical bezeichnet Wahrheitswerte (TRUE, FALSE), complex bezeichnet komplexe Zahlen (mit einem reellen und imaginären Teil jeweils zu Bytes) und factor kennzeichnet Faktoren (Gruppierungsvariable). Mit der Funktion class() kann man die Objektklasse abfragen: > x < c("A","B","C") > class(x) [1] "character" > y < c(22,35,41) > class(y) [1] "numeric" > z < c(0,1,0) > class(z) [1] "numeric" Genauere Information über den Speichermodus erhält man mit der Funktion typeof(), die den Speichermodus eines Vektors (oder einer Matrix oder eines Arrays) anzeigt. > typeof(z) [1] "double" Die Elemente des Vektors z werden also in „double precision“ (in Bytes) gespeichert. Die Funktion is() liefert alle Klassen zurück, zu der ein Objekt gehört. Sie ist daher oft einfacher zu verwenden und zugleich informativer als class(): > is(z) [1] "numeric" "vector" Eine komprimierte Information über beliebige Objekte und über die Typen der möglicherweise enthaltenen Daten gibt die Funktion str(). > str(z) Dies benutzt nur Bytes an Speicherplatz, wenn man explizit integer als Typ verlangt. Man kann also fast die Hälfte des Speicherplatzes sparen, wenn nur integer Typen benutzt werden. Wie das gemacht werden kann, wird etwas später dargestellt. Allerdings verwandeln fast alle Prozeduren die Daten dieses Typs in reelle Darstellungen mit Bytes. Einsparungen in der Speicherbelegung mit integer sind also nur bedingt möglich. Die meisten Statistikprogramme (auch R) benutzen zur Berechnung numerischer Ausdrücke „double precision reals“. Dabei werdenZahlen durch Bits dargestellt: Bit für dasVorzeichen, Bits für die Mantisse und und Bits für den Exponenten, also als .fff . . . f n , wobei fff . . . f für die Mantisse steht und n für den Exponenten. Dadurch können Zahlen im Bereich zwischen und dargestellt werden. Berechnungen in diesem „Zahlensystem“ führen immer zu Rundungs- und Abschneidefehlern. Die maximale Genauigkeit dieser Arithmetik entspricht etwa Dezimalstellen. Einführung num [1:3] 0 1 0 Sie gibt zugleich die ersten Elemente des Objektes und deren Längen an. . . Typen- und Klassenänderung Wir können aber auch die Klasse eines Objektes selbst festlegen oder verändern. > z < as.logical(z) > class(z) [1] "logical" > z [1] FALSE TRUE FALSE > zz < as.integer(z) > class(zz) [1] "integer" > typeof(zz) [1] "integer" > zz [1] 0 1 0 Die Umwandlung in den Typ character kann benutzt werden, um recht einfach z.B. Beschriftungen für Graphiken zu erzeugen: > as.character(zz) [1] "0" "1" "0" Wenn eine Umwandlung nicht möglich ist, etwa wenn ein character Vektor in einen Vektor vom Typ numeric verwandelt werden soll, dann gibt es eine Warnung. Der Befehl wird dennoch ausgeführt, die entsprechendenWerte werden aber durch den Code für fehlende Werte (NA, not available) ersetzt: > as.numeric(x) [1] NA NA NA Warnmeldung: NAs durch Umwandlung erzeugt Solche Warnungen sollten sehr ernst genommen werden. In den meisten Fällen weisen auchWarnungen (und nicht nur Fehlermeldungen, die mit der Meldung ERROR angezeigt werden) auf Fehler hin, zumindest sollte jeder unerwarteten Warnung in einem Programm nachgegangen werden. Ebenso wie die Typen lassen sich auch die Klassen angeordneter Objekte ändern. as.list(), as.vector(), as.factor(), as.matrix(), as.array() und as.data. frame() versuchen, ihre Argumente in ein Objekt der entsprechenden Klasse zu verwandeln. Ob ein Objekt zu einer der Klassen gehört, kann durch is.list(), is.vector() etc. abgefragt werden. Die Veränderung der Klasse eines Objektes wird in den Handbüchern und der Online-Hilfe „coercion“ genannt. . R-Objekte . . Datenfelder: data.frame Ein data.frame ist die Datenstruktur, die der Darstellung und Verarbeitung statistischer Daten dient. Es ist eine Liste von Vektoren gleicher Länge (die Liste der Vektoren (Beobachtungen) der verschiedenen Variablen) und gleichzeitig eine Matrix, deren Zeilen den Beobachtungen und deren Spalten den Variablen entsprechen. Zudem enthält ein data.frame immer Variablennamen und Namen (Identifikationsvariable) der Fälle. Als Beispiel soll ein data.frame konstruiert werden, der Beobachtungen verschiedener Variablen bei verschiedenen Personen enthält: – Personen, die mit den symbolischen Namen A,B,C identifiziert werden sollen. – Variablen mit den Angaben über Alter und Geschlecht der drei Personen sowie eine Identifikationsvariable. Wir konstruieren zunächst drei Vektoren mit den Namen x,y,z, die diese Information enthalten sollen: > x < c("A","B","C") # Identifikationsvektor > y < c(22,35,41) # Alter > z < c(0,1,0) # Geschlecht: 0: männlich > z < as.logical(z) # Als logische Variable speichern Die drei Vektoren x,y,z sollen nun zu einem data.frame zusammengefügt werden, der den Namen dat1 erhält: > dat1 < data.frame(x,y,z) Wir überprüfen die Klasse mit: > class(dat1) [1] "data.frame" dat1 ist nun ein Objekt, auf das wir mit dessen Namen dat1 zugreifen können. Die bloße Angabe des Objektnamens führt zum Ausdruck des Objektes, hier des ganzen Dataframes: > dat1 x y z 1 A 22 FALSE 2 B 35 TRUE 3 C 41 FALSE > is.data.frame(dat1) [1] TRUE > is.list(dat1) [1] TRUE > dim(dat1) [1] 3 3 Von hier an benutzen wir das Wort „Dataframe“, wenn wir auf ein Objekt vom Typ data.frame verweisen. Einführung Vergabe von Variablennamen Ein Datensatz enthält i.d.R. mehr als nur eine Variable und mehr als nur einige wenige Fälle. Um sich leichter zu orientieren, können Spalten (oder Zeilen) mit einem Namen versehen werden. Diese Namen werden zusammen mit dem Objekt bzw. Datensatz gespeichert. Mit dem Befehl names() können diese Namen abgefragt oder definiert werden. Die Namen der Variablen in unserem Beispiel sind nicht beschreibend. Wir fragen zunächst die aktuellen Namen ab: > names(dat1) [1] "x" "y" "z" und ändern diese dann um: > names(dat1) < c("Name","Alter","Geschlecht") Erneutes Abfragen zeigt dann die neuen Namen an: > names(dat1) [1] "Name" "Alter" "Geschlecht" Unterobjekte und die Verwendung von Indizes Die Variablen des Dataframes dat1 können wiederum als Unterobjekte angesprochen werden. Das -Zeichen muss zwischen dem Namen des Objektes und dem des Unterobjektes eingefügt werden, z.B.: > dat1$Alter [1] 22 35 41 Das Unterobjekt ist nun ein namen- und dimensionsloser numerischer Vektor, wie mit den folgenden Befehlen überprüft werden kann: > names(dat1$Alter) NULL > dim(dat1$Alter) NULL > class(dat1$Alter) [1] "numeric" Auf Unterobjekte von dat1 kann auch auf andere Weise zugegriffen werden. Das erste Unterobjekt Name wird durch > dat1[1] angesprochen und behält seine Klasse data.frame. In dieser Schreibweise wird ausgenutzt, dass dat1 auch eine Liste ist: Man bezieht sich auf das erste Element der Liste der Variablen. Will man nicht das Listenelement sondern dessen Inhalt ansprechen, dann müssen doppelte eckige Klammern benutzt werden: > dat1[2] Alter 1 22 2 35 . R-Objekte 3 41 > is.data.frame(dat1[2]) [1] TRUE > dat1[[2]] [1] 22 35 41 Die Auswahl durch dat1[[2]] ist also identisch zu der Auswahl durch den Namen dat1$Alter. Und wie beim Zugriff über den Namen kann mit den doppelten Klammern immer nur auf ein Element der Liste zugegriffen werden. Meist wird man aber ein Dataframe wie eine Matrix behandeln. Die Auswahl mittels eckiger Klammern bezieht sich dann auf die zwei Dimensionen der Datenmatrix, die Fälle und die Variablen. Man braucht also zwei Indizes. Bei einer Matrix bezieht sich der erste Index auf die Zeile, der zweite auf die Spalte. Wird ein Index ausgelassen, nicht aber das trennende Komma, so wird auf alle Zeilen bzw. Spalten zugegriffen. Der Vorteil ist, dass man durch diese Art der Indizierung auch auf mehrere Elemente zugreifen kann und zudem nicht nur einzelne Spalten (Variable), sondern auch einzelne Zeilen (Beobachtungen) auswählen kann. > dat1[1,2] [1] 22 greift auf das zweite Element in der ersten Zeile zu. > dat1[2,] Name Alter Geschlecht 2 B 35 TRUE greift auf die Zeile zu (alle Spalten). > dat1[,3] [1] FALSE TRUE FALSE greift auf die Spalte zu (alle Zeilen). Wird mittels eckiger Klammern und Indizes auf einzelne Einträge (Skalare) oder Vektoren eines Dataframes zugegriffen, ist das resultierende Objekt wieder ein namen- und dimensionsloser numerischer Vektor: > names(dat1[2,2]) NULL > dim(dat1[2,2]) NULL > class(dat1[2,2]) [1] "numeric" Analog kann gleichzeitig auf mehrere Zeilen bzw. Spalten zugegriffen werden: > names(dat1[c(2,3),3]) NULL > dim(dat1[c(2,3),3]) NULL > class(dat1[c(2,3),3]) [1] "logical" Einführung Zu beachten ist aber, dass Teile des Dataframes, die keine Skalare oder Vektoren sind (Matrizen), Namen und Klasse behalten und eine Dimension aufweisen: > names(dat1[c(2,3),c(1,2)]) [1] "Name" "Alter" > dim(dat1[c(2,3),c(1,2)]) [1] 2 2 > class(dat1[c(2,3),c(1,2)]) [1] "data.frame" Mittels Verweis durch Indizes können auch einzelne Einträge von Objekten verändert werden: > dat1[3,2] < 25 > dat1 Name Alter Geschlecht 1 A 22 FALSE 2 B 35 TRUE 3 C 25 FALSE Schließlich werden bei der Angabe negativer Indizes die entsprechenden Zeilen bzw. Spalten ausgeschlossen: > dat1[ 3,] Name Alter Geschlecht 1 A 22 FALSE 2 B 35 TRUE Datenfelder und Faktoren Bei der Erstellung des Dataframes dat1 ist der Typ der Variablen Name verändert worden: > is.character(dat1$Name) [1] FALSE > class(dat1$Name) [1] "factor" > str(dat1) Šdata.frameŠ: 3 obs. of 3 variables: $ x: Factor w/ 3 levels "A","B","C": 1 2 3 $ y: num 22 35 25 $ z: num 0 1 0 Das ist die Voreinstellung des Befehls data.frame(). Will man diese Umwandlung von character Vektoren in Faktoren verhindern, muss man den Befehl abändern: > dat2 < data.frame(x,y,z,stringsAsFactors=FALSE) > class(dat2$x) [1] "character" Der Typ kann natürlich auch nachträglich verändert werden: . R-Objekte > dat1$Name < as.character(dat1$Name) > class(dat1$Name) [1] "character" Suchpfade Eine dritte Möglichkeit, auf Variable eines Dataframes zuzugreifen, liegt in der Erstellung eines Pfads zumDataframemittels attach(). Der Pfad ermöglicht ein direktes Zugreifen auf Variable des Dataframes durch Angabe ihrer Namen: > attach(dat1) > Alter [1] 22 35 25 Mit search() kannman sich eine Liste der angelegten Pfade anzeigen lassen. Das erste Element der Suchpfades ist immer ".GlobalEnv", die globale Umgebung, die alle in einer Sitzung definierten Variablen enthält. An der zweiten Stelle findet sich nun dat1. Wird wie oben auf die Variable Alter verwiesen, sucht R zunächst in der globalen Umgebung. Da dort Alter nicht definiert ist, wird als nächstes in dem Objekt dat1 nach einer Variablen mit dem Namen Alter gesucht. Die Reihenfolge ist wichtig, insbesondere wenn mehrere Objekte mit gleichem Namen existieren. > Alter < c(1,2,3) > Alter [1] 1 2 3 > dat1$Alter [1] 22 35 25 > rm(Alter) > Alter [1] 22 35 25 Hier ist zuerst eine neue Variable mit dem Namen Alter und den Werten 1,2,3 erzeugt worden. Sie befindet sich in der globalen Umgebung .GlobalEnv und wird daher nun auch zuerst gefunden. Sie maskiert die Variable gleichen Namens im Dataframe dat1. Erst wenn diese Variable mit rm(Alter) gelöscht wird, verweist der Name Alter wieder auf die Variable im Dataframe dat1. Außerdem muss beachtet werden, dass durch attach() genaugenommen nicht der Dataframe dat1 sondern eine Kopie zur Verfügung gestellt wird. Ändert man also etwa Einträge, dann werden sie nur in dieser Kopie geändert: > Alter[2] < 0 > Alter [1] 22 0 25 > dat1$Alter [1] 22 35 25 > rm(Alter) Mit detach() kann der Suchpfad wieder entfernt werden: Einführung > detach(dat1) > Alter Fehler: Objekt "Alter" nicht gefunden . Zusätzliche Pakete Pakete sind Erweiterungen von R, die standardisierte Zusammenfassungen von Funktionen, Datensätzen usw. darstellen. Mit der Installation von R werden automatisch wichtige Pakete installiert. Zusätzlich werden ca. weitere Pakete bereitgestellt, die die Funktionalitäten von R erweitern. Mittlerweile gibt es zu allen Bereichen der Statistik entsprechende Pakete. Zudem werden in Paketen Möglichkeiten bereitgestellt, auf Datenbanken zuzugreifen, geographische Informationssysteme zu nutzen, Bilder und Töne zu bearbeiten und Computer-Algebra Systeme zu benutzen. Weiterhin gibt es Pakete für effiziente lineare Algebra mit spärlich besetzten Matrizen, für die Benutzung beliebig genauer ganzer und rationaler Zahlen, die Berechnung von Polytopen und Designs, die Benutzung internationaler Literaturdatenbanken wie medline oder Datenbanken finanzieller Zeitreihen, das effiziente Rechnen mit Computergrids und auf Rechnern mit mehreren Kernen, die automatisierte Dokumentation von Ergebnissen und die Produktion hochwertiger Graphiken sowie von Animationen. Installieren lassen sich Pakete über das Menü des R-Guis oder durch den Befehl install.packages(). Da häufig Ergänzungen und Verbesserungen an den Paketen vorgenommen werden, sollte man sich regelmäßig die neuesten Versionen besorgen. Das geht entweder über das Menü des R-Guis (auf MS- Windows Maschinen) oder durch den Befehl update.packages(). Nach der Installation kann mit dem Befehl library() durch Angabe des Paketnamens das gewünschte Paket geladen werden. . Hilfe, Manuals und Mailinglisten Weiß man den Namen eines Befehls und möchte Details über die Argumente des Befehls erhalten, dann kann man in einer Sitzung den help() Befehl verwenden: > help(tapply) Eine Abkürzung ist der Befehl ?. Man kann also auch einfach schreiben: ?tapply Alternativ kann man die verlinkten HTML Hilfeseiten aufrufen und kann dann leicht zwischen verschiedenen aber verwandten Befehlen hin- und Auf Windows-Betriebssystemen kann es manchmal sinnvoll sein, statt der eingebauten Internetfunktionalität die des Internet Explorers zu benutzen. Dazu dient der Befehl setInternet2(T), den man vor jedem Aufruf einer Internetfunktion benutzen muss. . Hilfe, Manuals und Mailinglisten herspringen bzw. die eingebaute Suchfunktion benutzen. In Microsoft-Betriebssystemen findet man den entsprechenden Menü-Eintrag unter help. Man kann dieses Hilfesystem aber auch aus R heraus starten. Dann muss man den Befehl help.start() verwenden, der einen Browser startet und die Anfangsseite der Hilfe öffnet. Die detaillierte Beschreibung der Befehle findet sich dann unter dem Punkt packages. Die meisten in dieser Einführung beschriebenen Befehle befinden sich im Paket base, einschlägige statistische Prozeduren im Paket stats und die Graphikfunktionen in graphics. Die Funktionen, die Graphiken in spezielle Formate exportieren (wmf, png, pdf etc.), sind im Paket grDevices dokumentiert. Mit dem Befehl help.search("abc") werden die Dokumentationen der installierten Pakete nach Begriffen durchsucht, die zu dem Begriff abc passen. In der Voreinstellung werden alle möglichen Felder der Dokumentation aller installierten Pakete durchsucht. In den meisten Fällen dürfte es allerdings viel effizienter sein, nach den entsprechenden Begriffen im Hilfearchiv von R zu suchen (http://www. r-project.org/search.html). Man erhält dann auch Hinweise auf die Benutzung verschiedener statistischerModelle in unterschiedlichen Situationen und manchmal hilfreiche Kommentare für die Modellbildung. Mit dem Befehl RSiteSearch() kann man die Suche auch aus R heraus starten. Das Argument ist ein einzelner String, der die zu suchenden Begriffe enthält. Will man nach mehreren zusammenstehenden Begriffen suchen, kann man sie in Klammern {} einschließen. So sucht RSiteSearch("{logistic regression}") alle Stellen der Dokumentation und aller Archive der Hilfe-Liste, die die Wendung „logistic regression“ enthalten. Manuals, kürzere oder längere Einführungen in R, detaillierte Einführungen in Spezialthemen sowie ein Wiki finden sich in den Dokumentationsseiten von http://www.r-project.org. Auf der Mailing-Liste r help werden Fragen rund um die Benutzung von R diskutiert (http://stat.ethz.ch/mailman/listinfo/r-help). Die Liste kann auch durchsucht werden (http://www.r-project.org/search. html). I.d.R. werden Anfragen sehr schnell beantwortet. Nutzen Sie diese Möglichkeit, insbesondere dann, wenn Sie niemanden in Ihrer Umgebung fragen können und nichts in den Archiven finden. Für installierte Pakete werden in vielen Fällen „Vignetten“ zur Verfügung gestellt, kurze Überblicke über die wesentlichen Aspekte eines Pakets. Die Liste aller Vignetten einer Installation erhält man durch vignette(). Den Inhalt einer spezielle Vignette erhält man z.B. durch vignette("SparseM", package="SparseM"), falls das Paket SparseM (für spärlich besetzte Matrizen) installiert ist. Mit dem Befehl browseVignettes() kann man sich eine Liste aller installierten Vignetten in einem Browser anzeigen lassen. Einen Überblick über die inzwischen mehr als Zusatzpakete kann man sich kaum noch verschaffen. Zu einzelnenThemen aber gibt es kurze Einführung „Task Views“, die die wichtigsten Pakete zu einem Thema kurz vorstellen (http://finzi.psych.upenn.edu/views/). Man kann die Pakete, die in den „Task Views“ vorgestellt werden, automatisch lokal installieren: > install.packages("ctv") > library(ctv) > install.views("Econometrics") Es gibt „Task Views“ u.a. zu denThemen Econometrics, Social Sciences, Finance, Graphics. Die crantastic Seite (http://crantastic.org) versucht, einen Überblick über wichtige Pakete durch ein System von nutzererzeugten „Tags“ zu erstellen. Im R Journal (http://journal.r-project.org/) werden regelmäßig neuere Pakete durch ihre Autoren vorgestellt. Eine andere wichtige Quelle ist das Journal of Statistical Software (http://www.jstatsoft.org/). Für die graphischen Möglichkeiten bietet die Seite R Graph Gallery (http: //addictedtor.free.fr/graphiques/) den besten Einstieg. Das R Graphical Manual (http://bm2.genes.nig.ac.jp/RGM2/) enthält alle Graphiken, die von R Paketen in ihren Beispielen erzeugt werden. Allerdings umfassen alle Pakete einer „Task View“ eine sehr große Datenmenge. Man sollte diese Methode also nur verwenden, wenn man einen schnellen Internetzugang hat.

Chapter Preview

References

Zusammenfassung

Vorteile

- Einführung in die statistische Analyse mit R für Wirtschafts- und Sozialwissenschaftler

- Inklusive hilfreicher Tipps wie "Ansprechende Grafiken mit R gestalten"

Zum Thema

R ist ein Statistikprogramm, das kostenlos über das Internet verbreitet wird und dessen Source Codes frei zugänglich sind.

Aufgrund dieses kostenlosen Angebots gehen immer mehr Dozenten dazu über, neben SPSS auch R zu lehren bzw. SPSS durch R zu ersetzen.

In R steht dem Nutzer die gesamte Bandbreite statistischer Verfahren zur Verfügung. Durch die eigenständige Programmierumgebung ist die Software sehr flexibel und erlaubt notwendige Modifikationen und Erweiterungen verfügbarer Prozeduren.

Zum Werk

Dieses Buch führt leicht verständlich in die statistische Analyse mit R ein. Anhand von Beispielen wird die Umsetzung der wichtigsten Methoden der Statistik, wie sie üblicherweise in den Grundkursen gelehrt werden, mit R vorgestellt.

Das Buch verfolgt entsprechend zwei Ziele:

1. Vorstellung der statistischen Methoden,

2. Benutzung des Werkzeuges R zur Analyse von Daten.

Inhalt

- Grundlagen von R

- Datenbehandlung und graphische Darstellungen mit R

- Datenbeschreibungen (deskriptive Statistik)

- Wahrscheinlichkeitsverteilungen

- Regressionsanalysen

- Optimierungsverfahren

- Simulationen mit R

Neben vielen neuen, wirtschaftsorientierten Beispielen wird nun auch in die Paneldatenanalyse und Stichprobentheorie eingeführt.

Zu den Autoren

Dr. Andreas Behr ist wissenschaftlicher Mitarbeiter am Institut für Statistik und Ökonometrie der Universität Münster.

Dr. Ulrich Pötter ist wissenschaftlicher Mitarbeiter am Institut für Statistik der Universität Bochum.

Zielgruppe

Für Studierende und Dozenten der Wirtschaftswissenschaften im Bachelor an Universitäten und Fachhochschulen.