【问题标题】:mgcv bam() error: cannot allocate vector of size 99.6 Gbmgcv bam() 错误:无法分配大小为 99.6 Gb 的向量
【发布时间】:2017-12-27 21:55:04
【问题描述】:

我正在尝试使用 bam(mgcv 库)拟合加法混合模型。我的数据集有 10^6 个观察值,来自对 300 个保健中心中 2.10^5 个儿童生长的纵向研究。我正在寻找每个中心的坡度。 型号是

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 Gb de RAM 的集群。

感谢您的帮助

【问题讨论】:

标签: r gam


【解决方案1】:

要更准确地诊断问题出在哪里,请尝试使用省略的各种项来拟合您的模型。模型中有几个术语可能会让您大吃一惊:

  • 涉及center 的固定效果将爆炸到300 列* 10^6 行;根据 year 是数字还是因子,year*center 术语可能会爆炸到 600 列或 (nyears*300) 列
  • 我不清楚bam 是否对s(.,bs="re") 项使用稀疏矩阵;如果没有,你会遇到麻烦(2*10^5 列 * 10^6 行)

数量级,包含 10^6 个数值的向量(模型矩阵的一列)占用 7.6 Mb,因此 500 GB / 7.6 MB 大约是 65,000 列 ...

这里只是猜测,但我会尝试gamm4 包。它不是专门为低内存使用而设计的,但是:

‘gamm4’在随机效应不是 i.i.d. 时最有用,或者 当有大量随机系数[原文如此](超过 几百个),每个只适用于一小部分 响应数据。

我也会将大部分术语变成随机效应:

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) 可能有意义,用于评估中心间变异和年份之间的协变...如果有很多年,请考虑将其改为平滑术语...

【讨论】:

  • 谢谢本。我会试试。数据来自 10 年。我没有将中心随机包括在内,因为我没有中心样本,而是人口
  • 我不认为这是随机处理中心的障碍。你可以看到我对这个话题的看法here(以及其他答案中的其他意见)
  • +1 我还想看看原始模型是否可以与bam()discrete = TRUE 参数相匹配。虽然,我认为问题不在于这里的平滑,但正如 Ben 所指出的,随机效应,我不确定离散化将如何帮助re 平滑的内存使用。
猜你喜欢
  • 2021-04-03
  • 1970-01-01
  • 2019-10-05
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
相关资源
最近更新 更多