Ошибка mgcv bam (): невозможно выделить вектор размером 99,6 ГБ

Я пытаюсь подогнать аддитивную смешанную модель с помощью bam (библиотека mgcv). В моем наборе данных содержится 10 ^ 6 наблюдений из лонгитюдного исследования роста 2,10 ^ 5 детей, находящихся в 300 медицинских центрах. Ищу уклон для каждого центра. Модель

bam(haz ~ s(month, bs = "cc", k = 12)+ sex+ s(age)+ center+ year+ year*center+s(child, bs="re"), data)

Каждый раз, когда я пытаюсь подогнать модель, появляется следующее сообщение об ошибке:

Error: cannot allocate vector of size 99.6 Gb
In addition: Warning message:
In matrix(by, n, q) : data length exceeds size of matrix

Я работаю над кластером с 500 ГБ оперативной памяти.

Спасибо за любую помощь


r gam
person Adriana    schedule 27.12.2017    source источник
comment
Решения для этого могут быть либо очень общими (получить больше ОЗУ), либо очень, очень специфичными для вашей конкретной задачи моделирования. например см. stackoverflow.com/q/10917532/324364   -  person joran    schedule 28.12.2017


Ответы (1)


Чтобы более точно определить, в чем заключается проблема, попробуйте подогнать свою модель, исключив из нее различные термины. В модели есть несколько терминов, которые могут вас обрушить:

  • фиксированные эффекты, включающие center, увеличивают до 300 столбцов * 10 ^ 6 строк; в зависимости от того, является ли year числовым или множительным, термин year*center может увеличивать до 600 столбцов или (nyears * 300) столбцов
  • мне не ясно, использует ли bam разреженные матрицы для s(.,bs="re") терминов; в противном случае у вас будут большие проблемы (2 * 10 ^ 5 столбцов * 10 ^ 6 строк)

По порядку величины вектор из 10 ^ 6 числовых значений (один столбец матрицы вашей модели) занимает 7,6 МБ, поэтому 500 ГБ / 7,6 МБ будут примерно 65000 столбцов ...

Просто догадываюсь, но я бы попробовал пакет gamm4. Он не предназначен специально для использования с низким объемом памяти, но:

«Gamm4» наиболее полезен, когда случайные эффекты не являются i.i.d. или когда имеется большое количество случайных коэффициентов [sic] (более нескольких сотен), каждый из которых применяется только к небольшой части данных ответа.

Я бы также превратил большинство терминов в случайные эффекты:

gamm4::gamm4(haz ~ s(month, bs = "cc", k = 12)+ sex+ s(age)+ 
 (1|center)+ (1|year)+ (1|year:center)+(1|child), data)

или, если в наборе данных не очень много лет, рассматривать год как фиксированный эффект:

gamm4::gamm4(haz ~ s(month, bs = "cc", k = 12)+ sex+ s(age)+ 
 year + (1|center)+ (1|year:center)+(1|child), data)

Если есть небольшое количество лет, тогда (year|center) может иметь смысл, чтобы оценить межцентровую вариацию и ковариацию между годами ... если есть много лет, подумайте о том, чтобы вместо этого сделать это плавным термином ...

person Ben Bolker    schedule 27.12.2017
comment
Спасибо, Бен. Я попробую. Данные поступают за 10 лет. Я не включил центры как случайные, потому что у меня есть не выборка центров, а население - person Adriana; 28.12.2017
comment
Я не думаю, что это препятствие для того, чтобы рассматривать центры как случайные. Вы можете увидеть мое мнение по этой теме здесь (и другие мнения в других ответах) - person Ben Bolker; 28.12.2017
comment
+1 Я бы также посмотрел, можно ли использовать исходную модель с аргументом discrete = TRUE для bam(). Хотя я не думаю, что проблема здесь в сглаживании, а, как указывает Бен, в случайных эффектах, и я не уверен, как дискретизация поможет с использованием памяти для re сглаживания. - person Gavin Simpson; 28.12.2017