Wie von Carl Witthoft, die Standard-Parallelisierung Tools in R ein Speicher Modell zur gemeinsamen Nutzung, damit sie alles noch schlimmer machen, anstatt besser (deren Hauptzweck ist rechenintensive Arbeitsplätze durch mehrere mit beschleunigen Prozessoren).
Kurzfristig können Sie möglicherweise etwas Speicher sparen, indem Sie die kategorischen Effektprädiktoren (age
, atc
) als zufällige Effekte behandeln, deren Varianzen jedoch groß sein müssen. Ich weiß nicht, ob das ausreichen wird, um dich zu retten oder nicht; Es wird das Fest Wirkungs-Modell Matrix viel zu komprimieren, aber das Modell Rahmen noch mit dem Modellobjekt gespeichert/repliziert wird ...
dd1 <- read.table(header=TRUE,
text="lho sex tc age atc patient
18 M 16.61 45-54 H 628143
7 F 10.52 12-15 G 2013855
30 M 92.73 35-44 N 2657693
19 M 24.92 70-74 G 2420965
12 F 17.44 65-69 A 2833610
31 F 7.03 75_and_over A 1090322
3 F 28.59 70-74 A 2718649
29 F 4.09 75_and_over C 384578
16 F 67.22 65-69 R 1579355
23 F 7.7 70-74 C 896374")
n <- 1e5
set.seed(101)
dd2 <- with(dd1,
data.frame(tc=rnorm(n,mean=mean(tc),sd=sd(tc)),
lho=round(runif(n,min=min(lho),max=max(lho))),
sex=sample(levels(sex),size=n,replace=TRUE),
age=sample(levels(age),size=n,replace=TRUE),
atc=sample(levels(atc),size=n,replace=TRUE),
patient=sample(1:1000,size=n,replace=TRUE)))
library("lme4")
m1 <- lmer(tc~sex+(1|lho)+(1|age)+(1|atc)+(1|patient),
data=dd2,REML=TRUE)
Zufallseffekte werden, um automatisch sortieren von den größten auf kleinste Anzahl von Ebenen. Im Anschluss an die Maschinen in der ?modular
Hilfeseite beschrieben:
lmod <- lFormula(tc~sex+(1|lho)+(1|age)+(1|atc)+(1|patient),
data=dd2,REML=TRUE)
names(lmod$reTrms$cnms) ## ordering
devfun <- do.call(mkLmerDevfun, lmod)
wrapfun <- function(tt,bigsd=1000) {
devfun(c(tt,rep(bigsd,3)))
}
wrapfun(1)
opt <- optim(fn=wrapfun,par=1,method="Brent",lower=0,upper=1000)
opt$fval <- opt$value ## rename/copy
res <- mkMerMod(environment(devfun), opt, lmod$reTrms, fr=lmod$fr)
res
Sie können die gemeldeten Abweichungen für die kategorisch ignorieren, und verwenden Sie ranef()
ihre (ungeschrumpfte) Schätzungen zu erholen.
Auf lange Sicht ist es wahrscheinlich die richtige Methode, um dieses Problem zu lösen, es mit einem verteilten Speichermodell zu parallelisieren. Mit anderen Worten, Sie möchten die Daten in Blöcken an verschiedene Server verteilen. Verwenden Sie die in ?modular
beschriebene Maschinerie zum Einrichten einer Likelihood-Funktion (eigentlich eine REML-Kriteriumsfunktion), die das REML-Kriterium für eine Teilmenge der Daten in Abhängigkeit von den Parametern angibt; Führen Sie dann einen zentralen Optimierer aus, der eine Reihe von Parametern akzeptiert und das REML-Kriterium auswertet, indem die Parameter an jeden Server übergeben, die Werte von jedem Server abgerufen und hinzugefügt werden. Die einzigen zwei Probleme, die ich bei der Implementierung sehe, sind (1) Ich weiß nicht, wie man verteilte Speicherberechnung in R implementiert (basierend auf this intro document scheint es, dass die Rmpi/doMPI Pakete der richtige Weg zu gehen sind); (2) In der Standardausführung, in der lmer
implementiert ist, werden die Fixed-Effects-Parameter profiliert, anstatt explizit Teil des Parametervektors zu sein.
versuchen Doug Bates 'MixedModels' Paket/Bibliothek für Julia? –
Erstens, der "allocate vector" bedeutet RAM-Zuweisung, so dass der Server-Plattenspeicher irrelevant ist. Als nächstes müssen Sie sich wirklich die Zeit nehmen, etwas über Pakete wie 'parallel' und' snow' und 'bigdata' zu lernen. Andererseits, selbst wenn jemand ein Werkzeug für Sie schreibt, werden Sie nicht verstehen, wie man es modifiziert oder findet Geschwindigkeitsengpässe. –
Danke Ben, ich werde es mir ansehen. – steve