Запуск модели случайных ошибок с mgcv gam занимает слишком много памяти

#r #lme4 #mixed-models #spline #mgcv

Вопрос:

Я работаю над моделью, которая включает в себя несколько REs и сплайн для одной из переменных, поэтому я пытаюсь использовать gam() . Однако я достигаю ошибки предела исчерпания памяти (даже когда я запускаю ее в кластере со 128 ГБ). Это происходит даже тогда, когда я запускаю простейшие модели всего с одним повторением. Те же модели (за вычетом сплайна) работают плавно и всего за несколько секунд (или минут для полной модели), когда я использую lmer() их вместо этого.

Мне было интересно, есть ли у кого-нибудь идеи, почему расхождение между gam() и lmer() и любыми потенциальными решениями.

Вот некоторый код с моделируемыми данными и простейшими моделями:

 library(mgcv)
library(lme4)

set.seed(1234) 
person_n <- 38000 # number of people (grouping variable)
n_j <- 15 # number of data points per person 
B1 <- 3 # beta for the main predictor
n <- person_n * n_j 

person_id <- gl(person_n, k = n_j) #creating the grouping variable
person_RE <- rep(rnorm(person_n), each = n_j) # creating the random errors

x <- rnorm(n) # creating x as a normal dist centered at 0 and sd = 1
error <- rnorm(n) 

#putting it all together
y <- B1 * x   person_RE   error
dat <- data.frame(y, person_id, x)

m1 <- lmer(y ~ x   (1 | person_id), data = dat)

g1 <- gam(y ~ x   s(person_id, bs = "re"), method = "REML", data = dat)
 

m1 запускается всего за пару секунд на моем компьютере, в то g1 время как появляется ошибка:

Ошибка: векторная память исчерпана (достигнут предел?)

Ответ №1:

От ?mgcv::random.effects :

gam может быть медленным для подгонки моделей с большим количеством случайных эффектов, поскольку он не использует разреженность, которая часто является особенностью параметрических случайных эффектов … Однако «gam’ часто быстрее и надежнее, чем «gamm» или «gamm4», когда количество случайных эффектов невелико. [курсив добавлен]

Это означает, что в процессе настройки модели s(., bs = "re") пытается создать матрицу плотной модели, эквивалентную model.matrix( ~ person_id - 1) ; это занимает (nrow x уровней nl x 8 байт/двойной) = (3.8e4*5.7e5*8)/2^30 = 161,4 Гб (это именно тот размер объекта, который моя машина сообщает, что она не может выделить).

Проверьте mgcv::gamm и gamm4::gamm4 более эффективные с точки зрения памяти (и более быстрые, в данном случае) методы …