Jakob Richter

Statistik, R, Fotografie und Sonstiges

Formeln in R (Teil 1)

Formeln (formula) werden in R an vielen verschiedenen Stellen genutzt. Natürlich für die lineare (lm()) und logistische Regression (glm(type="logit")), aber auch für die Survivalanalyse und das Cox-Modell (library("survival"); coxph()) um nur einige Beispiele zu nennen.

Zuerst der ganz allgemeine Aufbau einer formel
abhängige Variable ~ erklärende Variablen
(Ein kleiner Tipp für Mac-Nutzer an dieser Stelle: ~ lässt sich schreiben mit [alt] + N)
Die Formel y ~ x kann also verstanden werden als x erklärt y oder y ist abhängig von x.

Sicherlich bekannt ist, dass wir mehrere erklärende Variablen (EV) mit + verbinden können: y ~ x1 + x2
Doch es gibt zahlreiche weitere Möglichkeiten die rechte Seite der Formel aufzubauen:
Weiterlesen »

Zeilen in einer Matrix verdoppeln.

Hier ein kleiner Tipp aus dem R-Praxisleben. Beispiel: In einer Matrix (respektive data.frame) jede Zeile verdoppeln.

1
2
3
4
5
6
daten < - mtcars 
 
#Doppelte Zeilen direkt untereinander
daten_doppelt <- daten[rep(1:nrow(daten),each=2),]
#Doppelte untereinander
daten_doppelt2 <- daten[rep(1:nrow(daten),times=2),]

Ja das ist wirklich nicht schwer. Die Grundidee: Die Selektionsvektoren, welche immer in den eckigen Klammern stehen, kann man natürlich auch nutzen um bestimmte Zeilen mehrfach zu wählen.

Damit es nicht nur bei diesem simplen Beispiel bleibt, was vielleicht jedem eingefallen wäre, noch ein paar Ideen, wie man mit dieser simplen Methode auch wesentlich komplexere Verdopplungen durchführen kann.
Weiterlesen »

lapply() und sapply() – Der Einstieg in die apply-Funktionen.

Warum gerade lapply() und keine der gebräuchlicheren Funktionen apply Funktionen aus R? Ganz einfach: lapply() ist die Grundfunktion und die anderen Funktionen bauen auf dieser Funktionsweise auf. Da man lapply() nicht nur auf Vektoren, sondern auch auf Listen anwenden kann bietet es ungeahnte (vllt. auch unausdenkbare) Möglichkeiten der Verwendung. Aus diesem Grund ist das Beispiel auch äußerst praxisunrelevant.

Funktionsweise lapply()

Versuch eines Schemas: So ungefähr arbeitet lapply().


Weiterlesen »

Schnelleres R dank Kompilierung (also ohne apply())

Inspiriert durch diesen Blogbeitrag wollte ich die Vorkompilierung selbst einmal ausprobieren und auch mit dem so hoch gelobten apply() vergleichen um mich von der Effektivität zu überzeugen.
Weiterlesen »

Hervorhebungen in Listings


Eine kleine Ergänzung zum Beitrag Quellcode und Latex in der Beamer-Class: Aus didaktischen Gründen kann es sehr hilfreich sein bestimmte Begriffe oder Abschnitte hervorzuheben.
Weiterlesen »

Daten im R-Quelltext hinterlegen.

Ok, dieses Beispiel wird man wohl selten gebrauchen, aber vielleicht mag es mal nützlich sein, wenn man jemandem ein wenig R-Code schicken will, der mit einem Datensatz arbeitet, ihr ihm aber nicht den kompletten Datensatz schicken wollt/könnt/dürft. Gleichzeitig sollte alles in einer Datei sein, damit der Empfänger nicht die Mühe hat alles noch mal einlesen zu müssen.

Funktioniert auch gut, wenn man sich nur selbst ein paar Daten ausdenken will, mit denen man etwas testen möchte. So erspart man sich lästiges c("a","b", usw.).

So geht’s:

1
2
3
4
5
6
datentxt <- "	lcavol	lweight	age	lbph	svi	lcp	gleason	pgg45	lpsa	train
1	-0.579818495	2.769459	50	-1.38629436	0	-1.38629436	6	  0	-0.4307829	T
2	-0.994252273	3.319626	58	-1.38629436	0	-1.38629436	6	  0	-0.1625189	T
3	-0.510825624	2.691243	74	-1.38629436	0	-1.38629436	7	 20	-0.1625189	T"
 
daten <- read.table(textConnection(datentxt))

Die ersten Textzeilen aus dem Prostata-Datensatz markieren, kopieren und dann datentxt <- "HIER" einfügen. Dabei darauf achten keine neuen Zeilenumbrüche einzubauen.

Hübscher Quellcode mit Latex und Beamer

Listings in LaTex und die Beamer-class
Aus gegebenem Anlass mal ein kurzer Beitrag, wie man Quelltext hübsch in eine LaTeX-Präsentation mit der Beamer-Class einbaut.
Anstelle der bekannten Verbatim-Umgebung wird hier auf das (auch für Berichte empfehlenswerte) Paket listings gesetzt.
Einge recht gute und knappe Hilfe findet man bei wikibooks.org

Vorteile:

  • farbiger Code
  • kein Problem mit langen Zeilen

Nachteile:

  • keine ;)

Weiterlesen »

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.
Weiterlesen »

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.
Weiterlesen »

Geokoordinaten mit R und Google finden (einfach, ohne API)

Dies ist eine verblüffend leichte Übung, da Google einem direkt ein csv-File (Beispiel) ausspuckt, welches natürlich sehr einfach zu lesen ist. Weil es so einfach ist hier nur wenig Text und der Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
reisetrip < - c("Berlin","Potsdam","Magdeburg","Hannover","Minden","Bielefeld","Dortmund")
breiten <- NULL
langen <- NULL
for(i in seq_along(reisetrip)){
  query <- paste(strsplit(reisetrip[i]," ")[[1]], collapse="%20") #Leerzeichen mit %20 codieren
  query <- paste("http://maps.google.com/maps/geo?q=",query,"&output=csv&num=1",sep="")
  res <- read.table(query,sep=",")
  cat("Ort #",i,"von",length(reisetrip),";",reisetrip[i],"\n")
  Sys.sleep(runif(1,0.1,2.5)) #Wir warten ein wenig, damit Google nicht sauer wird.
  langen[i] <- res[,4] #longitude
  breiten[i] <- res[,3] #latitude
}
plot(langen,breiten,type="l", ylim=range(breiten)+c(-0.1,+0.1), xlim=range(langen)+c(-2,+0.5))
points(langen,breiten,pch=19)
text(langen,breiten,reisetrip,pos=2)

Warnungen bezüglich unvollständiger letzter Zeilen können getrost vernachlässigt werden

plot()
Weiterlesen »

Archiv

  • 2012 (28)