mgcv中bam拟合GAM的合理耗时及运行进度判断咨询
GAM模型拟合耗时与进程判断问题
模型与背景
我正在使用mgcv包拟合以下GAM模型:
m3.2 <- bam(pt10 ~ s(year, by = org.type) + s(year, by = region) + s(org.name, bs = 're') + s(org.name, year, bs = 're'), data = dat, method = "fREML", family = betar(link="logit"), select = T, discrete = T)
数据集dat包含约58000条观测值,因子org.name有约2500个水平,需要拟合大量随机截距和斜率。为减少计算时间,我使用了bam()函数及discrete = T参数,但模型已运行约36小时仍未完成拟合也未报错。
核心问题
- 该模型拟合的合理耗时是多少?
- 是否有方法判断
bam()仍在推进还是应终止命令?
设备配置
设备为16GB内存、Intel(R) Core(TM) i7-8565u处理器(主频1.80GHz),Windows任务管理器显示RStudio的CPU使用率为20-30%,内存使用率为20-50%,且数值处于动态变化中。
关于合理耗时
没有绝对统一的标准,但结合你的设备配置和模型复杂度来看:
- 你的模型包含两个带
by分组的平滑函数,加上2500个水平的随机截距+随机斜率项,同时使用了计算量更大的betar分布、fREML优化方法和select=T变量选择,36小时的耗时确实超出常规预期。 - 通常这类模型在你的配置下,几小时到十几小时是更常见的范围;但如果随机斜率项的设计导致矩阵运算量剧增,耗时可能会拉长,但36小时已经属于偏长的情况。
判断进程是否在推进的方法
- 启用
trace参数:如果还未重启拟合,可以在bam()中添加trace = TRUE(或指定数值如trace = 1),它会输出迭代过程的细节(比如当前迭代次数、对数似然值的变化),能直观看到模型是否在持续更新。 - 监控临时文件:使用
discrete=T时,bam()会在系统临时目录生成离散化相关的临时文件,可查看这些文件的大小或修改时间是否持续变化——如果有更新,说明进程仍在推进。 - 资源使用率信号:你观察到CPU和内存数值动态变化,大概率说明进程还在运行(若陷入死循环,资源使用率通常会稳定在极低或极高的固定值),但这个信号不够精准,仅作参考。
- 简化模型测试:可以先拟合简化版模型,比如去掉
select=T或只保留部分效应(如仅拟合s(year, by = org.type) + s(org.name, bs='re')),若简化模型能在合理时间内跑完,说明原模型的高复杂度(随机斜率+select=T+betar分布)是耗时过长的主因,而非程序卡死。
提速建议(若需继续拟合)
- 关闭
select=T:该参数会增加额外的变量选择计算,对复杂模型的耗时影响显著,若非必须,可先去掉,后续再单独做变量筛选。 - 调整
gc.level参数:设置gc.level=0可以减少垃圾回收的频率,从而降低额外耗时(你的16GB内存足以支撑,不会出现内存溢出风险)。 - 替换
method参数:尝试使用method="REML"而非fREML,fREML对复杂模型的优化过程更慢,REML在多数场景下速度更快,结果差异极小。 - 开启多线程:利用
nthreads参数启用并行计算,比如你的i7是4核8线程,可设置nthreads=4,充分利用CPU资源加速拟合。
内容的提问来源于stack exchange,提问作者Pat Taggart
相关产品推荐
相关产品推荐

