Einführung in die Software R: Unterstützung für Teilnehmer der Veranstaltung „Statistische Methodenlehre 1“ 3. Veranstaltung 14.11.2000 In der letzten Veranstaltung ging etwa der folgende Befehl nicht: > plot(sin,-pi,2*pi,cex=2) Mit dem Argument cex=2 wollten wir die Achsenbeschriftung vergrößern. Nicht alle graphischen Parameter kann man innerhalb der Funktion plot verwenden. Folgende Befehlsfolge wirkt: > par(cex=2) > plot(sin,-pi,2*pi) Mit der Funktion par werden graphische Parameter vereinbart (siehe Hilfe) oder rufen Sie > par() auf, um einen Eindruck zu bekommen, welche Möglichkeiten es zur Gestaltung einer Graphik gibt. Wir wollten eine Funktion schreiben, um dieselben Eingaben nicht ständig wiederholen zu müssen. Ganz einfache Funktionen können Sie in der R-Console schreiben. Für größere Funktionen empfiehlt sich die Benutzung eines Editors. Wir schreiben zunächst einige kleinere Funktionen in der R-Console. xquadrat<-function(x) { xquadrat<-x*x xquadrat} Die Funktion xquadrat berechnet das Quadrat von x. Die letzte Zeile ist unbedingt nötig, um eine Ausgabe zu erzielen. > xquadrat(2) [1] 4 > xquadrat(3) [1] 9 > plot(xquadrat,-4,4) # Plottet die Funktion y=x2 von –4 bis 4 Wir wollen jetzt eine Funktion schreiben, die ein beliebiges Polynom zweiten Grades berechnet. >polynom<-function(x=0,a=0,b=0,c=1) { y<-a+b*x+c*x^2 y } > polynom(2,2,-1,3)# Berechnet y=2-x+3x2 an der Stelle x=2 [1] 12 > polynom(-5:5,2,-1,3) # Berechnet y=2-x+3x2 für x=-5, -4, -3, ...,5 [1] 82 54 32 16 6 2 4 12 26 46 72 Wir wollen jetzt eine Funktion schreiben, die ein Polynom plottet. Innerhalb einer Funktion können wir wohl selbstgeschriebene als auch in R implementierte Funktionen verwenden. Im folgenden Beispiel verwenden wir polynom und plot. Wir wollen eine Funktion schreiben, die für variable Koeffizienten a, b und c ein Polynom y=a+bx+cx2 berechnet und als Graphik in einem x,y-Koordinatensystem darstellt. Wir schreiben diese Funktion mit einem Editor z.B. mit Word oder Wordpad. Wir geben der Funktion den Namen polyplot. Dies geschieht durch die übliche Namenszuweisung mit dem Kleiner- und Minus-Zeichen. Auf der rechten Seite steht zunächst function. polyplot<-function Damit wird vereinbart, dass polyplot eine Funktion sein soll. In runden Klammern werden dann die Namen der Argumente vereinbart. Überlegen wir uns, welche Argumente diese Funktion haben soll. Sie soll ein beliebiges Polynom zweiten Grades y=a+bx+cx2 berechnen und in einem bestimmten Bereich zeichnen. Also brauchen wir als Argumente unserer Funktion zunächst die Parameter des Polynoms, d.h. polyplot<-function(a,b,c Des weiteren müssen wir den Bereich festlegen, über dem das Polynom gezeichnet werden soll. Wir verwenden ein Intervall. Das Polynom soll von der unteren Intervallgrenze bis zur oberen Intervallgrenze gezeichnet werden, d.h. von und bis sind die weiteren Argumente unserer Funktion. Die erste Zeile sieht also so aus: polyplot<-function(a,b,c,von,bis) Die Befehle, die diese Funktion ausführen soll, werden dann, eingeschlossen in geschweifte Klammern, in die nächsten Zeilen geschrieben, d.h. das Grundgerüst unserer Funktion ist das folgende: polyplot<-function(a,b,c,von,bis) { } Wir müssen jetzt die geschweiften Klammern füllen. Was soll unsere Funktion machen? Sie soll schließlich unser Polynom zeichnen. Wir können leider nicht den Befehl plot(function, from, to) verwenden (z.B. hatten wir plot(log,1,10)) verwenden. Dies geht jedoch nicht mit der Fumktion polynom, die wir gerade geschrieben haben, da sie noch von den Argumenten a, b und c abhängt. Deshalb definieren wir uns, wie wir das in der ersten Veranstaltung getan haben, eine Folge von x-Werten, für die wir dann als y-Wert den Wert des Polynoms berechnen. Die Folge der x-Werte definieren wir mit dem Befehl seq, dieser Befehl hat die Argumente (siehe Hilfe) from, to und length. Die Bedeutung dieser Argumente ist durch ihren Namen erklärt. polyplot<-function(a,b,c,von,bis) { x<-seq(from=von, to=bis, length=1000) } Wir berechnen jetzt für diese x-Werte das Polynom y=a+bx+cx2. Dazu benutzen wir unsere Funktion polynom, der wir die Argumente x, a, b und c übergeben. polyplot<-function(a,b,c,von,bis) { x<-seq(from=von, to=bis, length=1000) y<-polynom(x,a,b,c) } Jetzt schreiben wir noch den Plotbefehl in unsere Funktion. polyplot<-function(a,b,c,von,bis) { x<-seq(from=von, to=bis, length=1000) y<-polynom(x,a,b,c) plot(x,y,type=”l”) } Die Funktion ist jetzt fertig. Sie ist zunächst in die R-Console zu kopieren, d.h sie ist in Word zu markieren und zu kopieren und wird dann in R eingefügt. Geben Sie polyplot ein, um sich zu überzeugen, dass die Funktion in R jetzt vorhanden ist. Sie kann jetzt so aufgerufen werden: polyplot(a=0,b=1,c=2,von=-4,bis=5) oder gleichwertig ohne Namen der Argumente: polyplot(0,1,2,-4,5) Die folgende Graphik zeigt das Ergebnis. Wir haben bei der Defintion der Funktion polyplot in der Zeile polyplot<-function(a,b,c,von,bis) nur die Namen der Argumente geschrieben. Wir haben den Argumenten keine Standardwerte zugewiesen, d.h. alle Argumente sind verlangte Argumente, müssen also bei jedem Aufruf der Funktion angegeben werden. Standardwerte werden mit dem Gleichheitszeichen und einem folgenden Wert zugewiesen. Durch die Zeile polyplot<-function(a=0,b=0,c=1,von=-3,bis=3) wird also a und b der Wert 0, c der Wert 1, von der Wert –3 und bis der Wert 3 zugwiesen. Folgendes ist also die endgültige Version unserer Funktion polyplot. polyplot<-function(a=0,b=0,c=1,von=-3,bis=3) { x<-seq(from=von, to=bis, length=1000) y<-polynom(x,a,b,c) plot(x,y,type=”l”) } Bei Eingabe von polyplot() werden also die Standardwerte verwendet, d.h. es wird das Polynom y=x2 von –3 bis 3 gezeichnet. polyplot(2,-1,3,-5,5) # Zeichnet y=2-x+3x2 von x=-5 bis x=5 Wir wollen unsere Graphik etwas verfeinern und beschriften, d.h. einige der graphischen Parameter, die wir in der letzten Veranstaltung kennengelernt haben, verwenden, so soll z.B. die Kurve rot und in Linienstärke 3 gezeichnet werden. Außerdem soll unsere Graphik einen Titel und eine andere y-Achsenbeschriftung erhalten. Probieren wir die Eingabe (wir verwenden die Defaultwerte für a, b, c, von und bis): polyplot(main=”Normalparabel”,ylab=”f(x)”,col=”red”,lwd=4) Wir erhalten die Fehlermeldung: Error in polyplot(main = "Normalparabel", ylab = "f(x)", col = "red", : unused argument(s) (main ...) Die graphischen Parameter stehen also nicht zur Verfügung. Um das zu erreichen, brauchen wir nur in der Definitionszeile nach den Argumenten drei Punkte ... einzufügen. Das gleiche machen wir beim Aufruf der Funktion plot. Damit können wir alle Argumente zu plot auch in unserer Funktion polyplot verwenden. polyplot<-function(a=0,b=0,c=1,von=-3,bis=3,...) { x<-seq(from=von, to=bis, length=1000) y<-polynom(x,a,b,c) plot(x,y,type=”l”,...) } Ein erneuter Aufruf von polyplot(main=”Normalparabel”,ylab=”f(x)”,col=”red”,lwd=4) ergibt die folgende Graphik: Eine alternative Defintion unserer Funktion polyplot ist die folgende: polyplot<-function(a=0,b=0,c=1,von=-3,bis=3,...) { polyx<-function(x) { polyx<-polynom(x,a,b,c) } plot(polyx,von,bis,...) } Hier haben wir innerhalb der Funktion polyplot eine Funktion polyx definiert durch die Anweisungen innerhalb der folgenden geschweiften Klammern. Diese Funktion hat nur x als Argument und übernimmt die Werte von a, b und c. Jetzt haben wir eine völlig festgelegte Funktion (keine R-Funktion, sondern eine mathemaische Funktion, die für jedes x den Funktionswert f(x) berechnet), die wir nach dem Muster plot(function, from, to) zeichnen können. Wir hatten beim letzten Mal den Befehl barplot(table(sample(6,size=1000,replace=T))/1000) verwendet. Dabei wurde mit sample eine Stichprobe aus den ganzen Zahlen von 1 bis 6 der Größe 1000 mit Zurücklegen gezogen. Mit table werden die Häufigkeiten für die Werte 1 bis 6 ausgezählt. Wir dividieren durch 1000 und berechnen damit die relativen Häufigkeiten. Die Funktion barplot zeichnet ein Balkendiagramm. Das Ergebnis ist ähnlich wie das von plot(table(sample(6,size=1000,replace=T))/1000,type="h") Wir verwenden weiterhin die Funktion barplot, wollen die Graphik aber etwas verfeinern, insbesondere den Stichprobenumfang als Argument eingeben können. Außerdem wollen wir durch ein Argument entscheiden können, ob die relativen oder absoluten Häufigkeiten dargestellt werden sollen. Schließlich soll auch die Verwendung graphischer Parameter möglich sein. Nennen wir unsere Funktion wuerfelsim. Als Argumente verwenden wir n für die Stichprobengröße und rel. Mit rel wollen wir festlegen, ob die relativen oder absoluten Häufigkeiten dargestellt werden sollen. Damit hat rel eine ähnliche Funktion wie replace in der Funktion sample. Es ist also eine logische Variable, die die Werte True und False annehmen kann. Wir verwenden True als Defaultwert, d.h. zeichnen die relativen Häufigkeiten. Das Grundgerüst unserer Funktion sieht also so aus: wuerfelsim<-function(n=100,rel=T,...) { } Jetzt füllen wir die Klammern, beginnen mit dem Ziehen der Stichprobe. wuerfelsim<-function(n=100,rel=T,...) { stich<-sample(1:6,size=n,replace=T) hauf<-table(stich) hori<-n/6 Titel<-“Balkendiagramm der absoluten Häufigkeiten“ if(rel==T) {hauf<-hauf/n hori<-1/6 Titel<-“Balkendiagramm der relativen Häufigkeiten“ } print(hauf) barplot(hauf,main=Titel,...) abline(h=0) abline(h=hori,lwd=3,col=“blue“) } Wir haben nicht erklärt, was in den einzelnen Schritten getan wird. Wir wollen das als Kommentare hinter die Befehle schreiben. Wichtige Funktionen sollten Sie stets mit Kommentaren versehen, damit Sie Ihre Funktionen auch später noch verstehen. wuerfelsim<-function(n=100,rel=T,...) # Definition der Funktion { stich<-sample(1:6,size=n,replace=T) # Ziehen der Stichprobe hauf<-table(stich) # Auszählen der Häufigkeiten hori<-n/6 # bei hori eine horizontale Linie Titel<-“Balkendiagramm der absoluten Häufigkeiten“ # Titel if(rel==T) # wenn rel Wahr ist, dann das folgende {hauf<-hauf/n # relative Häufigkeiten hori<-1/6 # Linie bei 1/6 statt 1/6 Titel<-“Balkendiagramm der relativen Häufigkeiten“ # Titel } print(hauf) # drucke Tabelle der Häufigkeiten barplot(hauf,main=Titel,...) # zeichne barplot abline(h=0) # zeichne x-Achse abline(h=hori,lwd=3,col=“blue“) # ziehe Horizontale bei hori } Mit dem Befehl wuerfelsim() erhalten wir die Standardausgabe unserer Funktion, das Balkendiagramm der relativen Häufigkeiten für n=100 Simulationen eines fairen Würfels. Da uns die Balken zu dicht sind, können wir das Argument space von barplot verwenden, um den Abstand der Balken zu regulieren. wuerfelsim(space=2) erzeugt größere Abstände zwischen den Balken. Mit wuerfelsim(n=1000, rel=F, space=2) wird ein Balkendiagramm der absoluten Häufigkeiten beim Stichprobenumfang n=1000 gezeichnet. Wir möchten vielleicht noch Text in unsere Graphik schreiben. Vielleicht den Stichprobenumfang vermerken. Die beiden folgenden Befehle schreiben den Text n=1000 an eine mit Mausklick bestimmbare Position. Im zweiten Fall wird die Schrift größer. > text(locator(1),"n=1000") > text(locator(1),"n=1000",cex=2) Beim nächsten Mal werden wir lernen, wie man solchen Text in Abhängigkeit vom Argument n in die Graphik schreiben kann. Wir werden die Graphik noch etwas verfeinern.