14 Tipps und weitere Möglichkeiten in:

Andreas Behr, Ulrich Pötter

Einführung in die Statistik mit R, page 250 - 263

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

Series: Vahlens Kurzlehrbücher

Bibliographic information
T M In diesem Kapitel besprechen wir zunächst Aspekte der täglichen Arbeit mit R, insbesondere weitergehende graphische Möglichkeiten und die Arbeit mit sehr großen Datensätzen. 14.1 Alternative Graphikmodelle, D-Graphiken 14.1.1 Weitere nützliche Devices 14.1.2 Andere Graphiksysteme in R 14.1.3 D-Graphiken 14.2 Große Datensätze und Datenbanken . Alternative Graphikmodelle, D-Graphiken In diesem Abschnitt stellen wir einige sehr nützliche Erweiterungen der Standardgraphik in R vor. Dazu gehören sowohl andere als die Standarddevices, erweiterte allgemeine Modelle statistischer Graphik und deren Umsetzung in R und interaktive D-Graphiken. . . Weitere nützliche Devices pictex, xĄg und tikzDevice Siehtman von denMöglichkeiten ab, Bitmap-Dateien als Teil einer postscriptoder pdf-Datei zu speichern oder (Teile einer) Graphik zu komprimieren bzw. zu verschlüsseln, dann sind beide Formate im Prinzip für Menschen lesbare Seitenbeschreibungsprogramme, die man mit einem Editor beliebig verändern kann. Allerdings sind viele in diesen Formaten benutzte Befehle zu grundlegend, um eine einfache Übersicht über die Auswirkungen einzelner Änderungen auf das Aussehen einer Graphik zu behalten. Es gibt aber einige Anstrengungen, Graphikbeschreibungen auf einer höheren Ebene und mit Sprachelementen zu organisieren, die sich an der Geometrie einer Graphik orientieren. Ein Beispiel ist die Standardgraphik von R selbst. In der Unix-Welt war es lange Tipps und weitere Möglichkeiten das Programm xĄg, das sowohl eine entsprechende Sprache als auch einen graphischen Editor bereitgestellt hat. Ähnliche Anstrengungen gibt es seit langer Zeit für eine Beschreibungssprache im Rahmen von LATEX. Das Standardpaket grDevices stellt Devices für beide Ansätze bereit (pictex() und xĄg()). Beide Varianten übersetzen die Beschreibung von Graphiken in R in entsprechende Beschreibungen in xĄg bzw. pictex. Der Vorteil dieser Devices ist natürlich, dass einige Aspekte einer Graphik, die sich nur unzulänglich in R darstellen lassen, nachträglich verbessert werden können. Die Nachteile sind aber ebenfalls beträchtlich: Beide Beschreibungssprachen sind sehr alt, berücksichtigen also kaum die Möglichkeiten heutiger Ausgabegeräte. Und die Unterstützung durch die Devices xĄg() bzw. pictex() ist nur rudimentär. Nutzer von LATEX können aber auf das sehr hilfreiche Paket tikzDevice zurückgreifen. Es erzeugt Code in der flexiblen und expressiven Beschreibungssprache tikz. Der wichtigste Vorteil neben der sehr kompakten, lesbaren und expressiven Graphikbeschreibung ist wohl, dass LATEX Befehle für alle Texte benutzt werden und entsprechend LATEX für die Bestimmung von Abständen und Fonts zuständig ist. Cairo und cairoDevice Die Cairo-Bibliothek ist ein Versuch, einen einheitlichen Rahmen für die Erstellung von Raster- und Vektorgraphiken zu schaffen. Neben weitgehender Unterstützung von Anti-Aliasing und Transparenz bietet die Cairo-Bibliothek eine relativ ähnliche Ausgabe in allen unterstützten Formaten, jedenfalls wenn die Ausgabegrößen einheitlich gewählt werden. Die beiden Pakete Cairo und cairoDevice sind zwei Pakete, die diese Bibliothek (teilweise) benutzen und entsprechende Devices für Rs Standardgraphik bereitstellen. Das Paket Cairo ist etwas flexibler, wir beschränken uns daher auf eine kurze Beschreibung der Devices und Möglichkeiten, die Cairo bereitstellt. Zwei wichtige Aspekte sind, dass in den Vektorgraphikformaten immer alle Fonts eingebettet werden und dass auch Fonts in den Formaten TrueType und OpenType benutzt werden können. Allerdings werden gerade Fonts auf verschiedenen Betriebssystemen unterschiedlich behandelt. Cairo benutzt auf Windows-Systemen das Fontmanagement von Windows, auf Linux-Systemen die installierte Cairo-Bibliothek (also i.d.R. fontconĄg). Auf Linux-Maschinen hängt es von der installierten Version der Cairo- Bibliothek ab, welche Formate mit diesem Device erzeugt werden können. Einen Überblick liefert der Befehl Cairo.capabilities(): > library(Cairo) > Cairo.capabilities() png jpeg tif pdf svg ps x11 win TRUE FALSE FALSE TRUE TRUE TRUE FALSE TRUE Das Device pictex() unterstützt weder Farben, noch Linienbreite, noch Fontinformationen. xfig() ist flexibler, aber die Zahl der Farben ist begrenzt und es gibt nur Linienformen. . Alternative Graphikmodelle, D-Graphiken Auf Windows-Betriebssystemen enthält das binäre Cairo Paket eine kompilierte Version der Cairo-Bibliothek, ist also unabhängig von möglicherweise installierten Cairo-Versionen. Die Verwaltung von Fonts erfolgt über den Windows-Mechanismus für die Verwaltung und Installation von Fonts. Auf Linux-Betriebssystemen kann die Wahl der Fonts durch den Befehl CairoFonts() erreicht werden. Die Cairo-Bibliothek greift bei der Verwaltung von Fonts auf die Bibliothek fontconĄg zurück. Die Namen der Fonts müssen daher in den fontconĄg Namen angegeben werden. Einen Überblick über die direkt ansprechbaren Fonts gibt der Befehl CairoFontMatch(). Die Variante CairoFontMatch(":") zeigt eine Liste aller zur Zeit verfügbaren Fonts. Ist fontconĄg installiert, dann liefert der Betriebssystembefehl fc list eine Liste der installierten (und fontconĄg bekannten) Fonts. . . Andere Graphiksysteme in R Das Standardsystem der Graphik in R ist an einzelnen Elementen einer Graphik und an Eigenschaften der Devices orientiert. Eine Graphik wird aus entsprechenden Einzelteilen zusammengesetzt, das Gesamtbild kann nur geändert werden, indem alle Teile neu erzeugt werden. Zudem orientiert sich diese Form der Erstellung von Graphiken an den graphischen Grundelementen, nicht aber an statistischen Anforderungen. Trellis Graphiken Eine Alternative, Trellis Graphiken, sind im Paket lattice implementiert. Das Trellis-Graphiksystem wurde im Anschluss an Bill Clevelands Visualizing Data von entwickelt. Das lattice Paket von Deepayan Sarkar implementiert das System auf der Basis des grid Pakets, das von Paul Murrell entwickelt wurde. Das lattice Paket stellt ein alternatives Graphiksystem zu Rs Standardgraphik bereit, das in vieler Hinsicht angemessener für statistische Anwendungen ist. Ein erster Unterschied zur Standardgraphik in R ist, dass die Graphikprozeduren des lattice Pakets zunächst ein R Objekt produzieren, das dann weiterverarbeitet und verändert werden kann. Die Graphik zu dem Simulationsbeispiel (Abbildung . ) könnte man mit dem lattice Paket auch schreiben: > set.seed(12) > x1 < rnorm(5) > x2 < rnorm(5) > library(lattice) > gr < xyplot(x1+x2~1:5,xlab="",ylab="",col="black",pch=c(1,3), + aspect="Ąll") > gr < update(gr,key=list(points=list(pch=c(1,3)),x=0.6,y=0.95, + padding.text=3, + text=list(lab=c("1.Simulation","2.Simulation")))) > print(gr) Tipps und weitere Möglichkeiten Der update() Befehl hat als erstes Argument das Graphikobjekt der Klasse trellis, das mit dem Aufruf von xyplot() erzeugt wurde. Das aspect Argument mit demWert Ąll füllt möglichst viel des jeweiligen Devicebereichs aus. Andere Möglichkeiten beziehen sich auf die relative Größe der x und y Achsen. In unserem Beispiel wird mit dem keyArgument eine Legende hinzugefügt. Im Unterschied zur Standardgraphik könnte man die Legende (oder andere Aspekte der Graphik) durch erneute Aufrufe von update() ändern, ohne die Graphik vollständig neu erzeugen zu müssen. Der für denNutzerwichtigereUnterschied aber dürfte sein, dass xyplot besonders gut geeignet ist, bedingte Verteilungen zu visualisieren. Dafür kann sowohl im xyplot() Befehl als auch in allen anderen Graphikbefehlen, etwa für Boxplots (bwplot()), Histogramme (histogram()), Dichten (densityplot()), Dotplots (dotplot()), d-Punktwolken (cloud()) oder d-Oberflächen (wireframe()), eine sehr flexible Beschreibung durch Formeln benutzt werden. Einen Aspekt haben wir schon kennengelernt: Man kann auf der linken Seite einer Formel mehrere Variablen (durch + getrennt) angeben. Dann werden alle Variablen der linken Seite in den Graphiken abgetragen. Auf der rechten Seite muss mindestens eine Variable erscheinen. Bedingende Variable werden durch y~x|g (oder y~x|g1∗g2 bei mehreren bedingenden Variablen) angegeben. Dabei muss g entweder ein Faktor sein, oder aber ein shingle, ein Konzept, das die Werte geordneter Variabler mit vielen Ausprägungen in mehrere (möglicherweise überlappende) Intervalle aufteilt. Befehle zur Erzeugung von shingle Strukturen sind u.a. shingle(), equal.count() bzw. as.shingle(). Das Konzept ist wohl am einfachsten durch ein Beispiel illustriert: > Depth < equal.count(quakes$depth,number=8,overlap=.1) > xyplot(lat~long|Depth,data=quakes) > update(trellis.last.object(), + strip=strip.custom(strip.names=T,strip.levels=T), + par.strip.text=list(cex=0.65)) Das Ergebnis ist Abbildung . . Das durch das shingle Depth ausgewählte Intervall ist oberhalb der einzelnen Teilgraphiken in einem strip angedeutet. Auf die Form dieser Art der zusätzlichen Annotation bezieht sich auch der update() Befehl im obigen Beispiel. Die einzelnen Teilgraphiken in solchen Graphiken heißen panel. Ihre Gestalt kann mit einer Reihe einzelner Befehle oder Optionen beeinflusst Der Wert des key Arguments ist eine benannte Liste. Das wohl einzige Element der Liste, das erklärungsbedürftig ist, ist das padding.text Element. Es legt den Abstand zwischen den Zeilen der Legende fest. Die Maßeinheit sind Textzeilen. Da die Höhe von Textzeilen nicht nur von der Fontgröße abhängt, sondern auch vom verwandten Font sowie vom Device, muss man mit dieser Größe etwas experimentieren. Die Lage der Legende wird durch die x und y Elemente festgelegt, die in der Voreinstellung in Anteilen der x bzw. y Achse gemessen werden. Das lattice Paket bietet aber weit mehr Möglichkeiten an, Koordinaten anzugeben bzw. Koordinatensysteme ineinander umzuwandeln. Bei den d-Befehlen cloud und wireframe hat die Formel die Form z~x∗y. . Alternative Graphikmodelle, D-Graphiken Abbildung 14.1: Orte von Erdbeben (Länge und Breite) konditional auf die Tiefe des Epizentrums. werden. Sie sind z.Zt. in der Hilfe zum Befehl xyplot() dokumentiert, nicht aber in den Hilfeseiten zu update() und nur teilweise in den Hilfeseiten zu den verschiedenen panel.∗() Funktionen. Das Analog zum par() Befehl der Standardgraphik ist in lattice der Befehl lattice.options(). Diese Einstellungen sind unabhängig von Einstellungen, die zuvor durch den par() Befehl der Standardgraphik geändert worden sind, denn lattice benutzt das Paket grid für die grundlegenden Graphikbefehle, nicht die Standardgraphik. Allerdings sind einige der Namen identisch und haben auch die gleichen Werte. Einen Überblick über die Vielzahl der Möglichkeiten liefert names(trellis.par.get()). Eine vollständige Liste aller Voreinstellungen und Funktionen erhält man durch lattice.options(). In der Abbildung . sind natürlich nicht die Voreinstellungen benutzt worden. Die Voreinstellungen sind sorgfältig für Bildschirmdarstellungen oder Präsentationen gewählt, eignen sich aber nicht besonders für Bücher oder andere Publikationen. Denn zum einen soll unsere Graphik als Schwarz- Weiß-Graphik gedruckt werden, zum anderen werden andere Fonts benutzt, so dass Abstände in den Beschriftungen nicht mehr gut gewählt sind. Zudem Sind die Symbole für die Punkte in den Panels zu groß. Und letztlich sind die Abstände für die äußeren Beschriftungen für eine Publikation viel zu groß und Ticks bzw. Tickmarks erscheinen ebenfalls zu groß. Um diese Aspekte zu ändern, muss man die entsprechenden Elemente der lattice.options ändern. Im Unterschied zu dem Befehl par() der Standardgraphik, der Änderungen bis zum nächsten Aufruf von par() für alle folgenden Graphiken ändert, kann man Tipps und weitere Möglichkeiten in lattice diese Parameter getrennt für einzelne Graphiken ändern. Dazu kann man das Argument par.settings etwa des xyplot Befehls (oder aller anderen graphikerzeugenden Befehle von lattice) benutzen, der die entsprechenden Optionen zusammenmit dem Graphik-Objekt speichert, so dass sie in weiteren print() Aufrufen wieder benutzt werden oder durch weitere update() Aufrufe geändert werden können. In unserem Beispiel haben wir eine ganze Reihe von Optionen geändert, die als Vorlage für eigene Änderungen dienen können: > update(trellis.last.object(),scales=list(tck=0.3,cex=0.7), + strip=strip.custom(bg="grey85",fg="grey60",sep="", + strip.levels=c(T,T)), + par.settings=list(plot.symbol=list(col="black",cex=1,pch="."), + fontsize=list(text=11), + layout.heights=list(top.padding=0,main.key.padding=0, + key.axis.padding=0.7,axis.xlab.padding=0, + xlab.key.padding=0,key.sub.padding=0, + bottom.padding=0.7), + layout.widths=list(left.padding=0.7,key.ylab.padding=0, + ylab.axis.padding=0,axis.key.padding=0, + right.padding=0), + axis.components=list(top=list(pad1=0.6,pad2=0), + right=list(pad1=0.2,pad2=0), + bottom=list(pad1=0.6,pad2=0), + left=list(pad1=0.4,pad2=0)))) Das scales Argument ist eine Liste von Optionen, die die Achsen und deren Beschriftungen betreffen. Wir wählen kleinere Längen für die Ticks und eine kleinere Beschriftung, um Abstände zwischen den Tickmarks zu erhalten. Dann folgt das strip Argument. Für die Beschriftung der Strips und ihre Gestaltung kann man an Stelle einer Liste von Listen den Befehl strip.custom() benutzen, der seine Argumente in eine passende Liste umwandelt. Wir ändern die Hintergrundfarbe der strips und die Farbe der shingles in passende Grauwerte, ändern die voreingestellte Trennung zwischen dem Namen des shingles und dessen Wert von " : " zu " " (das sep Argument), um etwas Platz zu sparen und verlangen für die Beschriftung durch das Argument von strip.levels, dass sowohl der Name der bedingenden Variablen als auch deren Wertebereich angegeben wird. Der nächste Block vonAngaben behandelt alle anderenGrößen, insbesondere dieAbstände zwischen Elementen derMarginalien.Dazumussman die Struktur der lattice.options() kennen. Dazu benutzen wir das par.list Argument, das als Wert eine benannte Liste von benannten Listen wie in lattice.options erwartet. Im Einzelnen wird zunächst das Element plot.symbol geändert, indem eine benannte Liste mit den Werten für cex, pch und col, also für die Das liefert zwar unterschiedlich große Schriften, ist aber wesentlich einfacher, als die Achsenbeschriftung selbst vorzugeben. . Alternative Graphikmodelle, D-Graphiken Größe, Form und Farbe der Punkte in den Panels angegeben wird. Wir wählen das spezielle Symbol ".", das auf einem pdf Device gerade einem Punkt ( / inch) entspricht. Die Farbe soll schwarz sein. Als nächstes ändern wir die Höhen und Breiten, die für Achsen, Achsenbeschriftungen, Label, Überschriften etc. vorgesehen sind, indem wir die meisten Werte der Elemente von layout.heights und layout.widths auf setzen, um den Plotbereich möglichst vollständig auszunutzen. Da die Ticks nun kürzer sind, kann man auch die Tickmarks näher an die Achsen schieben. Als letztes wird auch der Abstand der Achsenbezeichnung zu den Achsen durch entsprechende Setzungen der Elemente von axis.components kleiner gewählt. Die Graphik für dieses Buch wurde dann durch einen Aufruf von dev.copy(CairoPDF,...) erzeugt, um passende Fonts auch einzubetten. Die vielen Optionen sowie die bisher unvollständige Dokumentation der Optionen in den Hilfeseiten wird durch das Paket latticist gemildert, das eine recht intuitive graphische Oberfläche für die Veränderung vieler Optionen bereitstellt. Die Oberfläche wird durch den Befehl latticeStyleGUI bereitgestellt. Eine weitere Erleichterung der Arbeit ist die Funktion showViewport() des grid Pakets. Sie zeichnet auf das gegenwärtig geöffnete Device das Layout der verschiedenen Panels und deren Beschriftungsregionen. Das Paket latticeExtra stellt zudem etliche weitere Funktionen bereit, um Elemente von einzelnen Panels zu generieren. Schließlich sei Deepayan Sarkars Buch Lattice: Multivariate Data Visualization with R erwähnt, das nicht nur die Konstruktionsprinzipien statistischer Graphiken diskutiert und mit vielen Beispielen illustriert, sondern auch weitere Einzelheiten des lattice Pakets dokumentiert. Grammar of Graphics Das Paket ggplot2 implementiert eine Version eines Graphiksystems, das sich an den Ideen in Wilkinsons BuchThe Grammar of Graphics orientiert. Im Prinzip sind in dieser Sicht statistische Graphiken Transformationen von statistischen Daten in Attribute (Farbe, Größe oder Form) bestimmter geometrischer Formen wie Punkte, Linien oder Rechtecke. Dazu können zusätzlich statistische Zusammenfassungen (Dichteschätzer, Glätter, Histogramme, Regressionen etc.) kommen und es muss die Möglichkeit bestehen, bedingte Verteilungen (Verteilungen in Teilmengen der Daten) zu spezifizieren. Zudem braucht man Achsen und eine Angabe der Koordinaten in einer Graphik. Die letzten beiden Elemente werden von vornherein etwas allgemeiner und prinzipieller konzipiert als in der Standardgraphik: Unter scaleswerden Achsen, Achsenbeschriftungen und Legenden zusammengefasst als Hilfsmittel, um die inverse Abbildung von Graphiken zu den zugrundeliegenden Daten aus Nicht explizit angegebene Elemente von lattice.options behalten ihre voreingestellten Werte. Deepayan Sarkar: Lattice: Multivariate Data Visualization with R, Springer . Leland Wilkinson:The Grammar of Graphics, Springer . Tipps und weitere Möglichkeiten den Graphiken abzulesen. Und Koordinaten (coords) geben die Abbildung von Daten auf die Fläche der Graphik an. Dazu gehört dann nicht nur die Angabe der Projektion auf die Ebene sondern auch die Spezifikation von Hilfslinien wie Gittern in kartesischen (oder Polar-) Koordinaten und die Größenbeschriftung von Achsen. Die anderen Elemente der Grammatik haben ebenfalls einheitliche Namen, die auch durchgehend im Paket ggplot2 und seiner Dokumentation verwandt werden: Die geometrischen Formen werden geom genannt, statistische Zusammenfassungen heißen stat und die Angabe von Bedingungen (Systeme von Teilmengen der Daten) heißen facet. Neben diesen Basiselementen einer graphischen Grammatik braucht man noch Angaben für Fonts, Fontgrößen, Farben etc. Sie werden in ggplot2 als theme zusammengefasst. Eine Basisfunktion von ggplot2 ist qplot() (für „quick plot“), in der die graphischen Elemente ähnlich wie im plot Befehl einfach kombiniert werden können. Dieser Befehl wird ausführlich im Eingangskapitel von Hadley Wickhams Buch dokumentiert, das auch von seiner Homepage http: //had.co.nz/ggplot2 heruntergeladen werden kann. Der zweite Befehl ist ggplot(), der hier etwas detaillierter beschrieben werden soll. Wir nehmen als Beispiel die Miethöhen aus dem Mikrozensus und bauen stückweise eine Darstellung der gemeinsamen Verteilung von Miethöhe und Wohnungsgröße auf, die eine Alternative zu der in Abschnitt . beschriebenen Darstellungsform liefert. Wir wiederholen zunächst die Datenbereinigung und die Schätzung einer bivariaten Dichte: > library(foreign) > dat < read.spss("mz02_cf.sav", + to.data.frame=T,use.value.labels=F) > hh < dat$ef3∗100+dat$ef4 > oo < !duplicated(hh) > Wohn < cbind(dat[oo,"ef462"],dat[oo,"ef453"]) > o < complete.cases(Wohn) > Wohn < Wohn[o,] > set.seed(1432) > Wohn < subset(Wohn,Wohn[,1]>0&Wohn[,1]<=1800& + Wohn[,2]>=10&Wohn[,2]<300) > Wohn2 < Wohn[sample(nrow(Wohn),1000),] > library(ks) > band < Hpi(Wohn2,Hstart=diag(c(1100,30))) > bild1 < kde(Wohn2,H=band,gridsize=c(20,20)) HadleyWickham: ggplot : Elegant Graphics for Data Analysis, Springer . HadleyWickham ist der Entwickler von ggplot2. Insgesamt ist die in R direkt verfügbare Hilfe noch recht unvollständig. Allerdings ist die Dokumentation auf der schon genannten Homepage http: //had.co.nz/ggplot2 sehr hilfreich, deutlich vollständiger und z.Zt. weitgehend auf dem neuesten Stand. . Alternative Graphikmodelle, D-Graphiken Wir wollen die Kontourlinien der geschätzten Dichte nun aber zusammen mit allen Angaben darstellen. Versucht man zunächst, nur die Angaben als Scatterplot darzustellen, dann erhält man nur einen großen schwarzen Fleck und sicher keine Information über die Verteilung von Miethöhe und Wohnungsgröße. Wir können trotzdem genau so beginnen, denn wir können, wie in lattice, anschließend das erzeugte Graphikobjekt verändern und bessere graphische Möglichkeiten ausnutzen. > bild2 < ggplot(as.data.frame(Wohn),aes(V2,V1)) > bild2 < bild2+layer(geom="point",colour=alpha("black",0.3), + size=0.4) Der erste Befehl erzeugt noch keine Graphik. Er legt nur fest, welche Daten zu benutzen sind (es muss immer ein Dataframe sein). Und er legt die aesthetic fest, also welche Variable dargestellt werden sollen. Im aes Teil des ggplot Befehls kann man noch weitere Variablen angeben, die durch andere Aspekte der Graphik repräsentiert werden sollen, etwa durch Farben, die Größe oder das Aussehen. Entsprechende Angaben kann man in der Form ggplot(dat,aes(V1,V2,colour=V3) machen. Im zweiten Befehl wird dieser Basisinformation ein weiterer layer() hinzugefügt, in dem die geometry festgelegt wird, also welches geometrische Objekt dargestellt werden soll. Wir nehmen Punkte, wählen aber eine transparente schwarze Farbe, um auch Mehrfachbelegungen kenntlich zu machen und wählen für den Druck eine kleinere Größe der Punkte. Der layer wird mit dem (umdefinierten) + dem ursprünglichen Objekt bild2 (der Klasse ggplot) hinzugefügt. Das Ergebnis kann man sich ansehen, entweder interaktiv, in dem man bild2 aufruft, oder aus einem Programm heraus mit print(bild2). Es fehlen aber noch Achsenbeschriftungen, die äußeren Ränder sind für den Druck überflüssig und der betrachtete Wertebereich ist wohl zu groß. > bild3 <- bild2+ylim(50,1100)+xlim(10,150) > bild3 <- bild3+labs(y="Miete",x="Wohnungsgröße (qm)") > bild3 <- bild3+opts(plot.margin=unit(rep(0,4),"lines")) > bild3 <- bild3+opts(axis.title.x=theme_text(size=10), + axis.title.y=theme_text(size=10,angle=90)) > print(bild3) Der erste Befehl legt den Bereich der dargestellten Punkte fest. Wir speichern das Ergebnis auf einem neuen Objekt, um gegebenenfalls die Ausgangsgraphik weiter zur Verfügung zu haben. Dann werden die Achsen beschriftet, der äußere Rand auf gesetzt und die Fontgröße und Ausrichtung der Achsen- Dieses Vorgehen hat Nachteile, weil (zumindest in der Voreinstellung) alle Informationen zur Reproduktion des Graphikobjektes in dem Objekt gespeichert werden. Da die Graphik unabhängig von möglichen späteren Veränderungen des Datensatzes sein soll, wird eine Kopie aller relevanten Daten erzeugt. Das von ggplot erzeugte Graphikobjekt wird also sehr schnell sehr groß, insbesondere dann, wenn man weitere Elemente hinzufügt. Wir werden das gleich versuchen, bitten also Nutzer mit eher geringen Speicherkapazitäten, an Stelle des Dataframes Wohn in den folgenden Beispielen den Dataframe Wohn2 zu verwenden. Tipps und weitere Möglichkeiten beschriftungen angepasst. Die meisten Stilparameter sind dabei in themes angeordnet. Das erlaubt es, relativ schnell und einheitlich das Aussehen von Graphiken zu verändern, etwa wennman gleichzeitig eine Präsentationsgraphik und eine Version für ein Handout produzieren möchte. Die Voreinstellung, theme_gray, kann z.B. durch eine schwarz-weiße Version einfach durch > th < theme_set(theme_bw()) > bild3+theme_update(th) ersetzt werden. Es fehlen noch dieHöhenlinien des Dichteschätzers.Wir berechnen zunächst die Höhenlinien aus dem Objekt bild1 (mit den entsprechenden Befehlen des Pakets ks bzw. grDevices), anschließend benutzen wir ggplot2 für die graphische Darstellung der resultierenden Polygone: > kont < contourLevels(bild1,prob=c(.25,.5,.75)) > linien < contourLines(bild1$eval.points[[1]],bild1$eval.points[[2]], + bild1$estimate,levels=kont) Abbildung 14.2: Mieten und Wohnungsgrößen im Mikrozensus . Das Objekt linien ist eine Liste von Listen. Jede Liste enthält die x- und y- Koordinaten eines Polygons sowie die entsprechende Höhe der Dichte, so dass etwa %, % bzw. % der Datenpunkte in den Polygonen enthalten sind. Die Polygonzüge übergeben wir an ggplot2 und fügen zu bild3 jeweils ein Polygon der Liste hinzu. Bei der Festlegung der äußeren Ränder ist der oft hilfreiche unit()Befehl des Pakets grid benutzt worden, der die Berechnung von Koordinatenangaben in der Graphik und die Umrechnung in verschiedene Maßeinheiten sehr erleichtert. . Alternative Graphikmodelle, D-Graphiken > lapply(linien,function(x){ > bild3 << bild3+ + geom_polygon(data=data.frame(x=x$x,y=x$y), + mapping=aes(y,x),Ąll=alpha("grey10",0.3))}) Dabei haben wir einen unschönen Trick gebraucht: der Befehl << weisst das Ergebnis seiner rechten Seite dem Objekt auf der linken Seite zu, wobei das Objekt auf der linken Seite in der nächst höheren Umgebung gesucht und geändert wird. So kann man umgehen, dass die Definition eines Objektes durch eine einfache Zuweisung < nur innerhalb der Funktion definiert wäre. Aber mit diesem Trick muss man vorsichtig umgehen, denn nun hängt das Verhalten der Funktion nicht nur von ihrer Definition ab, sondern auch vom Zustand der Umgebung. Das Ergebnis ist Abbildung . . Anschließend wurde eine pdf Datei mit dev.copy(CairoPDF,...) erstellt, um die passenden Fonts auch einzubetten. In ggplot2 gibt es auch einen eigenen Befehl ggsave(), der direkt die entsprechenden Devices aus dem Paket grDevice benutzt. Da ggplot2 ebenso wie lattice auf dem Paket grid beruht, kann man alle Devices auch zusammen mit den Ergebnissen von ggplot2 Graphikbefehlen benutzen. . . D-Graphiken Oft ist es sehr hilfreich, Graphiken dreidimensionaler Zusammenhänge in der „richtigen“ Perspektive darstellen zu können. Zudem sind interaktive oder animierte Graphiken dreidimensionaler Zusammenhänge in Vorträgen und Präsentationen informativer als einzelne zweidimensionalen Projektionen, die notwendig in Artikeln oder anderen Veröffentlichungen benutzt werden müssen. Das Paket rgl erlaubt sowohl die perspektivische Darstellung dreidimensionaler Zusammenhänge als auch die Interaktion mit dieser Graphik, die Betrachtung aus verschiedenen Perspektiven und die Speicherung in diversen Graphikformaten. Viele Konzepte von freien Raytraycing-Programmen wie povray oder tachyon sind ebenfalls implementiert. Ein einfaches Beispiel ist ein dreidimensionaler Scatterplot: > library(rgl) > open3d() > x < rnorm(1000) > y < rnorm(1000) > z < (x∗y)/(x^2+y^2)+0.1∗rnorm(1000) > plot3d(x,y,z) Da der wesentliche Aspekt der rgl-Graphiken die Interaktion mit der Graphik ist, wird hier auf eine Abbildung verzichtet. Der assign() Befehl erlaubt eine genauere Steuerung von Zuweisungen in verschiedenen Umgebungen. Tipps und weitere Möglichkeiten . Große Datensätze und Datenbanken Da R alle Daten imHauptspeicher des Rechners ablegen muss, kann es bei sehr großen Datenmengen zu Engpässen und Schwierigkeiten bei der Datenmanipulation kommen. Eine Möglichkeit, mit dem Problem umzugehen, ist die Verwendung einer Datenbank, der man die Speicherung und Manipulation der Daten überlässt. Es gibt für praktisch alle gängigen Datenbankprogramme die Möglichkeit, direkt aus R heraus auf Daten aus der Datenbank zuzugreifen. Ein besonders für statistische Daten geeignetes Programm ist sqlite, ein freies Programm, das keinerlei Konfiguration benötigt und die Daten in einfachen Dateien speichert. Es ist unter http://www.sqlite.org erhältlich. Das entsprechende R-Paket ist RSQlite, das seinerseits das Paket DBI benutzt. Sie können installiert werden durch: > install.packages(c("DBI","RSQLite")) Als Beispiel benutzen wir den Datensatz daten aus dem Anfang des Abschnitts . . Er war durch die Befehle > name < c(rep("Hans",2),rep("Susi",2)) > t < rep(c(1,2),2) > x < c(2,3,4,5) > y < c(5,4,3,2) > daten < data.frame(name,t,x,y) definiert. Machen wir aus diesen Daten eine Datenbank. Die Daten müssen dazu in einer Form vorliegen, die vomDatenbankprogramm eingelesen werden kann. Um die Daten aus R heraus in eine Datei zu schreiben, benutzen wir: > write.table(daten,Ąle="test2.dat", + sep=";",na="NULL",col.names=F,row.names=F) Es werden also nur die Daten (ohne Variablen- oder Zeilennamen) geschrieben. Trennzeichen zwischenWerten ist „;“. Zudem ist derWert für fehlende Angaben NULL. Wenn es sich um sehr große Datensätze handelt, kann man diese Form der Datenaufbereitung für die Datenbank nicht mehr mit R vornehmen. Ein sehr mächtiges Hilfsmittel ist dann ein Streameditor, etwa http://gnuwin32. sourceforge.net/packages/sed.htm, der in Dateien beliebiger Größe Muster finden und ersetzen kann. Damit können Trennzeichen, Zeichen für fehlende Werte oder Dezimal- oder Tausendertrennzeichen ohne Größenbeschränkungen der Ausgangsdatei geändert werden. Als nächstes muss die Struktur der Datenbank festgelegt werden. Zusätzlich benötigt sqlite den Namen der Datei, in dem die Datenbank abgelegt werden soll. Beides kann in einem Terminal (der „Eingabeaufforderung“ in Microsoft- Betriebssystemen) erstellt werden, in dem sqlite aufgerufen wurde. Wenn etwa die Datei mit den Daten test.db heißen soll, dann kann man schreiben: sqlite erlaubt keine fehlenden Werte beim Datenimport, NULL ist aber der gängige Wert für „not available“ in fast allen Datenbanken. . Große Datensätze und Datenbanken $ sqlite3 test.db sqlite> .separator ";" sqlite> create table test (name,t,x,y); sqlite> .import "test2.dat" test sqlite> .quit Die erste Zeile ruft sqlite auf (der gegenwärtige Name des Datenbankprogramms ist sqlite3). Das Argument "test.db" des Aufrufs von sqlite3 ist der Name der Datei, die die Datenbank enthalten soll. Die zweite Zeile ist nun schon ein Befehl innerhalb von sqlite. Es ist zudem (kenntlich wegen des "." vor dem Befehl) ein spezifischer Befehl des sqlite Programms. Der Befehl legt das Trennzeichen fest, das beim Einlesen der Daten verwandt werden soll. Dann folgt ein Befehl in sql. sql (structured query language) ist in praktisch allen Datenbanken als Abfragesprache implementiert. sql Befehle werden immer mit einem ";" abgeschlossen. Der create table Befehl weist sqlite an, eine Datenbanktabelle mit dem Namen test anzulegen, die die Spalten mit den Namen name, t, x und y enthält. Und schließlich werden die Daten aus der Datei test2.dat in die Datenbanktabelle test importiert und sqlite mit .quit verlassen. Die Datenbank ist erstellt und man kann aus R heraus darauf zugreifen: > library(RSQLite) > m < dbDriver("SQLite") > con < dbConnect(m,dbname = "test.db") > dbGetQuery(con,"select count(*) from test") count(∗) 1 4 > t < dbGetQuery(con,"select t from test");t t 1 1 2 2 3 1 4 2 > is.data.frame(t) [1] TRUE > dbDisconnect(con) > dbUnloadDriver(m) Die ersten drei Zeilen laden das Paket RSQLite und stellen die Verbindung zur Datenbank her. Mit dbGetQuery() schickt man Anfragen (ein sql Befehl als String) an die Verbindung con. Die erste Anfrage fragt die Fallzahl ab, die zweite den Inhalt der Variablen t, der auf die R Variable t zugewiesen wird. Beachten Sie die Pfade zu Ihren Daten! Wenn Sie einen anderen Ort für die Datenbankdatei wünschen, müssen Sie ihn auch angeben. In anderen Datenbankprogrammen mag der Befehl anders heißen oder etwas andere Syntax haben. In allen aber gibt es ähnliche Befehle. Tipps und weitere Möglichkeiten Die Ergebnisse von dbGetQuery() Anfragen sind immer vom Typ data.frame. Die letzten beiden Zeilen beenden die Datenbankverbindung. In den letzten Jahren sind zudem diverse Pakete entwickelt worden, die die Arbeit mit großen Datensätzen erleichtern und die Daten entweder in Datenbanken ablegen (und deren Fähigkeiten für schnelle Auswahl von Teildatensätzen etc. ausnutzen) oder Dateien nutzen, um auch mit sehr großen Dataframes arbeiten zu können. In die erste Kategorie gehört etwa das Paket SQLiteDF, das es erlaubt, Dataframes in sqlite abzulegen, sie aber wie normale Dataframes zu behandeln. In die zweite Kategorie fällt etwa das Paket f, das Dataframes in Dateien speichert, für die Verarbeitung aber jeweils nur die benötigten Teildaten in den Speicher lädt. Das Paket enthält einige Optimierungsprozeduren, die den typischen Operatoren von Datenbanken ähneln und sie für R bereitstellen. Das Paket data.table implementiert eine Variante von Dataframes, die optimierte Zugriffe ebenso wie optimierte merge und Auswahloperatoren zur Verfügung stellen. data.table kann auch zusammen mit f benutzt werden und erlaubt dann Zugriffe auf (fast) beliebig große Datensätze. Schließlich ermöglicht das Paket memisc ein ähnliches Vorgehen für SPSS- und Stata-Dateien.

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.