Kursziele. Fortgeschrittene Programmierung mit R. Statistik und Computer. Philosophisches. Applications. Theory. Methodology 1950 2000



Ähnliche Dokumente
Statistik und Computer Statistische Software (R) Paul Fink, M.Sc. Formeln und Code Was ist Statistiksoftware?

Statistische Software (R-Vertiefung) Kontrollstrukturen: Bedingte Anweisungen. Logische Operatoren & Verknüpfungen. Syntax. Paul Fink, M.Sc.

Dokumentation. estat Version 2.0

Erwin Grüner

Python Installation. 1 Vorbereitung. 1.1 Download. Diese Anleitung ist für Windows ausgelegt.

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Klausurteilnehmer. Wichtige Hinweise. Note: Klausur Informatik Programmierung, Seite 1 von 8 HS OWL, FB 7, Malte Wattenberg.

Die R-Homepage R herunterladen

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER

> patienten<-data.frame( c(28,61,79,54,na,48), c(2,2,3,2,1,1), c("pillen","pillen","massage","gymnastik","massage","gymnastik"),

Running R. Windows Aus Menü. Lese R Code ein führt den Code auch gleich aus, eventuell muss vorher das Verzeichnis gewechselt werden.

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Kurzanleitung. Toolbox. T_xls_Import

Statistische Software (R)

Mit der Maus im Menü links auf den Menüpunkt 'Seiten' gehen und auf 'Erstellen klicken.

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Professionelle Seminare im Bereich MS-Office

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein.

OP-LOG

Datenübernahme von HKO 5.9 zur. Advolux Kanzleisoftware

Übungen Programmieren 1 Felix Rohrer. Übungen

KURZANLEITUNG CLOUD OBJECT STORAGE

Programmierkurs Java

1 Einleitung. Lernziele. Symbolleiste für den Schnellzugriff anpassen. Notizenseiten drucken. eine Präsentation abwärtskompatibel speichern

1 Vom Problem zum Programm

Mediator 9 - Lernprogramm

Erstellen von x-y-diagrammen in OpenOffice.calc

Einführung in die Programmierung

Suche schlecht beschriftete Bilder mit Eigenen Abfragen

Java Kurs für Anfänger Einheit 5 Methoden

Grundlagen C R ash-kurs

R-Tutorial. R bietet zahlreiche Hilfe-Funktionen an. Informiere Dich über die Funktion log():

Arbeiten mit UMLed und Delphi

2. Word-Dokumente verwalten

Praktische Mathematik: Lineare und Netzwerk-Optimierung (SS 2015) Praktikumsaufgaben

32.4 Anpassen von Menüs und Symbolleisten 795i

Einführung in PHP. (mit Aufgaben)

Ihre Interessentendatensätze bei inobroker. 1. Interessentendatensätze

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Handbuch Fischertechnik-Einzelteiltabelle V3.7.3

Fachbericht zum Thema: Anforderungen an ein Datenbanksystem

R ist freie Software und kann von der Website.

Excel Pivot-Tabellen 2010 effektiv

Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten

Modellierung und Programmierung 1

Artikel Schnittstelle über CSV

MetaQuotes Empfehlungen zum Gebrauch von

1 Dokumentenmanagement

SANDBOXIE konfigurieren

Speichern. Speichern unter

Erstellen einer PostScript-Datei unter Windows XP

Was ist PDF? Portable Document Format, von Adobe Systems entwickelt Multiplattformfähigkeit,

Tipps und Tricks zu den Updates

Stundenerfassung Version 1.8 Anleitung Arbeiten mit Replikaten

Statistik und Computer. Statistische Software (R) Was ist Statistiksoftware? Formeln und Code. Applications. Theory. Methodology

Einführung in die Java- Programmierung

Step by Step Webserver unter Windows Server von Christian Bartl

Künstliches binäres Neuron

In 12 Schritten zum mobilen PC mit Paragon Drive Copy 11 und Microsoft Windows Virtual PC

Installationsanleitung dateiagent Pro

Zur drittletzten Zeile scrollen

Zahlen auf einen Blick

Installationsanleitung für pcvisit Server (pcvisit 15.0)

Übung: Verwendung von Java-Threads

Tipps und Tricks zu Netop Vision und Vision Pro

FORUM HANDREICHUNG (STAND: AUGUST 2013)

Herstellen von Symbolen mit Corel Draw ab Version 9

Abamsoft Finos im Zusammenspiel mit shop to date von DATA BECKER

Konvertieren von Settingsdateien

CdsComXL. Excel add-in für Bearbeitung und Auswertung der CDS-daten. ComXL-020/D, Spur Spur Spur Spur

Statistische Software (R)

Wir arbeiten mit Zufallszahlen

Beheben von verlorenen Verknüpfungen

Aktivierung der SeKA-Anmeldung

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

EasyWk DAS Schwimmwettkampfprogramm

Web-Kürzel. Krishna Tateneni Yves Arrouye Deutsche Übersetzung: Stefan Winter

VBA-Programmierung: Zusammenfassung

Gratis Excel SVERWEIS Funktions-Anleitung, Tutorial, ebook, PDF-E-Book

Datenmaske für SPSS. Für die Datenanalyse mit SPSS können die Daten auf verschiedene Weise aufbereitet

Bedienungsanleitung Einsatzplanung. Bedienungsanleitung Einsatzplanung. Inhalt. Bedienung einer Plan-Tabelle

Wir basteln einen Jahreskalender mit MS Excel.

S TAND N OVEMBE R 2012 HANDBUCH DUDLE.ELK-WUE.DE T E R M I N A B S P R A C H E N I N D E R L A N D E S K I R C H E

Installation SQL- Server 2012 Single Node

Wichtige Hinweise zu den neuen Orientierungshilfen der Architekten-/Objektplanerverträge

Kleine Einführung in die lineare Regression mit Excel

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Dokumentation IBIS Monitor

Text-Zahlen-Formatieren

Wie Sie mit Mastern arbeiten

Ein Tool zum Konvertieren von Pegasus Mail Adressbüchern und Verteilerlisten in Novell Groupwise Adressbücher.

Arge Betriebsinformatik GmbH & Co.KG, CAP News 40, Februar CAP-News 40

1 Mathematische Grundlagen

FastViewer Remote Edition 2.X

tentoinfinity Apps 1.0 EINFÜHRUNG

Grundlagen von Python

Cookies. Krishna Tateneni Jost Schenck Übersetzer: Jürgen Nagel

Tevalo Handbuch v 1.1 vom

GEONET Anleitung für Web-Autoren

Transkript:

Kursziele Verwendung einer objekt-orientierten statistischen Rechenumgebung zur Umsetzung neuer Methoden Einsatz neuerer graphischer Verfahren Fortgeschrittene Programmierung mit R Torsten Hothorn Institut für Statistik Ludwig-Maximilians-Universität München Automatisiertes Verteilen und Testen von Software, Daten und Dokumentation John Chambers: Turn ideas into software, quickly and faithfully. Einleitung Hilfe zur Selbsthilfe WS 2007/2008 1 Statistik und Computer Efron (2001): Statistik im 20. Jahrhundert Applications Philosophisches 1900 Theory? Methodology 1950 2000 Mathematics Computation WS 2007/2008 3

Formeln und Code Was ist Statistiksoftware? Formeln sind der bei weitem effizienteste und eleganteste Weg, um mathematische Zusammenhänge auszudrücken: 1 + e iπ = 0 Ähnliches gilt für Programmiersprachen und Computer: Eine Programm, das Zahlen als Input nimmt, und daraus Tabellen (und Grafiken) erzeugt? Ein(e) (Sammlung von) Programm(en) für Exploration, Inferenz und Modellierung? R> all.equal(exp(1i*pi)+1, 0+0i) [1] TRUE Das Schöne (und Schwierige?) an Statistik ist, daß wir mit Mathematik unsere Theorien beschreiben, und Computer verwenden, um Daten zu analysieren. Ein Werkzeug zur Verwaltung, Manipulation und Analyse von Daten? Ein Kommunikationsmedium mit CPU (Grafikarte, Drucker,... ) des Rechners? WS 2007/2008 4 WS 2007/2008 5 Kommunikationsformen Relevanz für Datenanalysen Zeichensprachen: Leicht zu lernen, oft universell verständlich, in Komplexität und Ausdrucksform limitiert. Bsp: österr. Verkehrszeichen, Apple-GUIs, etc. Schriftsprachen: Schwer zu lernen, Festlegung auf Sprache, in Komplexität und Ausdrucksform nahezu unlimitiert. Bsp: österr. Deutsch, UNIX-Shell, etc. Sehen Sie Statistiksoftware (auch) als Hilfsmittel, um dem Computer mitzuteilen, wie Sie Ihre Daten analysieren wollen. Für einfache Analysen reichen einfache Kommunikationsformen, aber selbst im komplexesten GUI haben Sie irgendwann das letzte Untermenü erreicht. In programmierbaren Umgebungen hängt die Decke des Möglichen bedeutend höher. S hat den Oscar der Software-Systeme gewonnen, darauf werden S S oder S S noch ein wenig warten müssen. WS 2007/2008 6 WS 2007/2008 7

Relevanz für Datenanalysen R-Befehle sind Ihre Anweisungen an den Computer. Kommandos, die Sie direkt am Prompt tippen, ähneln verbalen Zurufen: schnell kommuniziert und verarbeitet, schnell vergessen. Arbeiten mit R Dinge, die man sich länger merken will, schreibt man sich auf dasselbe gilt für Datenanlysen. Tipp 1: Schreiben Sie Ihre Analysen in einem Editor, sparen Sie nicht mit Kommentaren, beginnen Sie am Anfang (= Daten einlesen). WS 2007/2008 8 Administration von R R ist ein mächtiges, aber auch komplexes Werkzeug. Die Heimat von S ist auch die Heimat von Unix und C (New Jersey, nicht Redmond oder Palo Alto). Schon Installation und Administration von R haben für Windows-User ungewohnte Aspekte, seien Sie urban und erlauben ein wenig Multikulti am PC. Nicht alles, was anders ist, muß deshalb schlecht sein. Das Wiener Schnitzel kommt eigentlich auch aus Mailand. Die absolute Mehrheit von R Core benutzt Unix/Linux als Computerplattform. Administration von R Eine wichtiger Aspekt für einen laufenden R Prozess ist das derzeitige Arbeitsverzeichnis. Unter Unix wird R meist aus der Shell gestartet und nimmt das Startverzeichnis als Arbeitsverzeichnis. In einem GUI-Desktop muß (und sollte!) es meist explizit gesetzt werden. Umgebungsvariablen: LANGUAGE: für Statusmeldungen, z.b. LANGUAGE=en R LIBS: Pfade zu Bibliotheken mit Erweiterungspaketen, z.b. R LIBS=c:/der/pfad/zu/meinen/paketen Diese können entweder global gesetzt werden oder als Teil des Programmaufrufes. Pfade können auf allen Plattformen in Unix-Notation angegeben werden (wie in URLs). WS 2007/2008 10 WS 2007/2008 11

Administration von R Texteditoren Auch für den privaten PC gelten Tipp 2: Installieren Sie niemals Erweiterungspakete direkt in das versionsabhängige Installationsverzeichnis von R. Tipp 3: Verwenden Sie niemals das Installationsverzeichnis von R als Arbeitsverzeichnis. Spätestens der nächste Update von R liefert einen guten Grund. Damit Tipp 1 nicht mühsam wird, braucht man einen Editor, der R unterstützt (Syntax Markierung, Klammerpaare zählen, Einrückung, Verbindung zum R Prozess,... ). R folgt der Unix-Philosophie, daß sich jedes Werkzeug auf seine Kernaufgaben konzentrieren sollte, diese möglichst gut erledigt, und für den Rest Schnittstellen zu anderen Werkzeugen benutzt. R ist kein Texteditor. Word ist kein Texteditor. Welcher Editor für wen optimal ist, hängt stark von persönlichen Präferenzen und vom Arbeitsstil ab schwer Empfehlungen abzugeben. WS 2007/2008 12 WS 2007/2008 13 Verwaltung von R Projekten Speicherung von Objekten Speicherung von Objekten Mehrere parallele Projekte Ausdruck von Ergebnissen Weiterverwendung von Resultaten Workspace: Wenn R gestartet wird lädt es die Datei.RData, beim Beenden kann die globale Umgebung (=Workspace) in diese Datei gespeichert werden (Zwischenspeicherung mit save.image()). Dies speichert alles außer zusätzlich geladener Pakete und entspricht dem.data Verzeichnis von S-Plus. Binäre Dateien: Der save() Befehl ermöglicht das explizite Speichern von Funktionen und Daten in eine binäre Datei. Diese kann durch load() in die globale Umgebung geladen oder durch attach() in die Suchliste aufgenommen werden. Source code: Quellcode für Funktionen und die Reproduktion von Resultaten in einer Textdatei. WS 2007/2008 14 WS 2007/2008 15

Mehrere Projekte Es gibt zwei extreme Wege um mehrere Projekte zu verwalten: Speicherung jedes Projektes in einem anderen Arbeitsverzeichnis und Benutzung der jeweiligen.rdata Datei für alle Objekte. Expliziter Import/Export wenn Funktionen oder Daten in mehreren Projekten verwendet werden. Die.RData Datei ist primär, Befehlsgeschichte und Quellcode von Funktionen sind Dokumentation. Speicherung aller Objekte im Quellcode. Für jeden Teil der Analyse gibt es eine Datei mit den zugehörigen R Kommandos (Daten einlesen, Berechnungen, Resultate). Der Quellcode ist primär, gespeicherte Resultate ersparen nur die Arbeit der Neuberechnung. Diese Möglichkeiten bestehen sowohl bei Datenanalyse wie Programmierung. WS 2007/2008 16 Workspace ist primär Diese Methode ist besonders bei neuen Benutzern von S-Plus weit verbreitet, aber auch bei Benutzern von R unter Windows sowie Umsteigern. In R ist dieser Zugang riskanter als in S-Plus: In R wird der Workspace nur gespeichert, wenn der Benutzer dies explizit anfordert, in S-Plus automatisch. Eine fehlerhafte.rdata Datei kann mit großer Wahrscheinlichkeit gar nicht gelesen werden, S-Plus legt für jedes Objekt eine einzelne Datei an. Sinnvoll für kurzzeitige Projekte bei denen ein Verlust der Daten nicht kritisch ist, oder für extrem vorsichtige und selbstdisziplinierte Menschen. WS 2007/2008 17 Quellcode ist primär Das Projektmanagement ist viel einfacher wenn alles aus Textdateien mit dem Quellcode der Analyse reproduziert werden kann. Die üblichen Werkzeuge des Betriebssystems zur Verwaltung von Dateien stehen zur Verfügung, inklusive Backups und Zeitstempel. Editoren mit einer Verbindung zu R (Tinn-R, Emacs,... ) sind besonders hilfreich für diesen Stil der Verwendung von R. Buttons oder Tastenkombinationen senden R Kommandos aus dem Quellcode direkt an R. Tipp 4: Sehen Sie den Quellcode als primär an, verwenden Sie fix() maximal zum Debuggen. WS 2007/2008 18 Verwendung von Resultaten Das Abtippen von Ergebnissen aus R ist umständlich, kostet Zeit und ist eine potentielle Fehlerquelle. Leider unterstützt R das automatisierte Erzeugen von Berichten insbesonders unter Windows eher schlecht. Sweave erlaubt die vollständige Einbettung von R in LAT E X Dokumente, Paket xtable konvertiert manche R Objekte in LAT E X Code. Paket R2HTML kann viele R Klassen nach HTML konvertieren und hat eine HTML-Variante von Sweave. Paket odfweave hat eine OpenOffice-Variante von Sweave. Im Prinzip kann man R mittels DCOM in MS Word oder Excel einbetten... Damit beschäftigen wir uns noch im weiteren Verlauf des Kurses. WS 2007/2008 19

R Grundlagen Wiederholung Hilfe: help(topic)?topic help.start() Zuweisungen: x <- 5 (empf.!) x = 5 5 -> x Operatoren: +, -, *, /, ^ &, &&,, siehe help("+") Vergleiche: ==,!=, >, >=, <, <= siehe help("==") Schleifen: for, while, if Kommentare: alles nach # Namen: Groß/Kleinschreibung wichtig, beginnen mit Buchstaben; Underscore ( ) erlaubt in R (aber nicht in S) WS 2007/2008 21 Datentypen Elementare Datentypen logical: TRUE, FALSE, T, F integer: 1, 100, 326,... double: 1.0, 3.1415297, 2.718282, NaN, Inf, -Inf complex: 1+0i, 1i, 3+5i character: "Hallo", "Wie geht s?" fehlende Werte: NA Alle elementaren Datentypen sind ausschließlich als Vektoren verfügbar (es gibt keine Skalare), jeder Vektor enthält 0 oder mehr Elemente desselben Typs, eventuell gemischt mit NA. Bemerkungen logical: T ist nicht dasselbe wie TRUE integer: Unterschied c(1,2) u. 1:2? Es gibt NAs unterschiedlicher Art! WS 2007/2008 22 Datentypen Wir unterscheiden zwischen Modus und Speichermodus eines Vektors: > mode(1:10) [1] "numeric" > storage.mode(1:10) [1] "integer" > mode(pi) [1] "numeric" > storage.mode(pi) [1] "double" > mode(true) [1] "logical" > mode("hello") [1] "character" > str(1:10) int [1:10] 1 2 3 4 5 6 7 8 9 10 > str(letters) chr [1:26] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J"... WS 2007/2008 23

Komplexere Datentypen Konstruktion & Umwandlung Komplexere Datentypen array: Vektor mit Dimensionsattribut, Anzahl der Dimensionen ist de facto nur durch den verfügbaren Hauptspeicher beschränkt. matrix: 2-dimensionaler Array, Spezialfall um übliche Matrixoperationen (Multiplikation,... ) zu ermöglichen. factor: spezieller Vektor für kategorielle Merkmale. list: kombiniert Elemente verschiedener Typen (inkl. Listen rekursive Strukturen). data frame: Mischung aus Matrix und Liste Funktionen zum Erzeugen von Datentypen haben üblicherweise denselben Namen wie der betreffende Datentyp (ein generelles Prinzip in S), Methoden zur Konversion zwischen verschiedenen Typen haben Namen wie as.xxx(), Überprüfung des Typs erfolgt mit is.xxx(). > integer(5) > double(0) > x <- matrix(1, nrow = 5, ncol = 2) > is.matrix(x) > as.vector(x) > x <- list(a = "Hallo", b = 1:10, pi = 3.1415927) WS 2007/2008 24 WS 2007/2008 25 Konstruktion & Umwandlung Konstruktion & Umwandlung Konstruktion einfacher Vektoren > c(1, 2, 7) > c("hallo", "Welt") R wandelt den Typ eines Objektes automatisch um, wenn dies notwendig und möglich ist: > TRUE + 2 [1] 3 > c("hello", sqrt(2)) [1] "Hello" "1.41421356237310" > c(1:2, 3.14, exp((0+1i) * pi)) [1] 1.00+0i 2.00+0i 3.14+0i -1.00+0i Beispiele für häufige Konversionen (automatisch oder manuell ) sind logisch numerisch logisch, numerisch komplex logisch, numerisch, komplex Text numerisch, komplex logisch > as.numeric(rnorm(10) >= 1) [1] 0 0 1 0 0 0 1 0 1 0 > as.logical(c(0, pi)) [1] FALSE TRUE WS 2007/2008 26 WS 2007/2008 27

Konstruktion & Umwandlung Logische Werte können in jeden anderen Modus umgewandelt werden, daher wurde die Konstante NA als eine logische Variable definiert. > mode(na) [1] "logical" In den meisten Fällen wird der Modus von NA jedoch durch die restlichen Terme eines Ausdruckes bestimmt: > 1 + NA [1] NA > str(1 + NA) num NA Unzulässige Konversionen liefern auch NA: > (num <- as.numeric(c("1", "10e2", "text"))) [1] 1 1000 NA > as.character(num) [1] "1" "1000" NA WS 2007/2008 28 NA, NaN und NULL Alle drei können als Darstellung von Nichts angesehen werden, allerdings ist die Ursache für das Fehlen der Information verschieden: NA: fehlende Werte in der Stichprobe, unzulässige Konversionen,... NaN: ähnlich zu NA, aber die Ursache des Fehlens ist bekannt: eine mathematische Operation liefert kein Ergebnis, z.b. weil eine Funktion außerhalb ihres Definitionsbereiches verwendet wurde (log( 1),... ). Üblicherweise begleitet von Warnung. NULL: Zeiger auf Nichts im informatischen Sinn > c(3, NA) [1] 3 NA > c(3, 0/0) [1] 3 NaN > c(3, NULL) [1] 3 WS 2007/2008 29 Unendlich Zugriff auf einzelne Elemente Die beiden speziellen Symbole Inf und -Inf können wie Zahlen in vielen mathematischen Rechenoperationen verwendet werden: > max(3, NA) [1] NA > min(3, NA) [1] NA > max(3, Inf) [1] Inf > min(3, Inf) [1] 3 > c(inf + Inf, (-Inf) * Inf, Inf - Inf) [1] Inf -Inf NaN Achtung: manche numerische Verfahren können nicht mit Unendlich rechnen und liefern Fehlermeldungen. Vektoren: durch Nummer, Name oder logischen Vektor > x <- c(5, 3, 7) > names(x) <- c("apple", "banana", "orange") > x["apple"] > x[1:2] > x[x >= 4] Arrays: wie Vektoren, Dimensionen durch Komma getrennt R> x <- matrix(1:10, ncol=2); colnames(x) = c("eins", "Zwei") R> x[1:2,] # liefert eine Matrix R> x[,"zwei"] # liefert einen Vektor R> x[,"zwei", drop=false] # liefert eine Matrix R> x[-3,] # alles außer Zeile 3 WS 2007/2008 30 WS 2007/2008 31

Zugriff auf einzelne Elemente Data frames Duale Betrachtungsweise eines data.frame: Listen: Dollarzeichen oder Nummer/Name R> x <- list(a="hallo", b=1:10, pi=3.1415927) R> x$a R> x[["a"]] R> x[[1]] ## erstes Element der Liste R> x[1] ## Liste mit einem Element -- Unterschied! R> x[2:3] ## Liste mit zwei Elementen R> x[[2:3]] ## FEHLER! Matrix, in der jede Spalte einen anderen Datentyp haben kann Liste, in der jedes Element dieselbe Länge haben muß Zugriff auf Elemente wie bei Matrizen oder Listen: R> iris[,"sepa1.length"] # Fehlermeldung! --> jetzt verstehen wir s\dots\dots, R> data(iris) ## (in neueren R Versionen unnötig) R> iris[1:10,] ## data frame mit 10 Zeilen R> iris[,1] ## numerischer Vektor R> iris$sepal.length ## dasselbe R> iris$sepa1.length ## Oops! was ist hier passiert??? R> iris[,"sepal.length"] # wieder die 1.Spalte R> iris[,1, drop=false] ## data frame mit einer Spalte WS 2007/2008 32 WS 2007/2008 33 Attribute Attribute Sind wie Pickerl auf einem Marmeladeglas und ermöglichen die detailliertere Beschreibung des Inhaltes. So ist z.b. ein Array nur ein Vektor mit einem Dimensionsattribut. Weitere häufige Attribute beinhalten Namen für die Zeilen oder Spalten einer Matrix, Elemente einer Liste,... > x <- matrix(1:10, ncol = 5) > x [,1] [,2] [,3] [,4] [,5] [1,] 1 3 5 7 9 [2,] 2 4 6 8 10 > attributes(x) $dim [1] 2 5 > rownames(x) <- c("eins", "Zwei") > x [,1] [,2] [,3] [,4] [,5] Eins 1 3 5 7 9 Zwei 2 4 6 8 10 > attributes(x) $dim [1] 2 5 $dimnames $dimnames[[1]] [1] "Eins" "Zwei" $dimnames[[2]] NULL WS 2007/2008 34 WS 2007/2008 35

Attribute Die as.xxx() Funktionen löschen alle Attribute, inklusive der Dimensionalität: > x <- matrix(1:10, nrow = 2) > x [,1] [,2] [,3] [,4] [,5] [1,] 1 3 5 7 9 [2,] 2 4 6 8 10 > as.character(x) [1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" > storage.mode(x) <- "character" > x [,1] [,2] [,3] [,4] [,5] [1,] "1" "3" "5" "7" "9" [2,] "2" "4" "6" "8" "10" WS 2007/2008 36

Grafik S, an Interactive Environment for Data Analysis and Graphics (Becker und Chambers, 1984) Fortgeschrittene Programmierung mit R Torsten Hothorn Institut für Statistik Ludwig-Maximilians-Universität München R: A Language for Data Analysis and Graphics (Ihaka und Gentleman, 1996) Diesen Titeln zufolge liegt ein Fokus der Sprache S, und daher auch von R, im Grafikbereich. Zu unterscheiden gilt es das konventionelle (base) Grafiksystem und die in Cleveland (1993) eingeführten Trellis Grafiken (in R: Lattice im gleichnamigen Paket). Traditionelle S Grafiken WS 2007/2008 1 Grafik-Devices Grafik-Devices Für die Grafikausgabe stehen eine Reihe von Geräten (Devices) zur Verfügung, die die folgenden Eigenschaften besitzen:?devices zeigt Details an und gibt Hinweise auf weitere Hilfeseiten. Die folgenden Devices gibt es in jeder Betriebsart unter jedem Betriebssystem: Man stelle sich ein Device zunächst vor wie ein Stück Papier, auf das man mit vielen Stiften und Farben malen kann, von dem aber nicht gelöscht werden kann. Mehrere Devices können gleichzeitig geöffnet sein, man kann aber nur genau in das aktive hineinmalen. Man bemerkt keinen Unterschied beim Malen, egal welches Device man benutzt. Man kann den Inhalt von einem zu einem anderen Device kopieren und aufzeichnen. postscript(): PostScript Grafiken, z.b. zum Einbinden in LAT E X Dokumente. pdf(): Portable Document Format. Z.B. zur direkten Präsentation, Verteilen an andere, oder Einbinden in PDFLAT E X Dokumente. Kann gut für die Durchsicht sehr vieler Grafiken verwendet werden. pictex(): LAT E X/PicT E X Ausgabe. bitmap(): Eine Reihe verschiedener Grafikformate, die über GhostScript generiert werden. WS 2007/2008 2 WS 2007/2008 3

Grafik-Devices Grafik-Devices Wenn interaktiv mit dem GUI und nicht im BATCH Modus gearbeitet wird, gibt es außerdem: X11(): Bildschirm Ausgabe. png(): komprimiertes Bitmap, verlustfrei (Kompressionsniveau steuert nur Rechenaufwand) jpeg(): komprimiertes Bitmap, Kompression mit Informationsverlust, optimiert für Photos mit vielen verschiedenen Farbschattierungen. Unter Windows, wo man auch durch Klicken im Menü Grafiken speichern kann (davon ist i.a. abzuraten): windows(): Bildschirm Ausgabe. win.metafile(): Windows Meta File, damit es auch in MS Word & Co. klappt. bmp(): Bitmap kann jeder lesen, aber enorm groß und nicht skalierbar. PNG ist in den meisten Fällen für statistische Grafiken besser (enthalten nur relativ wenige verschiedene Farben). WS 2007/2008 4 WS 2007/2008 5 Grafik-Devices Bitmap vs. Vektorgrafik Die übliche Reihenfolge zum Produzieren einer Grafik ist: Device starten, z.b. pdf( testgrafik.pdf ) Grafik erzeugen, z.b. plot(1:10) Device schließen: dev.off() Wenn man beim interaktiven Arbeiten und verfügbarem GUI (also normalerweise ) den ersten Schritt auslässt, wird als Device automatisch die Bildschirmausgabe gestartet, sonst das postscript() Device. WS 2007/2008 6 WS 2007/2008 7

Bitmap vs. Vektorgrafik Bitmap vs. Vektorgrafik sin(1:200/10) 1.0 0.0 1.0 0 50 100 150 200 Index WS 2007/2008 8 WS 2007/2008 9 Bitmap vs. Vektorgrafik Bitmap vs. Vektorgrafik 4 2 0 2 4 In der Regel sind Vektorgrafiken besser, weil sie beliebig skaliert werden können. Grafiken mit vielen Punkten/Linien können manchmal effizienter als Bitmap dargestellt werden, allerdings sollte darauf geachtet werden, daß bei der Einbettung keine Reskalierung notwendig ist. Grafiken mit vielen Punkten/Linien haben aber das Problem, daß durch das Übermalen der ersten Punkte Information verloren geht alternative Darstellung überlegen. 4 2 0 2 4 WS 2007/2008 10 WS 2007/2008 11

High-level Funktionen Zunächst als Wiederholung die von graphics gelieferten Standard-Grafiken. High-level Funktionen erzeugen bzw. initialisieren eine Grafik, z.b.: plot() barplot() boxplot() coplot () contour() curve() dotchart() hist() image() mosaicplot() pairs() persp() qqplot() kontextabhängig Balkendiagramm Boxplot Conditioning Plots Höhenlinienplot Funktionen plotten Dot Plots Histogramm Bilder (3. Dim. als Farbe) Mosaikplots (kateg. Daten) Streudiagramm Matrix perspektivische Flächen QQ Plot WS 2007/2008 12 High-level Funktionen Sehr viele Funktionen können auf verschiedene Objekte angewendet werden und reagieren intelligent, so dass für jedes Objekt meist eine sinnvolle Grafik erzeugt wird. Hier wird die Objektorientiertheit der Sprache S ausgenutzt. Z.B. erzeugt plot() einen Scatterplot bei Eingabe von zwei Vektoren, Residualplots bei Eingabe eines lm-objektes (lineares Modell / Regression), eine per Linie verbundene Zeitreihe bei Zeitreihenobjekten, usw. Es ist also schnell ein Streudiagramm, Histogramm, Boxplot etc. erstellt, so dass man Daten sehr schnell für Analysen anschauen kann. WS 2007/2008 13 Scatterplotmatrix Scatterplot / Regression > plot(trees) 65 70 75 80 85 > plot(volume ~ Girth, data=trees) > tree.lm <- lm(volume ~ Girth, data = trees) > abline(tree.lm) 65 70 75 80 85 Girth 8 10 12 14 16 18 20 Height Volume 10 20 30 40 50 60 70 10 30 50 70 8 10 12 14 16 18 20 Volume 10 20 30 40 50 60 70 8 10 12 14 16 18 20 Girth WS 2007/2008 14 WS 2007/2008 15

Residualplot Boxplot > plot(tree.lm, which = 1) > boxplot(trees) Residuals vs Fitted Residuals 10 5 0 5 10 19 20 31 20 40 60 80 10 20 30 40 50 60 Girth Height Volume Fitted values lm(volume ~ Girth) WS 2007/2008 16 WS 2007/2008 17 Histogramm Q-Q-Plot > hist(trees$volume) > qqnorm(trees$volume) > qqline(trees$volume) Histogram of trees$volume Normal Q Q Plot Frequency 0 2 4 6 8 10 Sample Quantiles 10 20 30 40 50 60 70 10 20 30 40 50 60 70 80 trees$volume 2 1 0 1 2 Theoretical Quantiles WS 2007/2008 18 WS 2007/2008 19

Grafik Parameter Grafik Parameter Natürlich reicht es nicht immer, die Daten schnell anzuschauen. Grafiken müssen angepasst, d.h. z.b. mit Beschriftungen versehen werden, usw. Es eine Vielzahl von Parametern, die man an die meisten Grafikfunktionen in Form von Argumenten übergeben kann. Dazu gehören diejenigen, die in den Hilfen?plot und?plot.default aufgeführt sind, aber vor allem auch die in?par (später). In High-level Funktionen wie plot() können (neben vielen anderen) meist die folgenden Parameter gesetzt werden: axes col log main, sub pch type xlab, ylab xlim, ylim Sollen Achsen geplottet werden? Farben Logarithmierte Darstellung Überschrift und Unterschrift Symbol für einen Punkt Type (l=linie, p=punkt, b=beides, n=nichts) x-/y-achsenbeschriftung Zu plottender Bereich in x-/y- Richtung WS 2007/2008 20 WS 2007/2008 21 Grafik Parameter in par() Grafik Parameter in par() Mit par() werden die wichtigsten Voreinstellungen im Grafikbereich durchgeführt. Wegen der enormen Fülle der in?par beschriebenen Parameter, macht es für Anfänger Sinn, sich diese Hilfeseite einmal auszudrucken. Viele Einstellungen kann man ausschließlich mit par() ändern, insbesondere solche, die sich auf das gesamte Device beziehen. Jedes geöffnete Device besitzt eine unabhängige Liste von Parametern. Um die Verwirrung zu vervollständigen gibt es auch Parameter, die nur gelesen werden können, etwa die Fenstergröße. Zu den am häufigsten gebrauchten Argumenten von par(), meist 3-Buchstaben Abkürzungen, gehören: bg cex las lty, lwd mar mfcol, mfrow mfg oma usr xaxt, yaxt Hintergrundfarbe Größe eines Punktes bzw. Buchstabens Einstellung, ob Beschriftung parallel oder senkrecht zu den Achsen erfolgt Linientyp (gestrichelt,...) und Linienbreite Größe der Ränder Mehrere Plots in ein Device in Zeilen/Spalten Welcher von mehreren in einem Device angeordneten Plots angesteuert wird Größe der äußeren Ränder Aktuelle Extremwerte der User Coordinates Ob und wie x-/y-achse skaliert werden WS 2007/2008 22 WS 2007/2008 23

Grafik Parameter Grafik Parameter Dichte 100 N(0,1) verteilter Zufallszahlen Einige Beispiele > set.seed(123) > x <- rnorm(100) > opar <- par(bg = "lightgreen") > hist(x, freq = FALSE, col = "red", + xlim = c(-5, 5), ylim = c(0, 0.6), + main = "Dichte 100 N(0,1)-verteilter Zufallszahlen") > curve(dnorm, from = -5, to = 5, + add = TRUE, col = "blue", lwd = 3) > par(opar) Density 0.0 0.1 0.2 0.3 0.4 0.5 0.6 4 2 0 2 4 x WS 2007/2008 24 WS 2007/2008 25 Grafik Parameter Grafik Parameter > opar <- par(mfrow = c(2, 2)) > plot(trees$girth, trees$volume, pch = 7) > boxplot(trees, col = "blue") > hist(trees$volume, las = 1) > qqnorm(trees$volume, cex.axis = 2) > par(opar) trees$volume Frequency 10 30 50 70 10 8 6 4 2 0 8 10 12 14 16 18 20 trees$girth Histogram of trees$volume 10 20 30 40 50 60 70 80 Sample Quantiles 20 40 60 80 10 40 70 Girth Height Volume Normal Q Q Plot 2 1 0 1 2 trees$volume Theoretical Quantiles WS 2007/2008 26 WS 2007/2008 27

Devices kontrollieren Multiple figures: par(mfrow=c(3,2)) par("usr")[4] margin 3 line 3 line 2 line 1 line 0 line 0 line 1 margin 3 outer margin 3 margin 3 margin 3 margin 2 plotting region margin 4 margin 2 plotting region margin 4 margin 2 plotting region margin 4 margin 2 line 4 line 3 line 2 line 1 line 0 par("usr")[1] line 0 line 1 line 2 line 3 line 4 par("pin")[2] par("usr")[2] plotting region par("pin")[1] margin 1 par("usr")[3] margin 4 outer margin 2 margin 2 margin 1 margin 3 plotting region margin 1 margin 4 margin 2 margin 1 margin 3 plotting region margin 1 outer margin 1 margin 4 margin 2 margin 1 margin 3 plotting region margin 1 margin 4 outer margin 4 WS 2007/2008 28 WS 2007/2008 29 Multiple figures: layout() Multiple figures: layout() Unregelmäßige Gitter mit mehreren Grafiken können durch die Fuktion layout() erzeugt werden. Zeilen und Spalten des Gitters können unterschiedliche Breiten haben. Benachbarte Rechtecke können zu größeren Rechtecken zusammengefaßt werden. Die Reihenfolge, in der die Rechtecke verwendet werden, kann gesteuert werden. > m=matrix(c(1,1,0,2), 2, 2) > m [,1] [,2] [1,] 1 0 [2,] 1 2 > layout(m, widths=c(1,2)) > x <- rnorm(100) > boxplot(x) > hist(x) Es können Rechtecke ausgelassen werden. WS 2007/2008 30 WS 2007/2008 31

Multiple figures: layout() Multiple figures: layout() 1 2 2 1 0 1 2 3 Frequency 0 5 10 15 20 Histogram of x 2 1 0 1 2 3 x WS 2007/2008 32 WS 2007/2008 33 Grafik Low-level Grafik Low-level Low-level Funktionen fügen Elemente zu einer (per High-level Funktion) erzeugten Grafik hinzu, z.b. zusätzliche Punkte, Linien für Konfidenzintervalle, Beschriftungen, Legenden, etc. Sie helfen auch bei den dazu notwendigen Berechnungen. Hier sei eine Auswahl an wichtigen Low-level Funktionen gegeben: abline() arrows() axis() grid() legend() lines() mtext() points() polygon() segments() text() title() intelligente Linie Pfeile Achsen Gitternetz Legende Linien (schrittweise) Text in den Rändern Punkte (ausgefüllte) Polygone Linien (vektorwertig) Text Beschriftung WS 2007/2008 34 WS 2007/2008 35

Grafik Low-level Grafik Low-level Fortsetzung des Histogramm Beispiels: R> legend(-4.5, 0.55, col = c("red", "blue"), lwd = 3, + legend = c("emp. Dichte", "theor. Dichte")) Density 0.0 0.1 0.2 0.3 0.4 0.5 0.6 Dichte 100 N(0,1) verteilter Zufallszahlen emp. Dichte theor. Dichte Klarerweise kann man jedes Diagramm auch zu Fuß aus seinen Einzelbestandteilen zusammenbauen: > plot.new() > plot.window(xlim=c(-3,3), ylim=c(-3,3)) > points(rnorm(50), rnorm(50)) > box() > axis(1) > axis(2) 4 2 0 2 4 x WS 2007/2008 36 WS 2007/2008 37 Grafik Low-level Mathematische Beschriftung 3 2 1 0 1 2 3 3 2 1 0 1 2 3 WS 2007/2008 38 R hat die Fähigkeit, Grafiken mit mathematischer Notation und entsprechenden Symbolen zu beschriften (Murrell und Ihaka, 2000). Gerade für Publikationen und Präsentationen muss so nicht mit diversen Programmen getrickst oder gar darauf verzichtet werden. Die Eingabe einer Formel erfolgt, wie häufig gesagt wird, in einer LAT E X-ähnlichen Form (Anlehnung an Schlüsselwörter). Für den Nicht-LAT E X-Benutzer und alle anderen: Das stimmt nicht ganz. Tatsächlich geschieht es mit Hilfe eines S Ausdrucks (S Expression), d.h. man schreibt die Formel einfach in der Sprache S. Der entsprechende S Ausdruck wird aber nicht ausgewertet, sondern direkt, z.b. mit expression() oder substitute(), übergeben und intern interpretiert. WS 2007/2008 39

Mathematische Beschriftung Mathematische Beschriftung Funktionen, die mit mathematischer Beschriftung umgehen können, sind: axis(), legend(), mtext(), text() und title(). Für Details empfiehlt sich dringend ein Blick auf die Hilfeseite?plotmath (auch diese ist eine derer, deren Ausdruck sich empfiehlt) und das Ausführen von demo(plotmath). Mit Hilfe von bquote() und.() können auch die Werte von Variablen in die Formeln eingebaut werden. Als Beispiel wird hier die Dichte einer N(0,1)-Verteilung gezeichnet und beschriftet: > curve(dnorm, main = "Dichte einer Normalverteilung", + from = -5, to = 5, col = "blue", lwd = 3) > text(-5, 0.3, + expression(f(x) == frac(1, sigma * sqrt(2*pi)) ~~ + e^{frac(-(x - mu)^2, 2 * sigma^2)), + adj = 0) > text(5, 0.3, expression(paste("mit ", mu == 0)), adj=1) > sigma <- 1 > text(5, 0.28, bquote(sigma ==.(sigma)), adj=1) WS 2007/2008 40 WS 2007/2008 41 Mathematische Beschriftung Grafik interaktiv dnorm (x) 0.0 0.1 0.2 0.3 0.4 Dichte einer Normalverteilung 1 f(x) = e (x µ)2 2σ 2 mit µ = 0 σ 2π σ = 1 4 2 0 2 4 Das Basissystem von R selbst stellt kaum Möglichkeiten für interaktive Grafiken zur Verfügung. Ausnahmen sind hier: identify() zum Identifizieren der Indizes derjenigen Datenpunkte, in deren Nähe man klickt, z.b.: > x <- rnorm(10) > plot(x) > identify(x) locator(), gibt Koordinaten aus, auf die man im Plot klickt, z.b. zum interaktiven Platzieren von Beschriftung: > legend(locator(1), legend = "Eine Legende", pch = 1) x WS 2007/2008 42 WS 2007/2008 43

Grafiken von Interaktionen Fortgeschrittene Programmierung mit R Torsten Hothorn Institut für Statistik Ludwig-Maximilians-Universität München In diesem Abschnitt beschäftigen wir uns mit der Darstellung der Interaktion von mehr als zwei Variablen. Zur Exploration sind oft interaktive (im Sinn von dynamisch ) Grafiken am besten geeignet. Zur Publikation auf Papier müssen aber in jedem Fall statische Grafiken erstellt werden. Analog zu Standardgrafiken: Falls Sie schnell erstellt werden können, sind auch statische Grafiken zur Exploration nützlich. Modifikationen sind jedoch meist nur mehr durch Programmierung möglich. Grafiken von Interaktionen WS 2007/2008 1 Mosaikdiagramme Bsp: Alkohol und WM 2006 Darstellung der Interaktionen zwischen 2 oder mehr kategorischen Merkmalen. Interessierende Nullhypothese: Unabhängigkeit Visualisierung über Gitterlinien und Farbe nach signierten Pearson-Residuen (Wurzel der Summanden im χ 2 -Test) Bevölkerungsrepräsentativ quotierte Umfrage der Größe n = 1008 von Anfang Juni 2006 zum Thema Fußball-WM und Alkoholgenuß: Wie schauen Sie sich die Spiele der deutschen Nationalmannschaft an? > Alkohol1 = as.table(as.matrix(read.table("alkohol1.txt"))) > Alkohol1 Maenner Frauen schaue gar nicht 83 142 schaue ohne Alkohol 150 204 schaue mit Alkohol 260 168 keine Angabe 0 1 Quelle: innofact.com WS 2007/2008 2 WS 2007/2008 3

Bsp: Alkohol und WM 2006 > barplot(alkohol1, col=c("gold", "red", "black", "grey"), + beside=false, legend=true, xlim=c(0, 4)) Bsp: Alkohol und WM 2006 > barplot(alkohol1, col=c("gold", "red", "black", "grey"), + beside=true, legend=true, xlim=c(0, 12)) 0 100 200 300 400 500 keine Angabe schaue mit Alkohol schaue ohne Alkohol schaue gar nicht 0 50 100 150 200 250 schaue gar nicht schaue ohne Alkohol schaue mit Alkohol keine Angabe Maenner Frauen Maenner Frauen WS 2007/2008 4 WS 2007/2008 5 Bsp: Alkohol und WM 2006 > barplot(t(alkohol1), col=c("red", "black"), + beside=false, legend=true) Bsp: Alkohol und WM 2006 > barplot(t(alkohol1), col=c("red", "black"), + beside=true, legend=true) 0 100 200 300 400 Frauen Maenner 0 50 100 150 200 250 Maenner Frauen schaue gar nicht schaue ohne Alkohol schaue mit Alkohol keine Angabe schaue gar nicht schaue ohne Alkohol schaue mit Alkohol keine Angabe WS 2007/2008 6 WS 2007/2008 7

Balkendiagramme Je nach Typ können unterschiedliche Variablen leichter miteinander verglichen werden: Gestapelt: primäre Variable Mosaikdiagramme Flächenproportionale Darstellung der Zeilen und Spalten einer Kontingenztafel. Modifikation gestapelter Balkendiagramme: Statt Höhe codiert Breite der Balken die primäre Variable. Nebeneinander: sekundäre Variable innerhalb der Gruppen der primären Variablen Sekundäre Variable als Stapel innerhalb der Balken der primären Variablen. In jedem Fall gibt es eine Asymmetrie zwischen den beiden Variablen. Asymmetrie zwischen Variablen weniger stark als bei Balkendiagrammen, kann auch für höherdimensionale Tafeln verwendet werden. WS 2007/2008 8 WS 2007/2008 9 Bsp: Alkohol und WM Bsp: Alkohol und WM 1.1 schaue gar nicht schaue ohne Alkohol schaue mit Alkohol keine Angabe 100% WS 2007/2008 10 WS 2007/2008 11

Bsp: Alkohol und WM Bsp: Alkohol und WM schaue gar nicht schaue ohne Alkohol schaue mit Alkohol keine Angabe schaue gar nicht schaue ohne Alkohol schaue mit Alkohol keine Angabe Frauen Frauen Maenner Maenner WS 2007/2008 12 WS 2007/2008 13 Bsp: Alkohol und WM Bsp: UCB Admissions Maenner Frauen schaue gar nicht schaue ohne Alkohol schaue mit Alkohol keine Angabe Standardized Residuals: < 4 4: 2 2:0 0:2 2:4 >4 Zulassung von Studenten zur Graduate School der Universität Berkeley 1973 für die 6 größten Fakultäten: > ftable(admit~gender, data=ucbadmissions) Admit Admitted Rejected Gender Male 1198 1493 Female 557 1278 WS 2007/2008 14 WS 2007/2008 15

Bsp: UCB Admissions Bsp: UCB Admissions > mosaicplot(~gender+admit, data=ucbadmissions, main="", shade=true) Admit Admitted Rejected Male Female Standardized Residuals: < 4 4: 2 2:0 0:2 2:4 >4 > ftable(admit~gender+dept, data=ucbadmissions) Admit Admitted Rejected Gender Dept Male A 512 313 B 353 207 C 120 205 D 138 279 E 53 138 F 22 351 Female A 89 19 B 17 8 C 202 391 D 131 244 E 94 299 F 24 317 Gender WS 2007/2008 16 WS 2007/2008 17 Bsp: UCB Admissions Bsp: UCB Admissions > mosaicplot(~gender+admit+dept, data=ucbadmissions, main="", shade=true) > mosaicplot(~admit+dept, data=ucbadmissions, main="", shade=true) Male Female A B C D E F A B C D E F Admitted Rejected Rejected Standardized Residuals: F E D Standardized Residuals: Admit Admitted < 4 4: 2 2:0 0:2 2:4 >4 Dept B A C < 4 4: 2 2:0 0:2 2:4 >4 Gender Admit WS 2007/2008 18 WS 2007/2008 19

Bsp: UCB Admissions Trellis Grafiken > mosaicplot(~gender+dept, data=ucbadmissions, main="", shade=true) Dept F E D C B A Male Female Standardized Residuals: < 4 4: 2 2:0 0:2 2:4 >4 Grafiken basieren auf den Grundprinzipien menschlicher Perzeption. Alle Einstellungen haben vernünftige Defaults. Alles ist möglich (gegeben ausreichend viele Argumente) Gender WS 2007/2008 20 WS 2007/2008 21 Trellis Grafiken Trellis Grafiken Hier eine Liste von häufig verwendeten Trellis Funktionen: barchart() bwplot() cloud() densityplot() dotplot() histogram() levelplot() panel...() piechart() print.trellis() qq() wireframe() xyplot() Balkendiagramm Boxplot 3D Punktewolken Dichten Punkteplots Histogramm Levelplots Funktionen zum Hinzufügen von Elementen Kuchendiagramm Trellis Objekt plotten QQ Plots persp. 3D Flächen Scatterplot WS 2007/2008 22 WS 2007/2008 23

Unterschiede? Trellis / Lattice / Grid 800 Trellis (Cleveland, 1993) ist die Originalimplementierung für S und S-Plus, lattice (Sarkar, 2002) eine Neuimplementierung für R (mit neuen Features). pressure 0 200 400 600 800 0 50 150 250 350 temperature pressure 600 400 200 0 0 100 200 300 temperature Das Paket lattice basiert auf dem Grafiksystem im Paket grid (Murrell, 2001). Beide Pakete sind in einer Standard R Installation enthalten. Grid Grafiken und Standard R Grafiken sind i.a. inkompatibel. Die Wörter trellis, lattice und grid lassen sich alle mit Gitter übersetzen. WS 2007/2008 24 WS 2007/2008 25 Trellis / Lattice Trellis / Lattice Anders als bei den Standard Grafiken wird vor der Grafikerstellung ein Objekt der Klasse trellis generiert und bearbeitet. Erst wenn alle Elemente enthalten sind wird es mit print() (bzw. der entsprechenden Methode print.trellis()) gezeichnet. Gerade im nicht-interaktiven Modus muss man unbedingt an das print() denken, da sonst keine Grafik erzeugt wird. Das Interface zu Trellis Grafikfunktionen ist so angelegt, dass die Daten als Formel (mit ~ ) eingegeben werden, um die Abhängigkeitsstruktur in den Daten für die Anordnung der nebeneinanderliegenden Plots ausdrücken zu können. Es ist ein Grundproblem der Standard-Grafik allgemein Grafiken innerhalb einer Grafik zu realisieren: layout() oder das simple par(mfrow=.) können nicht geschachtelt, d.h. mehrstufig verwendet werden, so dass z.b. unmöglich ist, mehrere filled.contour(), coplot() oder pairs() Grafiken zu einer neuen Grafik zusammenzustellen. Auch die scheinbar sehr flexible Verwendung von par() stößt an Grenzen oder wird hässlich, nicht umsonst enthält der Source-code von par.c den Kommentar The horror, the horror..., Marlon Brando in Apocalypse Now WS 2007/2008 26 WS 2007/2008 27

Beispiel: Prestige Daten Grafische Parameter > library("lattice") > data(prestige, package="car") > attach(prestige) The following object(s) are masked from package:datasets : women > xyplot(income~education) > xyplot(prestige~income) > xyplot(prestige~income, type=c("p","r")) > xyplot(prestige~income, type=c("p","r","smooth")) > xyplot(prestige~income type, type=c("p","smooth")) > xyplot(prestige~income, type=c("p","smooth"), + subset=type=="wc", pch=16, col="red") Auch bei Trellis Grafiken können viele Aspekte der Grafik vom Benutzer durch Argumente der High-Level-Funktionen verändert werden. Zusätzlich hat Lattice aber mehrere Listen globaler Einstellungen, sogenannte Themen. Die derzeit aktive Liste kann über trellis.par.get() und trellis.par.set() gelesen und verändert werden. show.settings liefert einen grafischen Überblick. WS 2007/2008 28 WS 2007/2008 29 Grafische Parameter S Formeln > show.settings() > unlist(trellis.par.get("plot.symbol")) alpha cex col font pch "1" "0.8" "#000000" "1" "1" fill "transparent" > trellis.par.set(plot.symbol=list(pch=16, col="red")) > show.settings() > trellis.par.set(canonical.theme()) > show.settings() > trellis.par.set(canonical.theme(color=false)) > show.settings() > trellis.par.set(col.whitebg()) > show.settings() > ## persoenlicher Default: > options(lattice.theme = "col.whitebg") WS 2007/2008 30 Die meisten high-level Grafikfuntionen in R erlauben die Spezifikation der Variablen durch Formeln (analog zu Modellen). Bei Trellis ist dies meist sogar der einzige Weg. Die allgemeine Form einer Formel ist y ~ x g1 + g2 +... wobei y auf die vertikale Achse aufgetragen wird, x auf die horizontale Achste, und g1, g2 etc eine oder mehrere optionale Gruppierungsvariablen darstellen. In einigen Spezialfällen wie Histogrammen wird nur eine Variable benutzt, in diesen Fällen wird die linke Seite der Formel leer gelassen. WS 2007/2008 31

Gruppierungsvariablen Gruppierungsvariablen Die Gruppierungsvariablen müssen kategorisch sein. Nominale und ordinale Variablen können direkt verwendet werden, numerische Variablen müssen meisten zuerst konvertiert werden (Ausnahme: diskret, wenige Ausprägungen). Am einfachsten erfolgt dies durch Klassierung: > edu.cut <- cut(education, 4) > summary(edu.cut) (6.37,8.77] (8.77,11.2] (11.2,13.6] (13.6,16] 31 30 19 22 > xyplot(prestige~income edu.cut) > edu.cut <- cut(education, quantile(education, seq(0, 1, by=0.25))) > summary(edu.cut) (6.38,8.45] (8.45,10.5] (10.5,12.6] (12.6,16] NA s 25 25 25 26 1 > xyplot(prestige~income edu.cut) Besser ist die Verwendung sogenannter shingles : Die Basis ist wieder ein Faktor, der durch Klassierung einer numerischen Variablen entsteht. Um die Punkte in jedem Panel nicht zu klein werden zu lassen, können sich die Intervalle jedoch überschneiden. Zusätzlich wird auch Metainformation gespeichert. > edu.shin <- equal.count(prestige$education, 4) > xyplot(prestige~income edu.shin) WS 2007/2008 32 WS 2007/2008 33 Gruppierungsvariablen Andere Trellis-Grafiken Zusätzliche Gruppierungsvariablen können auf 2 Arten eingesetzt werden: Eine Variable kann über Farben und Symbole direkt in jedes Panel aufgenommen werden (mit Legende über Argument auto.key. Beliebig viele weitere Variablen über mehr Panels > densityplot(~women type) > densityplot(~income type+equal.count(education, 2)) > bwplot(income~type equal.count(education, 2)) > cloud(prestige~income*education) > cloud(prestige~income*education type) > xyplot(prestige~income, group=type, auto.key=true) > xyplot(prestige~income, group=type, + auto.key=list(columns=3)) > xyplot(prestige~income edu.shin, group=type, auto.key=true) > xyplot(prestige~income edu.shin+type) > xyplot(prestige~income type+edu.shin) WS 2007/2008 34 WS 2007/2008 35

Panel-Funktionen Layout Jede Trellis High-Level-Funktion benutzt Panel-Funktionen, um die Einzelgrafiken zu erzeugen. Modifikation der Gesamtgrafiken erfolgt (neben den Standardargumenten) durch Schreiben neuer Panel-Funktionen: > meinpanel <- function(x, y,...){ + panel.grid(h=4, v=4, col="lightblue") + panel.xyplot(x, y,...) + panel.loess(x, y,...) + ltext(25000, 20, adj=1, + label=paste(length(x), "Punkte")) + > xyplot(prestige~income type, panel=meinpanel) Bausteine: Funktionen panel.*, llines, lpoints, ltext,... Das Layout von Trellis-Grafiken (wieviele Zeilen und Spalten) orientiert sich per Default an der Größe der Ziel-Device, kann jedoch durch die Argumente table, layout und skip verändert werden: > ## Kommando für verschiedene Fenstergrößen testen: > xyplot(prestige~income type, panel=meinpanel) > xyplot(prestige~income type, panel=meinpanel, as.table=true) > xyplot(prestige~income type, panel=meinpanel, layout=c(1,4)) > xyplot(prestige~income type, panel=meinpanel, as.table=true, + layout=c(3,2), skip=c(f, T, F, T, F, T)) WS 2007/2008 36 WS 2007/2008 37

Funktionen Obwohl S-Plus und R bereits in der Standardinstallation extrem mächtige Werkzeuge zur Datenanalyse darstellen, wollen die meisten Benutzer nach einiger Zeit dieses Werkzeug ihren eigenen Bedürfnissen anpassen. Fortgeschrittene Programmierung mit R Einer der größten Vorteile von S ist, daß jeder Benutzer das System leicht um eigene Funktionen erweitern oder bestehende Funktionen modifizieren kann. Friedrich Leisch Institut für Statistik Ludwig-Maximilians-Universität München Funktionen, Flußkontrolle & Fehlerbehandlung Der größte Teil von R selber ist in der Sprache S geschrieben. S ist eine vollwertige Programmiersprache in deren Design die Notwendigkeiten der statistischen Datenanalyse mit einbezogen wurden, es ist nicht nur eine Sprache zur Datenanalyse. c 2007 Friedrich Leisch 1 Formale Definition Funktionen aufrufen function ( ARGLIST ) KÖRPER Das Schlüsselwort function markiert den Beginn einer Funktionsdefinition. Die Argumente der Funktion werden durch eine mit Kommas getrennte Liste von Ausdrücken der Form SYMBOL = AUSDRUCK oder durch das spezielle formale Argument... angegeben. Jeder gültige R Ausdruck kann als KÖRPER der Funktion verwendet werden, zumeist ist es ein durch geschwungene Klammern gruppierter Block von Anweisungen. In den meisten Fällen werden Funktionen Symbolen zugewiesen ( bekommen einen Namen ), aber auch anonyme Funktionen sind an gewissen Stellen sehr praktisch (apply(),... ). c 2007 Friedrich Leisch 2 moment <- function(x, n=2) { sum(x^n)/length(x) Funktionen retournieren nur eine einziges Objekt: den Wert des letzten Ausdruckes oder das Argument von return(). In der Praxis ist dies nicht allzu restriktiv, da das zurückgelieferte Objekt eine beliebig komplexe Liste sein kann. Benannte Argumente: Wenn eine Funktion aufgerufen wird, müssen die Argumente nicht in derselben Reihenfolge wie in der Funktionsdefinition angegeben werden, sondern können auch direkt mit Namen angesprochen werden, z.b. moment(n=3, x=myx). Argumente mit Defaultwerten müssen beim Aufruf nicht spezifiziert werden, z.b. moment(myx). Defaultwerte können Funktionen anderer Argumente sein. c 2007 Friedrich Leisch 3

Das... Argument Funktionen können beliebig viele unspezifizierte Argumente besitzen, falls die Argumentliste das spezielle Argument... enthält, z.b. max(..., na.rm = FALSE). Eine zweite Verwendungsmöglichkeit ist das Weiterleiten von Argumenten an eine andere Funktion: myplotfun <- function(x, y, myarg,...) { ## optionale Berechnungen mit x, y und myarg ## Aufruf Standard Plot Funktion plot(x, y,...) Damit versteht myplot() zusätzlich zu seinen eigenen Argumenten implizit auch alle Argumente von plot() ohne weiteren Programmieraufwand. x <- list(...) im Körper einer Funktion konvertiert alle unspezifizierten Argumente in eine benannte Liste. c 2007 Friedrich Leisch 4 Das... Argument Das... Argument kann zwar an beliebig viele Funktionen weitergeben werden, jedoch bekommen diese dann alle dieselbe Argumentliste. Um mehreren Funktionen verschiedene Argumentlisten zu übergeben, empfiehlt es sich, diese als benannte Listen zu spezifizieren und die Funktionen mittels do.call() aufzurufen: myfun <- function(x, fun2.args=null, fun3.args=null,...) { ## Berechnungen (eventuell mit fun2.args etc.) fun1(x,...) do.call(fun2, fun2.args) do.call("fun3", fun3.args) ## weitere Berechnungen R> myfun(x, fun2.args=list(arg1=wert)) # erstes Arg entweder Funktion # oder Zeichenkette c 2007 Friedrich Leisch 5 Argumente zusammenfügen Wenn eine Funktion aufgerufen wird, werden die tatsächlichen Argumente des Funktionsaufrufen mit den formalen Argumenten der Funktionsdefinition in der folgenden Reihenfolge zusammengefügt: 1. alle benannten Argumente deren Namen dem eines formalen Argumentes exakt entspricht 2. wenn kein... Argument definiert wurde genügt eine eindeutige Übereinstimmung am Beginn des Namens 3. Position in der Argumentliste 4. Verbleibende tatsächliche Argumente werden Teil von... (falls definiert). Anmerkung: Nicht alle formalen Argumente müssen auch durch tatsächliche Argumente abgedeckt werden. c 2007 Friedrich Leisch 6 Zuweisungsoperatoren: <- und = Außerhalb von Funktionsaufrufen haben die beiden dieselbe Bedeutung: > x <- 42; x [1] 42 > x = 42; x [1] 42 Innerhalb eines Funtionsaufrufes verhält sich <- wie immer (Zuweisung von Wert an Symbol), während = den Wert einem benannten Argument zuweist: > sin(x = 3) [1] 0.14112 > x [1] 42 > sin(x <- 3) [1] 0.14112 > x [1] 3 c 2007 Friedrich Leisch 7

Lazy Evaluation Flußkontrolle Beim Aufruf einer Funktion werden die Argumente nur geparsed, aber nicht evaluiert. Die Auswertung des Argumentes erfolgt erst, wenn das Argument zum ersten Mal verwendet wird: > myfun <- function(x, y){ + if(x < 0) + return(nan) + else + return( y * log(x)) + > myfun(-1) [1] NaN > myfun(2,3) [1] 2.079442 > myfun(2) Error in myfun(2) : Argument "y" is missing, with no default Als vollwertige Programmiersprache besitzt S eine Reihe von Strukturen zur Kontrolle des Programmflusses. Iterationen werden durch die Befehle for, while und repeat zur Verfügung gestellt. Für bedingte Auswertungen können if, else, ifelse() und switch() verwendet werden. for und if sind von diesem die bei weitem am häufigsten verwendeten. c 2007 Friedrich Leisch 8 c 2007 Friedrich Leisch 9 Der if Befehl if: Beispiele if else Konstrukte haben die Form if( Test ) { Anweisungsblock 1 else { Anweisungsblock 2 Wenn der Test den Wert TRUE liefert, wird Anweisungsblock 1 ausgeführt, sonst Anweisungsblock 2. Der else-teil ist optional. Ein typisches Beispiel für die Verwendung von if: if (any(x < 0)){ stop("negative Werte in x") Auswahl zwischen mehreren Möglichkeiten:: if (all(x >= 0)) sqrt(x) else sqrt(x + 0i) c 2007 Friedrich Leisch 10 c 2007 Friedrich Leisch 11

if: Beispiele Der for Befehl Verschachtelte if Befehle: if (x <= 0){ return(0) else if( x>0 && x<=1){ return(x) else { return(1) (eher sinnloses Beispiel da nicht vektorisiert) for Konstrukte haben die Form for(var in vector) { Schleife In jedem Iterationsschritt wird die Variable var der Reihe nach auf jeweils das nächste Element des Vektors vector gesetzt und dann die Schleife durchlaufen. Dies sieht ähnlich wie die entsprechenden Konstrukte von Sprachen wie C oder C++ aus, ist aber syntaktisch näher am foreach Befehl der Sprache Perl. c 2007 Friedrich Leisch 12 c 2007 Friedrich Leisch 13 for: Beispiele Der while Befehl while Konstrukte haben die Form Summation der Elemente eines Vektors im Stil von C: summe <- 0 for(i in 1:length(x)) { summe <- summe + x[i] Summation der Elemente eines Vektors im Stil von Perl: summe <- 0 for(elt in x) { summe <- summe + elt Die zweite Variante ist effizienter. Statt 1:length(x) verwendet man besser seq_along(x). c 2007 Friedrich Leisch 14 while( Test ) { Schleife Die Schleife wird immer wieder durchlaufen, bis der Test zum ersten Mal FALSE liefert. Beispiel: Summation bis zum ersten fehlenden Wert summe <- 0 i <- 1 while((i <= length(x)) &&!is.na(x[i])){ summe <- summe + x[i] i <- i+1 c 2007 Friedrich Leisch 15

next und break Funktionen sind Objekte next Springt zum Beginn der nächsten Iteration einer for oder while Schleife. break Beendet eine for oder while Iteration vorzeitig. Beispiel: Summation bis zum ersten fehlenden Wert summe <- 0 i <- 1 while(i <= length(x)){ if(is.na(x[i])) break summe <- summe + x[i] i <- i+1 Funktionen sind in S sogenannte Objekte erster Klasse und können wie Daten behandelt werden, insbesonders können Funktionen direkt als Argumente anderer Funktionen verwendet werden, Funktionen als Rückgabewert liefern, in R selber in ihre Bestandteile zerlegt werden. c 2007 Friedrich Leisch 16 c 2007 Friedrich Leisch 17 Funktionen sind Objekte > apply(trees, 2, FUN=median) > f <- approxfun(x=1:10, y=sin(1:10)) > f(3) [1] 0.14112 > g <- function(x) x+3 > g(5) [1] 8 > body(g) x + 3 > body(g)[[3]] [1] 3 > body(g)[[3]] <- 10 > g(5) [1] 15 Funktionale Folgende Funktionen sind hilfreich beim rechnen auf/mit Funktionen: args(), body(): Argumente und Köper einer Funktion. match.call(): Liefert innerhalb einer Funktion den exakten Aufruf dieser Funktion (siehe nächste VO). substitute(): Unterbindet die Evaluation eines Argumentes und liefert stattdessen den Ausdruck auf der rechten Seite beim Funktionsaufruf. deparse(): Wandelt einen Ausdruck in eine Zeichenkette um. > meinplot <- function(x, main=deparse(substitute(x)),...) + plot(x, main=main,...) > meinplot(trees) c 2007 Friedrich Leisch 18 c 2007 Friedrich Leisch 19

Exception Handling stop(msg) beendet normalerweise die Berechnung der aktuellen Anweisung, schreibt das message Argument in die Konsole und kehrt zur Eingabeauffforderung zurück. warning(msg) speichert normalerweise das message Argument in einer Liste von Warnungen und schreibt alle Warnungen gemeinsam in die Konsole, nachdem der oberste Funktionsaufruf beendet wurde. try(anweisung) Auch wenn die Anweisung zu einem Aufruf von stop führt, kehrt R nicht zur Eingabeaufforderung zurück, sondern try() liefert statt dessen ein Objekt der Klasse "try-error". on.exit(anweisung) erlaubt die Definition von Aufräumcode der auch im Falle eines Fehlers exekutiert werden soll, bevor die Funktion beendet wird. Das genaue Verhalten von error und warning hängt von mehreren options() ab und kann zur Laufzeit verändert werden. c 2007 Friedrich Leisch 20 Exception Handling foo <- function(x){ s <- sum(x) cat("die Summe ist:", s, "\n") R> foo(1:10) Die Summe ist: 55 R> foo("hallo") Error in sum(..., na.rm = na.rm) : invalid "mode" of argument c 2007 Friedrich Leisch 21 Exception Handling Exception Handling foo <- function(x){ if(! is.numeric(x)) stop("kann nur numerische Variablen summieren!") s <- sum(x) cat("die Summe ist:", s, "\n") R> foo(1:10) Die Summe ist: 55 R> foo("hallo") Error in foo("hallo") : Kann nur numerische Variablen summieren! foo <- function(x, silent=false){ s <- try(sum(x), silent=silent) if(inherits(s, "try-error")){ warning("x hat falschen Typ, Berechnung liefert NA") return(na) s R> foo(1:10) [1] 55 R> foo("hallo") Error in sum(..., na.rm = na.rm) : invalid "mode" of argument [1] NA Warning message: x hat falschen Typ, Berechnung liefert NA in: foo("hallo") R> foo("hallo", TRUE) [1] NA Warning message: x hat falschen Typ, Berechnung liefert NA in: foo("hallo", TRUE) c 2007 Friedrich Leisch 22 c 2007 Friedrich Leisch 23