【问题标题】:Running random error model with mgcv gam takes too much memory使用 mgcv gam 运行随机错误模型需要太多内存
【发布时间】:2021-08-26 13:45:18
【问题描述】:

我正在研究一个模型,该模型包含多个 RE 和一个变量的样条曲线,因此我尝试使用 gam()。但是,我遇到了内存耗尽限制错误(即使我在 128GB 的​​集群上运行它)。即使我只用一个 RE 运行最简单的模型,也会发生这种情况。当我改用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 出现错误:

错误:向量内存耗尽(达到限制?)

【问题讨论】:

    标签: r lme4 mixed-models spline mgcv


    【解决方案1】:

    来自?mgcv::random.effects

    gam 在拟合具有大量随机数的模型时可能会很慢 效果,因为 它没有利用通常是 参数随机效应的特征 ...但是“gam”通常是 比‘gamm’或‘gamm4’更快、更可靠,当数字 随机效应是适度的。 [强调]

    这意味着在建立模型的过程中,s(., bs = "re") 试图生成一个与model.matrix( ~ person_id - 1) 等效的密集 模型矩阵;这需要 (nrows x nlevels x 8 bytes/double) = (3.8e4*5.7e5*8)/2^30 = 161.4 Gb(这正是我的机器报告它无法分配的对象大小)。

    查看mgcv::gammgamm4::gamm4 以获得更节省内存(在这种情况下更快)的方法...

    【讨论】:

    • 嘿@ben,您是如何查看您的机器无法分配的对象大小的?我为 R 寻找内存监控工具,但似乎没有提供该信息
    猜你喜欢
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多