You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用mgcv包gam函数运行随机效应模型内存占用过高问题

内存差异的核心原因
  • lmer()底层默认采用稀疏矩阵技术处理随机效应:对于你场景里38000个组的随机截距项,它的设计矩阵天然是稀疏的(每一行仅对应一个分组的非零值),lmer()不会存储完整的稠密矩阵,仅保留非零元素,内存占用极低,拟合速度快。
  • gam()默认的bs="re"随机效应基底采用稠密矩阵构造惩罚项:38000个分组的随机效应对应的惩罚矩阵是38000×38000的稠密double型矩阵,仅该矩阵就占用约11GB内存,拟合过程中还会生成多个中间矩阵,即便单随机效应的最简模型也很容易触发内存耗尽,多随机效应+样条项的全模型内存消耗会进一步大幅上升。

你遇到的报错就是内存超限的典型表现:

Error: vector memory exhausted (limit reached?)

可行解决方案

以下方案按适配你的需求(多随机效应+样条项)的优先级排序:

  • 优先使用gamm4包的gamm4()函数:该工具底层调用lme4处理所有随机效应,完全复用lmer的稀疏矩阵优化,同时用mgcv处理样条项,同时满足你加样条和高效拟合随机效应的需求,写法兼容你原本的lmer随机效应语法:
library(gamm4)
# 样条项写在左侧公式,随机效应完全按照lmer的写法放在random参数中
g2 <- gamm4(y ~ x + s(你的样条变量), random = ~ (1|person_id) + (1|其他分组变量), data = dat)
  • 使用mgcv专为大数据优化的bam()函数替代gam():bam()默认针对大样本做了内存优化,搭配fREML(快速REML)和discrete=TRUE参数,处理随机效应时会自动采用稀疏存储,内存占用和速度都接近lmer:
# 你的最简模型用bam修改后可正常运行
g1 <- bam(y ~ x + s(person_id, bs = "re"), method = "fREML", data = dat, discrete = TRUE)
  • 若坚持使用gam(),可手动开启稀疏矩阵支持:在拟合时添加control = gam.control(sparse = TRUE)参数,强制gam()用稀疏格式存储随机效应的设计矩阵和惩罚矩阵,可大幅降低内存占用,但拟合速度弱于前两种方案:
g1 <- gam(y ~ x + s(person_id, bs = "re"), method = "REML", data = dat, control = gam.control(sparse = TRUE))

内容的提问来源于stack exchange,提问作者mpnyka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 08:57:03