2015-07-16 10 views
5

Ich möchte ein gemischtes Modell (mit lme4::lmer) auf 60M-Beobachtungen des folgenden Formats ausführen; alle Prädiktor/abhängigen Variablen sind kategorische (Faktoren) abgesehen von der kontinuierlichen abhängigen Variablen tc; patient ist die Gruppierungsvariable für einen zufälligen Abfangterm. Ich habe 64-Bit R und 16 GB RAM und ich arbeite von einem zentralen Server. RStudio ist die neueste Serverversion.Anpassen eines linearen gemischten Modells an einen sehr großen Datensatz

model <- lmer(tc~sex+age+lho+atc+(1|patient), 
       data=master,REML=TRUE) 

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 

Ich bekomme einen cannot allocate a vector of 25.5Gb Fehler. Ich habe 40 GB auf dem Server und verwende 25, also denke ich, dass ich noch 10 brauche. Ich glaube nicht, dass ich zusätzlichen Platz bekommen kann.

Ich weiß nicht die erste Sache über die parallele Verarbeitung, außer dass ich einen von vier Kernen im Moment benutze. Kann jemand für dieses Modell einen parallelen Code vorschlagen oder vielleicht eine andere Lösung?

+0

versuchen Doug Bates 'MixedModels' Paket/Bibliothek für Julia? –

+0

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. –

+0

Danke Ben, ich werde es mir ansehen. – steve

Antwort

2

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.

+0

Vielen Dank für Ihre Eingabe Ben. Es wird uns etwas Zeit nehmen, das alles zu analysieren, aber ich werde es versuchen. – steve

+0

Ich habe nur etwas zusätzlichen Speicherplatz auf dem Server freigegeben, aber jetzt bekomme ich diese Fehlermeldung: Fehler in qr.default (X, tol = tol, LAPACK = FALSE): zu große Matrix für LINPACK Kann jemand Licht auf Dies? – steve

+0

können Sie traceback() 'versuchen, um zu sehen, wo das Problem ist. Meine Vermutung ist, dass Sie auf ein Problem mit der Phase stoßen, die überprüft, dass die Matrix des festen Effektmodells (X) von vollem Rang ist. Sie können diesen Schritt überspringen ('control = lmerControl (check.rankX =" ignore ")'), aber ich schätze, dass Sie kurz danach weitere Probleme bekommen werden. –