Grafiken Session 4 1 Grundlegendes Bei der Analse von Daten sind Grafiken ein wichtiges Werkzeug. Viele Eigenschaften von Datensamples ((Auto)-Korrelationen, nicht lineare Zusammenhänge, mögliche Verteilungen,... ) offenbaren sich bereits in entsprechenden Plots. R bietet eine Vielzahl von Möglichkeiten Daten grafisch zu analsieren. Die Elementarste Funktion ist hierbei plot(,, tpe, main, sub, lab, lab), welche die Punkte ( i, i ) im R 2 darstellt. Hierbei können über main und sub die Über- bzw. Unterschriften gesteuert werden. Die Optionen lab und lab liefern die Möglichkeit die Achsenbeschriftungen zu ändern, während die Option tpe die Art des Plots festlegt (sollen Punkte, Linien oder Stufen gezeichnet werden, siehe help(lines) für Details). Mit dem Befehl par(... ) können eine Vielzahl an weiteren Parametern eingestellt werden (Schriftarten und Größen, Achsenkontrolle, Achsenbeschriftung, Dicke der Linien,... ). Ein Beispiel für die Änderung eines solchen Argumentes ist par(mfrow=c(,)), welches das Plotfenster in ein Gitter von mal Unterplots aufteilt. Folgende Befehle erzeugen zum Beispiel die Grafik in Abbildung 1 > <- 1:10 > <- sin( * 2 * pi/10) > par(mfrow=c(2,2)) > plot(,, lab=, lab= sin(), main= Points (Default) ) > plot(,, lab=, lab= sin(), main= Lines, tpe= l ) > plot(,, lab=, lab= sin(), main= Steps, Tpe 1, tpe= s ) > plot(,, lab=, lab= sin(), main= Steps, Tpe 2, tpe= S ) In R sind Plots nicht interaktiv, d.h. ist eine Grafik erzeugt, so können im Nachhinein nur noch beschränkt Veränderungen durchgeführt werden. Das Formatieren des Plots ist lediglich über die entsprechenden Befehle und deren Parameter möglich. Grafiken können aus R in Files gespeichert werden - es stehen hierbei grundsätzlich eine Vielzahl von möglichen Formaten zur Verfügung. Gespeichert wird eine Grafik entweder 1. indem man mit der rechten Maustaste auf das Grafikfenster klickt und den entsprechenden Menüpunkt auswählt. Hierbei ist zu beachten, dass das Speichern in dieser Weise nur als PostScript möglich ist. 2. indem man die Grafik bereits als entweder Postscript, PDF, Jpeg,... initialisiert. Diese Option setzt voraus, dass ein Grafikfenster (eine device) mit einem dem Format entsprechenden Befehl geöffnet wird. Zum Beispiel > <- 1:10 > <- sin( * 2 * pi/10) > jpeg(file= mplot.jpg, width = 400, height = 400, qualit=100) > plot(,, lab=, lab= sin(), main= Points (Default) ) > dev.off() 1
Points (Default) Lines sin() 1.0 0.5 0.0 0.5 1.0 sin() 1.0 0.5 0.0 0.5 1.0 2 4 6 8 10 2 4 6 8 10 Steps, Tpe 1 Steps, Tpe 2 sin() 1.0 0.5 0.0 0.5 1.0 sin() 1.0 0.5 0.0 0.5 1.0 2 4 6 8 10 2 4 6 8 10 Abbildung 1: Verschiedene Lineplots erzeugt ein.jpeg File, das den entsprechenden Plot zeigt, 400 Piel hoch und breit ist und in bestmöglicher Qualität gespeichert wurde. Für weitere Optionen des jpeg() Befehles siehe die Online- Hilfe. Wichtig ist hierbei, dass die device auf die gezeichnet wird (hier die Datei mplot.jpg) am Ende mit dev.off() geschlossen wird. Es sei darauf hingewiesen, dass es auch möglich ist mehrere devices gleichzeitig zu bearbeiten. In diesem Fall benötigt man einige Funktionen, um zwischen den devices zu wechseln (dev.set()), sich die aktive device anzeigen (dev.cur()) zu lassen und so weiter. Auf ähnliche Weise wie oben beschrieben lassen sich nun auch Bilder in anderen Formaten speichern (siehe die Befehle: pdf(... ), postscript(... ), bmp(... ),... ). 2
2 Spezielle Plots 2.1 Histogramme Zur Visualisierung von diskreten Verteilungen werden oft Histogramme benutzt. In R können Histogramme mit dem Befehl hist(, breaks, freq,... ) erzeugt werden. Hierbei können eine Vielzahl von Parametern eingestellt werden (siehe Hilfe bzw nachfolgendes Beispiel und Abbildung 2). > par(mfrow=c(2,2)) > <- rnorm(10000)*10 > hist(,freq=true,breaks=3,densit=5,angle=135,col= red,main=,lab= X N(0, 10) ) > hist(,freq=false,breaks=20,densit=10,angle=45,col= blue,main=,lab= X N(0, 10) ) > hist(,freq=false,breaks=-50:50,densit=10,angle=225,main=,lab= X N(0, 10) ) > hist(rnorm(10000)*10,freq=true,breaks= Sturges,main=,lab= X N(0, 10) ) 2.2 Bo Plots Hat man gruppierte Daten, kann man sich mit einem Bo Plot einen schnellen Überblick über die Verteilungen von bestimmten Variablen in den verschiedenen Gruppen verschaffen. Der Bo Plot visualisiert im Wesentlichen die Quartile der gruppierten Daten. Hierbei wird der Bereich zwischen erster und dritter Quartile durch eine bo dargestellt. Der Median (das zweite Quartil) ist als Line eingezeichnet. Alle Datenpunkte, die mehr als 1.5 mal dem Inter-Quartilsabstand von dem ersten Qunatil nach unten bzw dem dritten Quartil nach oben abweichen, werden als Ausreißer betrachtet und als Kreise über den sogenannten whiskers dargestellt. Die whisker (horizontalen Linien) markieren also die kleinsten bzw größten Werte in einer Gruppe, die noch nicht als ungewöhnlich groß bzw klein gewertet werden. Die Spezifikation welche Datenpunkte als Ausreißer betrachtet werden, kann im Funktionsaufruf geändert werden. Die R Funktion, welche Bo Plots erzeugt, ist boplot(,..., range = 1.5, notch = FALSE, names, horizontal = FALSE,... ). Die Funktion hat viele mögliche Parameter (siehe R Hilfe). Im nachfolgenden Beispiel werden gruppierte Daten (3 Gruppen) untersucht. Die Daten sind in dem Data Frame eperiment gespeichert, welches die drei Spalten: outcome, group, validit aufweist, gespeichert. Die Werte in outcome sind die zu visualisierenden Daten, die Werte in group beschreiben die Gruppenzugehörigkeit und die Einträge in der Spalte validit beschreiben, ob eine Beobachtung valide zustandegekommen ist (mögliche Werte: valid oder Invalid). > par(mfrow=c(2,2)) > boplot(outcome ~ group, eperiment, range = 1, outline=t, horizontal=f, col= red ) > boplot(outcome ~ group, eperiment, range = 1, outline=f, horizontal=t, col= green ) > boplot(outcome ~ group, eperiment, range = 1.5, outline=t) > boplot(outcome ~ group, eperiment, range = 1.5, subset=validit== Valid ) Das Ergebnis ist in der Abbildung 3 zu sehen. 2.3 qq-plots Ein qq-plot dient dazu die Quantile zweier Verteilungen zu vergleichen. Es werden hierbei die entsprechenden Quantile der beiden Verteilungen als zweidimensionale Datenpunkte aufgefasst und in einem 3
Frequenc 0 2000 4000 Densit 0.00 0.02 40 20 0 20 40 X~N(0, 10) 40 20 0 20 40 X~N(0, 10) Densit 0.00 0.02 0.04 Frequenc 0 500 1500 40 20 0 20 40 X~N(0, 10) 40 20 0 20 40 X~N(0, 10) Abbildung 2: Histogramme 4
1 2 3 60 20 20 60 1 2 3 60 20 0 20 40 60 1 2 3 60 20 20 60 1 2 3 60 20 20 60 Abbildung 3: Boplots Diagramm dargestellt. Sind die beiden Verteilungen gleich, dann befinden sich die Punkte ungefähr auf der 45 Linie durch das Diagramm. An Abweichungen von dieser Linie kann erkannt werden, ob und wie sich die beiden Verteilungen unterscheiden. Die R-Funktion qqplot(,,... ) empfängt als Arguments im Wesentlichen die beiden Verteilungen gegeben durch Datenpunkte (Annahme: alle Wahrscheinlichkeiten gleich). Falls eine Verteilung mit einer Normalverteilung verglichen werden soll, kann alternativ auch die Funktion qqnorm(,... ) verwendet werden, welche nur ein Inputargument hat und die benötigten Quantile der Normalverteilung selbstständig berechnet. Das nachfolgende Beispiel (siehe Abbildung 4) zeigt einerseits ein Sample aus der Normalverteilung geplottet gegen die theoretischen Quantile der Normalverteilung und andererseits ein Sample aus einer t-verteilung geplottet gegen die theoretischen Quantile der Normalverteilung. Wenig überraschend zeigt sich bei dem ersten Bild eine gute Übereinstimmung der beiden Verteilungen während sich aus dem zweiten Plot ablesen lässt, dass das Sample aus der t-verteilung deutlich schwerer Enden hat als die Normalverteilung. 5
> par(mfrow=c(1,2)) > 1 <- rnorm(100) > <- qnorm( (1:100)/101) > qqplot(1, ) > ma <- ma(ma(1), ma()) > mi <- min(min(1), min()) > z <- (1:100)*(ma-mi)/100 - abs(mi) > lines(z,z,col= blue,lwd=2) > > 2 <- qt(runif(1000), df=5) > qqplot(2,) >... > lines(z,z,col= blue,lwd=2) Man beachte, dass R nicht selbstständig die Solllinie in das Diagramm einzeichnet. Bei Normalverteilten Daten kann dies mit dem Befehl qqline(... ) erreicht werden. Im allgemeinen Fall kann der selbe Effekt - wie oben geschehen - mit dem Lines Befehl erreicht werden, der nachträglich eine Linie in den Plot einfügt. 2 0 2 2 0 2 2 0 1 2 3 1 8 4 0 4 2 Abbildung 4: QQ-Plots 2.4 Scatterplots Scatterplots dienen dazu den Zusammenhang zwischen zwei Variablen grafisch darzustellen. Voraussetzung dafür ist das gemeinsame Realisierungen ( 1, 1 ),..., ( n, n ) eines Zufallsvektors (X,Y) vorliegen. Diese Paare werden in einem Scatterplot als Punkte im R 2 geplottet. Besteht ein eindeutiger Zusammenhang, ist das in der Regel an der Verteilung der Punkte zu erkennen. Scatterplots eignen sich besonders dafür, nicht lineare zusammenhänge zu erkennen, die durch die durch das gängige Zusammenhangsmaß Korrelation nicht oft nicht korrekt erkannt werden. Ein Scatterplot wird in R mit dem Befehl plot(... ) erzeugt. In Abbildung 5 sieht man vier unterschiedliche Scatterplots 1. der erste lässt keinerlei Zusammenhang zwischen den Variablen erkennen 6
0.0 0.2 0.4 0.6 0.8 1.0 0.0 0.4 0.8 [,1] [,2] 4 2 0 2 4 0 5 10 20 4 2 0 2 4 2 0 2 4 2 0 2 4 3 1 1 2 3 Abbildung 5: Scatterplots 2. der zweite deutet auf einen quadratischen Zusammenhang der beiden Variablen hin 3. im dritten Plot ist eine lineare Abhängigkeit der beiden Variablen sichtbar 4. der vierte Plot zeigt ein nicht lineares (oszilierendes) Muster 2.5 Plotten von analtischen Funktionen Die meisten Diagrammtpen in R stellen eine Menge von Datenpunkten grafisch dar. Es gibt allerdings auch die Möglichkeit Funktionen, die in Analtischer Form gegeben sind zu zeichnen. Hierbei wir die Funktion curve(... ) verwendet. 7
> par(mfrow=c(2,2)) > curve(^3-3*, -2, 2) > curve(^2-2, add = TRUE, col = violet ) > curve(cos, -pi, 3*pi, col = blue ) > chipp <- function() sin(cos()*ep(-/2)) > curve(chipp, -8, 7, n=2001) > = rnorm(100) > hist(, prob=t) > curve(dnorm, -3,3, add=t, col= blue ) Als Argument wird der Funktion curve(... ) entweder eine Formel oder eine Funktion übergeben. Wird das Argument add auf true gesetzt, dann fügt R die gewünschte Kurve in die momentan aktive Grafik ein. Das Argument n legt fest wieviele Stützpunkte R beim Interpolieren der Funktion verwenden soll - je mehr Stützpunkte verwendet werden desto feiner ist die Grafik. Besonders bei sehr wilden Funktionen empfiehlt es sich eine große Zahl an Stützpunkten zu verwenden. Alternativ kann die Funktion splinefun(... ) verwendet werden um eine Spline interpolation einer Funktion zu erzeugen. 3 Beschriftung und Achsen Plots können durch entsprechende Befehle im Nachhinein verbessert werden. Es kann das Achsenverhalten kontrolliert, diverse Beschriftungen eingefügt und eine Legende hinzugefügt werden. Die wichtigsten Befehle hierzu sind: ais(... ), legend(... ), title(... ), mtet(... ), par(... ), prett(... ),.... 4 Beispiele 1. Finde oder generiere Daten und verwende diese um drei verschiedene Plots auszuprobieren, die hier nicht besprochen wurden (zb: Pie-Charts, Barplot, Dotchart, 3D Scatterplots,... ) 2. Simuliere Zufallsdaten aus drei verschiedenen Normalverteilgungen und erstelle (a) ein Histogramm für jedes einzelne Sample (b) einen Boplot, der die Unterschiede zwischen den Samples verdeutlicht. 3. Wiederhole die Arbeitsschritte aus Aufgabe 2 mit verschiedenen Verteilungen anstatt mit verschiedenen Parametern. Verwende die Standardnormal-, Cauch-, Eponential-, Log-Normal-, Student s t- und eine uniforme Verteilung. Tipp: Zufallszahlen aus einer beliebigen Verteilung lassen sich mittels runif(... ) plus der entsprechenden Quantilsfunktion (inversen Verteilungsfunktion) generieren. 4. Vergleiche mittels eines QQ-Plots die theoretischen Quantile einer Standardnormalsverteilung mit (a) den empirisch ermittelten Quantilen der t-verteilung mit 1,3 bzw 5 Freiheitsgraden. (b) den empirisch ermittelten Quantilen der Eponentialverteilung (c) den empirisch ermittelten Quantilen einer Cauch Verteilung. 5. Ziehe k mal m Zufallszahlen aus einer Binomialverteilung mit den Parameter (n,p), wobei (a) k = 100, m = 100, p = 0.5 und n = 150 (b) k = 1000, m = 50, p = 0.1 und n = 150 (c) k = 500, m = 1000, p = 0.1 und n = 150 8
^3 3 * 2 1 0 1 2 cos () 1.0 0.0 0.5 1.0 2 1 0 1 2 2 0 2 4 6 8 Histogram of chipp () 1.0 0.0 0.5 1.0 Densit 0.0 0.1 0.2 0.3 0.4 5 0 5 3 2 1 0 1 2 Abbildung 6: Plotten von Funktionen und bilde für jedes m-tupel die entsprechenden Mittelwerte. Vergleiche die Quantile der dadurch erhaltenen Datenpunkte mit den theoretischen Quantilen der Normalverteilungen, die gleiche Varianzen bzw Mittelwerte aufweisen wie die Verteilungen der aus denen simuliert wurde. 6. Lies die Hilfe zur Funktion densit(...). Generiere Beispieldaten, erstelle ein Histogramm von denselben und zeichne in dieses Dichteschätzer für die Daten ein. Eperimentiere mit verschiedenen Datensets bzw Einstellungen von densit(...) und erkläre die Funktionalität der Funktion anhand der präsentierten Beispiele. 9