Как указал Карл Витхофт, стандартные инструменты распараллеливания в R используют модель разделяемой памяти, поэтому они скорее ухудшат, чем улучшат ситуацию (их основная цель — ускорить вычислительные операции задания с использованием нескольких процессоров).
В краткосрочной перспективе вы можете сэкономить немного памяти, рассматривая категориальные предикторы с фиксированным эффектом (age
, atc
) как случайные эффекты, но заставляя их дисперсии быть большими. Я не знаю, будет ли этого достаточно, чтобы спасти вас или нет; он сильно сожмет матрицу модели с фиксированным эффектом, но кадр модели все равно будет храниться/реплицироваться с объектом модели...
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)
Случайные эффекты автоматически сортируются в порядке от наибольшего к наименьшему количеству уровней. Следуя механизму, описанному на странице справки ?modular
:
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
Вы можете игнорировать сообщаемые отклонения для категориальных терминов и использовать ranef()
для восстановления их (не уменьшенных) оценок.
В долгосрочной перспективе правильным способом решения этой проблемы, вероятно, будет распараллелить ее с помощью модели с распределенной памятью. Другими словами, вы хотели бы распределить данные порциями по разным серверам; использовать механизм, описанный в ?modular
, для настройки функции правдоподобия (на самом деле функции REML-критерия), которая дает критерий REML для подмножества данных как функцию параметров; затем запустите центральный оптимизатор, который принимает набор параметров и оценивает критерий REML, отправляя параметры на каждый сервер, получая значения с каждого сервера и добавляя их. Единственные две проблемы, которые я вижу при реализации этого: (1) я на самом деле не знаю, как реализовать вычисления с распределенной памятью в R (на основе этот вводный документ кажется, что Rmpi/doMPI пакеты могут быть правильным путем); (2) в способе реализации lmer
по умолчанию параметры с фиксированными эффектами профилируются, а не являются явной частью вектора параметров.
person
Ben Bolker
schedule
16.07.2015
MixedModels
пакет/библиотеку Дуга Бейтса для Джулии? - person Ben Bolker   schedule 16.07.2015parallel
иsnow
иbigdata
. В противном случае, даже если кто-то напишет для вас инструмент, вы не поймете, как его модифицировать или найти узкие места в скорости. - person Carl Witthoft   schedule 16.07.2015atc
? Не могли бы вы смоделироватьatc
как случайный эффект? Или, возможно, агломерироватьatc
уровней? Кроме того, вы проверили, что ваши числовые переменныеnumeric
в R? В любом случае распараллеливание не поможет с проблемой памяти. Напротив, поскольку каждому ЦП для выполнения своей задачи потребуется ОЗУ, распараллеливание усугубит проблему. - person Roland   schedule 16.07.2015