Jak zauważył Carl Witthoft standardowe narzędzia Zrównoleglanie w R używać współdzielonej pamięci modelu, więc będą one dokonać rzeczy gorsze niż lepsze (ich głównym celem jest przyspieszenie obliczeniowych związana pracy przy użyciu wielu procesory).
W krótkim czasie możesz zaoszczędzić trochę pamięci, traktując kategoryczne predyktory efektów stałych (age
, atc
) jako efekty losowe, ale wymuszając duże rozbieżności. Nie wiem, czy to wystarczy, by cię uratować, czy nie; będzie kompresować matrycy stałej efekt modelu dużo, ale model rama nadal będą przechowywane/replikowane z modelu obiektowego ...
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)
losowe efekty są automatycznie sortowane w kolejności od największego do najmniejszego liczby poziomy. Po maszyny opisanej na stronie ?modular
help:
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
można zignorować zgłoszone wariancji dla kategorycznych słowach, i korzystać ranef()
odzyskać swoje (unshrunk) oszacowania.
W dłuższej perspektywie właściwym sposobem rozwiązania tego problemu jest prawdopodobnie zrównoleglenie go z modelem pamięci rozproszonej. Innymi słowy, chciałbyś spakować dane w porcjach do różnych serwerów; użyć maszyny opisanej w ?modular
, aby ustawić funkcję wiarygodności (właściwie funkcję kryterium REML), która nadaje kryterium REML dla podzbioru danych w funkcji parametrów; następnie uruchom centralny optymalizator, który pobiera zestaw parametrów i ocenia kryterium REML, przesyłając parametry do każdego serwera, pobierając wartości z każdego serwera i dodając je. Jedynymi dwoma problemami, które widzę przy implementacji tego są (1) nie wiem jak zaimplementować obliczenia pamięci rozproszonej w R (na podstawiewydaje się, że pakiety Rmpi/doMPI mogą być właściwą drogą); (2) w domyślnym sposobie implementacji lmer
parametry efektów stałych są wyprofilowane, a nie stanowią jawnie część wektora parametrów.
wypróbować pakiet/bibliotekę "MixedModels" Douga Batesa dla Julii? –
Po pierwsze, "wektor alokacji" oznacza przydział pamięci RAM, więc pamięć dyskowa serwera jest nieistotna. Następnie naprawdę musisz poświęcić trochę czasu na poznanie pakietów takich jak 'parallel' i' snow' oraz 'bigdata'. W przeciwnym razie, nawet jeśli ktoś napisze dla ciebie narzędzie, nie zrozumiesz jak go zmodyfikować lub znaleźć szybkie wąskie gardła. –
Dzięki Ben będę musiał rzucić okiem. – steve