GNU R
Aus WeissWiki
Inhaltsverzeichnis |
[Bearbeiten] R im batch-mode unter MS-Windows
Gegeben sei ein R-Script (test.r; siehe unten), das man gerne per Kommandozeile aufrufen möchte; außerdem sollen noch zwei (oder mehr) Argumente übergeben werden. Dann lautet der Aufruf:
R --vanilla --slave --args "Normalverteilte Zufallsvariable" "Ich bin eine X-Achse" < test.r > mytest.txt
Nachfolgend das Listing für test.r:
## ——————- test.r ————————- ## Der Mittelwert wird in mytest.txt abgespeichert myargs=commandArgs(TRUE) x <- rnorm(100) mean(x) pdf(file = “d:/test.pdf”) hist(x, main = myargs[1], xlab = myargs[2]) dev.off() ## ——————- test.r ————————-
[Bearbeiten] Programmieren in R
[Bearbeiten] Wie lassen sich in R schnell und einfach multivariate Statistiken für Teildatensätze erstellen? (oder: Keine Schleifen, bitte!)
Eine Stärke von R zeigt sich in der Möglichkeit, schnell und einfach, gruppierte (= nach Subgruppen getrennte) Statistiken mit mehr als einer Variablen zu berechnen und diese schnell und einfach weiterverarbeiten zu können. Mich interessiert also kein schlichter aggregate-Befehl.
Zur Vorbereitung einer Lehrveranstaltung befasse ich mich gerade mit den PISA 2000 Daten und meine Absicht bestand darin, für alle 43 Länder den bivariaten Zusammenhang (hier: Rang-Korrelation) zwischen den Items “How many times in the previous two school weeks did you: miss school? ” und “My school is a place where: I feel like an outsider (or left out of things)” zu ermitteln. Anschließend soll mit den 43 Korrelationskoeffizienten weitergearbeitet werden, d.h. diese sollen als eigenständiger Datensatz vorliegen.
Nachfolgend werde ich simulierte Daten verwenden, also bitte keine inhaltliche Interpretation vornehmen! Zunächst werde ich einen künstlichen Datensatz erzeugen, der drei Variablen (x,y, groups) enthält und werde nach groups getrennt für x und y den Korrelationskoeffizienten ermitteln. Da es 20 Gruppen gibt, werden 20 Koeffizienten berechnet.
[Bearbeiten] Datensatz simulieren
Zunächst wird ein ausreichend großer Datensatz konstruiert (N = 10.000.000):
## stellt mvrnorm() zur Verfuegung
library(MASS)
## Replizierbarkeit sicher stellen
set.seed(563)
## Groesse der Stichprobe
N <- 10000000
## multivariat normalverteile Stichprobe erstellen
dmSim <- mvrnorm(n=N, mu=rnorm(2), Sigma=matrix(c(10,3,3,2), ncol = 2))
## 20 Gruppen
groups <- rep(1:20, N/20)
## DF konstruieren
dfSimG <- data.frame(dataSim,groups)
## Variablennamen vergeben
colnames(dfSimG) <- c("x","y","groups")
[Bearbeiten] Korrelationen in Teilstichproben mit Hilfe einer Schleife ermitteln
Anschließend wird eine Funktion definiert, die für die jeweilige Teilstichprobe den Korrelationskoeffizienten ermittelt. Da es 20 Gruppen gibt, werden also 20 Durchläufe benötigt.
funcLoopCorr <- function(){
vecCorr <- vector(length = 20, mode="numeric")
for(i in unique(dfSimG$groups)){
vecCorr[i] <- cor(dfSimG[dfSimG$groups == i,-3])[1,2]
}
}
Mit dem Befehl system.time() wird die Zeitdauer der Funktion funcLoopCorr() ermittelt. Die reine Prozessorzeit beträgt also 37 Sekunden.
> system.time(funcLoopCorr()) user system elapsed 37.00 2.98 40.27
[Bearbeiten] Korrelationen in Teilstichproben durch by() ermitteln
Mit der Funktion by() lassen sich Schleifen vermeiden und was zuvor 4 Zeilen Code (ordentlich formatiert) bedurfte, lässt sich nun mit einem Einzeiler erledigen (Idee und ein weiterer Lösungsansatz):
dataCorr <- rbind(by(dataSimG, dataSimG["groups"], function(z) cor(z[,"x"], z[,"y"])))
Das Ergebniss lautet:
> c(dataCorr) [1] 0.6698640 0.6702968 0.6702803 0.6708199 0.6706622 0.6706048 0.6727785 [8] 0.6718282 0.6704741 0.6710550 0.6706869 0.6705626 0.6720956 0.6701522 [15] 0.6710525 0.6712767 0.6703958 0.6718686 0.6707687 0.6714364
Eine erneute Zeitmessung belegt den geringeren Ressourcenverbrauch:
> system.time(dataCorr <- rbind(by(dataSimG, dataSimG["groups"], function(z) cor(z[,"x"], z[,"y"])))) user system elapsed 5.41 2.00 7.53
Nunmehr liegt die reine Prozessorzeit bei 5.41 Sekunden. Mit dem Vektor dataCorr lassen sich nun problemlos weitere Analysen vornehmen. Statt einer Korrelation lassen sich beliebig komplizierte Verfahren einsetzen, etwa Regressionsmodelle. Ich behaupte, dass in SPSS oder Stata wesentlich mehr Aufwand betrieben werden muss. Oder?
[Bearbeiten] Mathematische/Statistische Funktionen
- Fakultät von n (n!): factorial(n)
- Binomialkoeffizient n über k (bzw. x): choose(n, x)
[Bearbeiten] Gemischte Modelle/Mehrebenenmodelle
[Bearbeiten] Meta-analysis in R
[Bearbeiten] Graphiken in R
[Bearbeiten] Package ggplot2
- Rahmen um Legende entfernen: http://stackoverflow.com/questions/2249457/is-there-a-way-to-remove-the-border-of-the-legend-in-ggplot2

