Programmieren mit statistischer Software

Ähnliche Dokumente
Erwin Grüner

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

Statistische Software (R) Konstanten. Datentypen in R. Aufruf der Hilfeseiten zu grundlegende Operatoren und Funktionen: Paul Fink, M.Sc.

Datenaufbereitung, Grafische Datenanalyse

Das einfachste Objekt ist ein Vektor, der aus mehreren Elementen besteht. Ein Vektor wird auf diese Weise erzeugt:

Statistisches Programmieren

Kapitel 1. R als Taschenrechner. Vorlesung Programmieren in statistischer Software: R Sommersemester Einleitung, Grundlagen

Prozess und Statistik. Einführung in. Eine R-Übersicht und Motivation R in der täglichen Arbeit zu nutzen. Günter Faes faes.de.

Reihungen. Martin Wirsing. in Zusammenarbeit mit Matthias Hölzl und Nora Koch 11/03

Installation. Arbeiten mit der MATLAB-Entwicklungsumgebung. MATLAB als Taschenrechner mit Matrix- und Vektorrechnung.

Einfaches Datenmanagement in R

Einführung in die statistische Sprache R

IDE Grundlagen Vektoren Matrizen Faktoren Dataframes Visualisierung Tips. Quick & dirty

Tag 9: Datenstrukturen

Einführung in MATLAB

Felder, Rückblick Mehrdimensionale Felder. Programmieren in C

Anwendungssoftware III (MATLAB)

Erwin Grüner

Versuchsplanung SoSe 2015 R - Lösung zu Übung 1 am Autor: Ludwig Bothmann

Modul 122 VBA Scribt.docx

2. Programmierung in C

Analog zu Aufgabe 16.1 werden die Daten durch folgenden Befehl eingelesen: > kredit<-read.table("c:\\compaufg\\kredit.

Funktionales Programmieren in Python

5.2 Das All-Pairs-Shortest-Paths-Problem (APSP-Problem) Kürzeste Wege zwischen allen Knoten. Eingabe: Gerichteter Graph G =(V, E, c)

Geometrie und Bedeutung: Kap 5

Dr. Monika Meiler. Inhalt

Visual Basic Basisbefehle Hinweis: Der Text in eckigen Klammern [ ] ist variabel, z.b. [var] => 5.3. Eckige Klammern sind stets wegzulassen!

Das Beste aus zwei Welten

P r o g r a m m a b l a u f s t e u e r u n g

2 Lösungen "Peptide de novo Sequencing"

Lösungen zum 3. Aufgabenblatt

Matlab Einführung. Tobias Wunner

Einführung in. Sven Hartenstein. Wintersemester 2007/2008. Friedrich-Schiller-Universität Jena. Einführung in (Sven Hartenstein) 1


Einführung in die Java- Programmierung

C/C++ Programmierung

Unterprogramme, Pointer und die Übergabe von Arrays

Klausur zur Vorlesung Multivariate Verfahren, SS Kreditpunkte, 90 min

Bearbeitungszeit: 120 Minuten. Kommentare kosten Zeit; kommentieren Sie ihr Programm nur da, wo der Code alleine nicht verständlich wäre.

Wahrscheinlichkeitsrechnung und Mathematische Statistik für Informatiker Software Folien von JProf. Uwe Ligges. Jörg Rahnenführer WS 2013/2014

Übersicht. Was ist R? Entstehung von R. Einführung in R - Eine Umgebung für statistisches Rechnen

Probeklausur: Programmierung WS04/05

Shock pulse measurement principle

Übersicht. Schleifen. Schleifeninvarianten. Referenztypen, Wrapperklassen und API. 9. November 2009 CoMa I WS 08/09 1/15

Modellierung und Programmierung 1

PHP Code Konventionen Um einen einheitlichen Code zu generieren, der von jedem gelesen werden kann, müssen folgende Konventionen eingehalten werden.

Oracle Datenbankprogrammierung mit PL/SQL Grundlagen

Datenfelder (Arrays) Vektoren, Matrizen, Tabellen. Dr. Beatrice Amrhein

Excel Funktionen durch eigene Funktionen erweitern.

FHZ. K20 Arrays. Lernziele. Hochschule Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren. Inhalt

Informationsverarbeitung im Bauwesen

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

Grundlagen der Informatik 2

Programmieren in EViews

Einführung in MATLAB zur Veranstaltung Einführung in die Numerik

Steuern des GSR-Interface mit QBasic

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

Programmieren in C. Rekursive Funktionen. Prof. Dr. Nikolaus Wulff

Übung zur Einführung in die empirische Mikroökonomik (Ökonometrie II) Einführung in STATA. Universität Bamberg. Professur für VWL, Sozialpolitik

Einführung in die Programmiersprache C

Empirische Softwaretechnik. Einführung in das Statistikpaket R?! Entwickler von R. nicht vergleichbar mit den üblichen Statistikprogrammen

Datenbanksysteme SS 2007

Anwendung von Geoinformatik: Entwicklung von Open Source Tools für die automatisierte Analyse von Geoinformationen

1 Vom Problem zum Programm

Gliederung. Tutorium zur Vorlesung. Gliederung. Gliederung. 1. Gliederung der Informatik. 1. Gliederung der Informatik. 1. Gliederung der Informatik

Zusammenstellung der Befehle in R

Einführung in R. 1 Literatur und Software 1

Entscheidungsbäume. Definition Entscheidungsbaum. Frage: Gibt es einen Sortieralgorithmus mit o(n log n) Vergleichen?

INTELLIGENTE DATENANALYSE IN MATLAB

Dateneingabe über ein HTML-Formular in eine Datenbank:

Programmierung in Python

VHDL Verhaltensmodellierung

Datenmanagement in R: Eine Einführung

Projektaufgaben Block 2

DAS EINSTEIGERSEMINAR PHP 5.3 LERNEN ÜBEN ANWENDEN. Oliver Leiss Jasmin Schmidt. 3. Auflage

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

1 Einführung in RStudio

Grundlagen. Die Komponenten eines C Programms. Das erste Programm

Prozedurale Datenbank- Anwendungsprogrammierung

Programmieren Lernen mit BYOB. Gerald Futschek 5. November 2012

Tipps und Tricks für Matlab

Umgang mit und Ersetzen von fehlenden Werten bei multivariaten Analysen

lineare-algeba.wxmx 1 / 7 Mathematik in wxmaxima Haftendorn Dez 2010

Eine Kurzanleitung zu Mathematica

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2015/16. Vorbereitende Aufgaben

Softwareschnittstellen

Sin-Funktion vgl. Cos-Funktion

In der Computersprache C ist die Standardmethode zur Behandlung von Matrizen durch

Access [basics] Programmieren mit Arrays. Beispieldatenbank. Arrays. Eindimensionale Arrays. VBA-Grundlagen Programmieren mit Arrays

Objects First With Java A Practical Introduction Using BlueJ. Mehr über Vererbung. Exploring polymorphism 1.0

Maple-Skripte. A.1 Einleitung. A.2 Explizite Zweischritt-Runge-Kutta-Verfahren. Bei der Ausführung

Propädeutikum zur Programmierung

Transkript:

Programmieren mit statistischer Software Eva Endres, M.Sc. Institut für Statistik Ludwig-Maximilians-Universität München Vektorwertiges Programmieren

Programmieren ohne explizite Schleife I Vektorisierung > set.seed(1234) > x <- rnorm(5) > y <- runif(5) Vektorisierte Berechnung (implizite Schleife) > x + y [1] -0.5134745 0.8224041 1.3671748-1.4222642 0.7214405 statt expliziter Schleife > z <- numeric(length(x)) > for ( i in seq(along.with = x) ) { + z[i] <- x[i] + y[i] > z [1] -0.5134745 0.8224041 1.3671748-1.4222642 0.7214405 Vektorisierte Berechnungen sind kompakter besser lesbar Endres: Programmieren mit statistischer Software Sommersemester 2017 2

Programmieren ohne explizite Schleife II meist schneller (bei größen Eingaben) > set.seed(1234) > x <- rnorm(10^6) > y <- runif(10^6) Implicit loop: interne Schleife, in Maschinencode programmiert (daher schneller) > system.time(x + y) user system elapsed 0 0 0 Explicit loop: explizite Schleife, in R programmiert > z <- numeric(length(x)) > system.time(for ( i in seq(along.with = x) ) z[i] <- x[i] + y[i]) user system elapsed 0.13 0.02 0.14 wannimmer möglich, sollte in R vektorisiert programmiert werden Endres: Programmieren mit statistischer Software Sommersemester 2017 3

Programmieren ohne explizite Schleife III Vorsicht: in R werden Recycling rules verwendet! Wenn mit zwei Vektoren unterschiedlicher Länge gearbeitet wird, und die Länge des einen Vektors ein Vielfaches des anderen ist, dann wird der kürzere Vektor wiederholt. > c(1, 2, 3) + 1:6 [1] 2 4 6 5 7 9 Nur wenn die Länge des einen Vektors kein Vielfaches des anderen ist, wird eine Warnmeldung ausgegeben. > c(1, 2, 3) + 1:5 > # Warning message: > # In c(1, 2, 3) + 1:5 : > # longer object length is not a multiple of shorter object length Endres: Programmieren mit statistischer Software Sommersemester 2017 4

Implizite Schleifen I Operatoren >?Arithmetic >?Comparison > set.seed(1234) > x <- sample(100, 5) > ((x %% 2) == 0) [1] TRUE TRUE TRUE FALSE FALSE Statistische Maßzahlen > mean(x) # Summe als implizite Schleife, geteilt durch n [1] 55.6 > sum(x) / length(x) [1] 55.6 Endres: Programmieren mit statistischer Software Sommersemester 2017 5

Implizite Schleifen II dasselbe mit expliziter Schleife > z <- 0 > for ( i in seq(along.with = x) ) { + z <- z + x[i] > z <- z / length(x) > z [1] 55.6 auch möglich für Datensätze - Zeilen- und Spalten-Summen (und Mittelwerte) > data("cars", package = "datasets") > #?cars > str(cars) 'data.frame': 50 obs. of 2 variables: $ speed: num 4 4 7 7 8 9 10 10 10 11... $ dist : num 2 10 4 22 16 10 18 26 34 17... > colmeans(cars) # implizite Schleife speed dist 15.40 42.98 Endres: Programmieren mit statistischer Software Sommersemester 2017 6

Implizite Schleifen III >?rowmeans >?rowsums >?colsums Subsets - Extraktion bzw. Ersetzungen von Teilmengen > set.seed(1234) > x <- letters[1:10] > ind <- sample(100, 10) Teilmenge der Buchstaben, für die ind gerade ist > x[ind %% 2 == 0] [1] "a" "b" "c" "h" > # bzw. mit which() > x[which(ind %% 2 == 0)] [1] "a" "b" "c" "h" Endres: Programmieren mit statistischer Software Sommersemester 2017 7

Implizite Schleifen IV als explizite Schleife > z <- character() > for ( i in seq(along.with = x) ) { + if ( ind[i] %% 2 == 0 ) { + z <- c(z, x[i]) > z [1] "a" "b" "c" "h" oder mit ifelse (aber längerer Vektor mit zusätzlichen NA-Einträgen) > ifelse(test = ind %% 2 == 0, yes = x, no = NA) [1] "a" "b" "c" NA NA NA NA "h" NA NA Matrizenrechnung für Matrizen (zweidimensional) - matrix und Arrays (drei- und mehrdimensional) - array Endres: Programmieren mit statistischer Software Sommersemester 2017 8

Implizite Schleifen V z.b. Matrixmultiplikation, Transponierung, Bilden von Teilmengen Transponieren mit impliziter Schleife > set.seed(1234) > A <- matrix(sample(10), ncol = 2) > A [,1] [,2] [1,] 2 4 [2,] 6 1 [3,] 5 7 [4,] 8 10 [5,] 9 3 > t(a) [,1] [,2] [,3] [,4] [,5] [1,] 2 6 5 8 9 [2,] 4 1 7 10 3 Endres: Programmieren mit statistischer Software Sommersemester 2017 9

Implizite Schleifen VI Transponieren mit expliziter Schleife > n <- nrow(a) > m <- ncol(a) > At <- matrix(na, nrow = m, ncol = n) > for ( i in seq(length.out = n) ) { + for ( j in seq(length.out = m) ) { + At[j, i] <- A[i, j] > At [,1] [,2] [,3] [,4] [,5] [1,] 2 6 5 8 9 [2,] 4 1 7 10 3 Endres: Programmieren mit statistischer Software Sommersemester 2017 10

Die apply-familie I hiermit kann man für alle weiteren Funktionen implizite Schleifen programmieren wiederholte Anwendung einer Funktion für alle Elemente eines Vektors alle Zeilen / Spalten einer Matrix alle Dimensionen eines Arrays Vorteile von apply gegenüber expliziter Schleife kompaktere Berechnung Parallelisierbar (mit Paket plyr) oft schneller Endres: Programmieren mit statistischer Software Sommersemester 2017 11

Die apply-familie II Beispiele: Funktion angewendet auf eine Liste bzw. einen Vektor > ab <- function(x) { + if ( x < 10 ) { + "a" else { + "b" anwendbar für Skalare > ab(4) [1] "a" > ab(20) [1] "b" Endres: Programmieren mit statistischer Software Sommersemester 2017 12

Die apply-familie III nicht korrekt anwendbar für Vektoren > ab(5:15) > # Warning message: > # In if (x < 10) { : > # the condition has length > 1 and only the first element will be used anwendbar für Vektoren mit > #?lapply > # gibt immer eine Liste zurueck > lapply(x=5:15, FUN=ab) > #?sapply > # versucht, das Ergebnis zu vereinfachen > # (zu einem Vektor, einer Matrix, einem Array) > sapply(x=5:15, FUN=ab) Endres: Programmieren mit statistischer Software Sommersemester 2017 13

Die apply-familie IV Liste mit Ergebnissen von verschiedenen Durchgängen eines Experiments > set.seed(1234) > l <- list(exp1 = rnorm(100), + exp2 = rnorm(100), + exp3 = rnorm(100)) Mittelwerte (von Hand berechnet) > c(mean(l$exp1), + mean(l$exp2), + mean(l$exp3)) [1] -0.15676174 0.04124318 0.15460367 mit expliziter Schleife > ms <- numeric(length = length(l)) > for ( i in seq(along.with = l) ) { + ms[i] <- mean(l[[i]]) > ms [1] -0.15676174 0.04124318 0.15460367 Endres: Programmieren mit statistischer Software Sommersemester 2017 14

Die apply-familie V einfacher mit > sapply(l, mean) exp1 exp2 exp3-0.15676174 0.04124318 0.15460367 Unterschied zwischen lapply und sapply > lapply(l, quantile) # gibt Liste zurueck > sapply(l, quantile) # gibt Matrix zurueck multivariate Version von sapply > #?mapply > mapply(rep, 1:4, times=4:1) > mapply(fun=quantile, l, probs=list(c(0,0.5,0.75,1), + c(0.2,0.4), c(0.1,0.3,0.6))) wiederholte Auswertung von Ausdrücken mit > #?replicate > replicate(n=5, expr=rnorm(10,0,1)) Endres: Programmieren mit statistischer Software Sommersemester 2017 15

Die apply-familie VI Funktion angewendet auf eine Matrix, ein Array oder einen Datensatz > data("cars", package = "datasets") > > #?apply > # Maximum pro Zeile bzw. Spalte > apply(x=cars, MARGIN=1, FUN=which.max) > apply(x=cars, MARGIN=2, FUN=which.max) > # MARGIN=1 fuer Zeilen > # MARGIN=2 fuer Spalten > # MARGIN=c(1,2) fuer Zellen Endres: Programmieren mit statistischer Software Sommersemester 2017 16

Anonyme Funktionen I Funktion ohne Name > function(x) { + x + 1 function(x) { x + 1 } Anwendung innerhalb von apply-befehlen > sapply(5:15, + function(x) { + if ( x < 10 ) { + "a" else { + "b" ) [1] "a" "a" "a" "a" "a" "b" "b" "b" "b" "b" "b" Endres: Programmieren mit statistischer Software Sommersemester 2017 17

Apply-family gems I Vereinfachung des Ergebnisses bzw. Zugriff auf Teile des Ergebnisses > ds <- lapply(1:10, function(i) data.frame( + a = runif(4), b = gl(2, 2), c=runif(4))) > # ds <- replicate(10, data.frame( > # a = runif(4), b = gl(2, 2), c=runif(4)), > # simplify=false) # alternativ > # str(ds, 1) Vereinfachung des Ergebnisses - in ein großes Objekt > # do.call(, lapply()) Beispiel: Liste von Datensätzen in einen großen Datensatz umwandeln Endres: Programmieren mit statistischer Software Sommersemester 2017 18

Apply-family gems II > #?do.call > d <- do.call(what=rbind, args=ds) > str(d) 'data.frame': 40 obs. of 3 variables: $ a: num 0.281 0.174 0.17 0.561 0.509... $ b: Factor w/ 2 levels "1","2": 1 1 2 2 1 1 2 2 1 1... $ c: num 0.429 0.389 0.844 0.209 0.307... Zugriff auf Teile einer Liste > # lapply(, "[[", ) Beispiel: Spalte b für jeden Listeneintrag auswählen > bs <- lapply(ds, "[[", "b") > # lapply(ds, "[[", c("b","c")) # funktioniert nicht Endres: Programmieren mit statistischer Software Sommersemester 2017 19

Apply-family gems III daher mit anonymen Funktionen > bs2 <- lapply(1:10, function(j) ds[[j]][,c("b","c")]) > bs3 <- lapply(1:10, function(j) ds[[j]][c("b","c")]) > > # Liste aus Data-frames > bs4 <- lapply(1:10, function(j) ds[[j]]["b"]) > # Liste aus Vektoren > bs5 <- lapply(1:10, function(j) ds[[j]][,"b"]) > # Liste aus Data-frames > bs6 <- lapply(1:10, function(j) ds[[j]][, "b", drop=false]) auch kompliziertere Operationen/Selektionen möglich > bs7 <- lapply(1:10, function(j) ds[[j]][2,"b"]) Endres: Programmieren mit statistischer Software Sommersemester 2017 20

Funktionale Programmierung I Berechnungen als Auswertung von Funktionen higher-order functions - tun mindestens eines der beiden folgenden: nehmen eine oder mehrere Funktionen als Input geben eine Funktion zurück apply-funktionen sind higher-order functions die meisten anderen (wie mean()) sind first order functions weitere higher-order functions in R >?Map Endres: Programmieren mit statistischer Software Sommersemester 2017 21