我正在尝试使用bam(mgcv库)拟合添加剂混合模型。我的数据集对来自300个健康中心的2.10 ^ 5名儿童的生长进行纵向研究,有10 ^ 6个观察结果。我正在寻找每个中心的斜坡。 该模型是
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的群集。
感谢您的帮助
答案 0 :(得分:4)
要更准确地诊断出问题所在,请尝试使用遗漏的各种术语来拟合模型。模型中有几个术语可能会对您产生影响:
center
的固定效应会爆炸300列* 10 ^ 6行;取决于year
是数字还是因子,year*center
字词可能会炸掉600列或(n年* 300)列bam
是否对s(.,bs="re")
项使用稀疏矩阵;如果没有,你会遇到大麻烦(2 * 10 ^ 5列* 10 ^ 6行)数量级,10 ^ 6数值的向量(模型矩阵的一列)需要7.6 Mb,因此500 GB / 7.6 MB将是大约65,000列......
这里只是猜测,但我会试用gamm4
包。它并非专门针对低内存使用,但是:
当随机效应不是i.i.d.或时,'gamm4'最有用 当有大量的随机系数[原文如此](超过 几百个),每个只申请一小部分 回应数据。
我还会将大部分术语变成随机效果:
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)
可能有意义,评估中间变异和年份之间的协变......如果有多年,请考虑使其成为一个平滑的术语......