Jakob Richter

Workflow für Simulationsstudien

Eine häufige Aufgabe ist es, für verschiedene Parameter ein und die selbe Simulation mit R durchzuführen und dann die Ergebnisse auszuwerten. Persönlich bevorzuge ich es, erst alles zu simulieren und dann auszuwerten. Dieses Vorgehen hat mehrere Vorteile: Bei langandauernden Simulationen müssen diese nur einmalig ausgeführt werden. Außerdem: Wenn ich mit meiner Auswertung unzufrieden bin, kann ich einfach die Auswertungsprozedur modifizieren ohne noch einmal alles durchlaufen lassen zu müssen und der Quelltext ist auch nachvollziehbarer. Insbesondere ist das Vorgehen aber auch angepasst auf die grafische Darstellung und Auswertung mit ggplot2.
Read the rest of this entry »

merge() – eine kleine Einleitung

Es kann sein, dass man in die Situation kommt verschiedene Datensätze miteinander kombinieren zu wollen. In einer Tabelle steht vielleicht für verschiedene Lebensmittel die Energiewerte und Vitamingehalte und in einer anderen Tabelle steht wie viel von welchem Lebensmittel eine Person gegessen hat. Will man jetzt schnell berechnen, wie viele kcal jede Person zu sich genommen hat kann man das schnell und elegant durch mergen der Datensätze, gefolgt von aggregate() um die kcal für jeden Patienten zusammenzurechnen.
Das ist natürlich nur ein dämliches Beispiel. Der geneigte R-Nutzer wird schon seine eigenen Anwendungen finden. Oft ist es auch viel einfacher Berechnungen an einem Datensatz durchzuführen als Funktionen zu basteln, die sich Daten aus mehreren Datensätzen zusammensuchen.
Read the rest of this entry »

aggregate() – Teil 2

Teil 1 findet sich hier: aggregate() – der Anfang

Der erste Teil lieferte ein einfaches Beispiel zur Nutzung der aggregate()-Funktion. Widmen wir uns nun einem etwas komplexeren Fall.

Verschiedene Gruppen erzeugen

Zunächst simulieren wir uns wieder einmal ein Datensatz mit ein paar Versuchsperson und ihrem Gewicht vor der Studie (gewicht1) und ihrem Gewicht nach der Studie (gewicht2). Außerdem brauchen wir natürlich noch Gruppen, die wir untersuchen wollen. Weisen wir den Versuchspersonen also noch zufällig eine Haarfarbe und die Therapie (1 Wöchige Diät aus ausschließlich Salat oder Pizza) zu.

1
2
3
4
5
6
7
8
set.seed(110)
gewicht1 <- rnorm(100,mean=90,sd=15) #Gewichte der Versuchspersonen vor dem Essen
gewicht2 <- rnorm(100,mean=100,sd=20) #Gewichte nach dem Essen
gewichte <- cbind.data.frame(gewicht1,gewicht2) #Datensatz mit beiden Gewichten
gewichte <- cbind(gewichte,zunahme=gewichte$gewicht2 - gewichte$gewicht1)    #die Zunahme hinzufügen
haarfarben <- sample(c("blond","rot","brünett","schwarz"),size=100,rep=T)
essen <- sample(c("Salat","Pizza"),size=100,rep=T)
einteilung <- list(haarfarbe=haarfarben,essen=essen)

In den letzten Zeilen haben wir also einen Vektor erzeugt mit 100 Zuteilungen für die Haarfarbe und 100 Zuteilungen für das Essen, was die Versuchspersonen verabreicht bekommen.

Was wird aggregate() jetzt tun?

Ganz einfach: Für alle Werte des Eingabevektors, die die gleiche Kombination von haarfarbe und essen haben wird die Funktion FUN= aufgerufen. Wenn die Funktion z.B. mean ist, wird das arithmetische Mittel von jeweils gewicht1, gewicht2 und zunahme gebildet von den Personen, die die gleiche Haarfarbe und die gleiche Diät hatten.
Read the rest of this entry »

aggregate() – der Anfang

Jetzt möchte ich nur kurz die mir sehr lieb gewonnene R-Funktion aggregate() vorstellen. Wer die Funktionen sapply(), apply(), lapply() usw. schon kennt und gerne nutzt, ist vermutlich auch schon ab und zu auf das Problem gestoßen, dass man evtl. auch über mehrere Zeilen hinweg eine Funktion anwenden möchte.

Nutzfälle

Was ist z.B. wenn wir das arithmetische Mittel von immer 3 aufeinanderfolgenden Daten in einem Datensatz berechen wollen? Betrachten wir folgendes Beispiel:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
X <- rep(c(4,10,16),length.out=12)
Y <- runif(12)
XY <- cbind.data.frame(X,Y)
head(XY) #sollte ungefähr so aussehen
#    X          Y
# 1  4 0.05644781
# 2 10 0.58944284
# 3 16 0.35899530
# 4  4 0.07475402
# 5 10 0.75567801
# 6 16 0.94060689
jeweils <- 3
teile <- ceiling((1:nrow(XY))/jeweils)
teile
# [1] 1 1 1 2 2 2 3 3 3 4 4 4
aggregate(XY,by=list(teile),FUN=mean)
#   Group.1  X         Y
# 1       1 10 0.6196099
# 2       2 10 0.5319404
# 3       3 10 0.4377502
# 4       4 10 0.4572320
#Beachte: (4+10+16)/3=10

Read the rest of this entry »