2015-07-16 23 views
5

Chcę uruchomić mieszany model (używając lme4::lmer) w 60M obserwacjach w następującym formacie; wszystkie predyktory/zmienne zależne są kategoryczne (czynniki), z wyjątkiem ciągłej zmiennej zależnej tc; patient to zmienna grupująca dla losowego terminu przechwytywania. Mam 64-bitową pamięć RAM R i 16 GB i pracuję z serwera centralnego. RStudio to najnowsza wersja serwera.dopasowywanie liniowego modelu mieszanego do bardzo dużego zestawu danych

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 

Otrzymuję błąd cannot allocate a vector of 25.5Gb. Mam przydzielone 40 GB na serwerze i używam 25, więc myślę, że to oznacza, że ​​potrzebuję kolejnych 10 lub więcej. Nie sądzę, żebym mógł otrzymać dodatkową przestrzeń.

Nie wiem, co jest najważniejsze w przetwarzaniu równoległym, z tą różnicą, że korzystam obecnie z jednego z czterech rdzeni. Czy ktokolwiek może zaproponować równoległy kod dla tego modelu, czy może inną poprawkę?

+0

wypróbować pakiet/bibliotekę "MixedModels" Douga Batesa dla Julii? –

+0

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

+0

Dzięki Ben będę musiał rzucić okiem. – steve

Odpowiedz

2

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.

+0

Dziękuję bardzo za twój wkład Ben. Poświęcimy trochę czasu na przeanalizowanie tego wszystkiego, ale spróbuję. – steve

+0

Właśnie dostałem trochę wolnego miejsca na serwerze, ale teraz otrzymuję ten komunikat o błędzie: Błąd w qr.default (X, tol = tol, LAPACK = FALSE): zbyt duża matryca dla LINPACK Czy ktoś rzuci jakieś światło na to? – steve

+0

możesz spróbować 'traceback()', aby zobaczyć, gdzie jest problem. Domyślam się, że masz problem z etapem sprawdzania, czy matryca modelu efektów stałych (X) ma pełną rangę. Możesz pominąć ten krok ('control = lmerControl (check.rankX =" ignore ")'), ale domyślam się, że wkrótce potem pojawi się więcej problemów. –

Powiązane problemy