我正在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
有大约58,000个观测值,因子org.name
有大约2,500个水平,这意味着有许多随机截距和斜率需要拟合。因此,为了减少计算时间,我使用了bam()
和discrete = T
选项。我的模型已经运行了36个小时,但仍然不适合或失败,并向我提供了一个错误消息。我不确定这样一个模型需要多长时间才能适合,因此如何/何时决定是否删除命令;如果这是模型的正常行为/计算时间,我不想停止模型的运行,但如果bam()
陷入循环,永远不适合,我也不想浪费时间。
**问题:**这样的模型需要多长时间才能拟合/这样的模型的合理计算时间是多少?是否有方法可以确定bam()
是否仍在进行中,或者是否应该取消命令以避免浪费时间?
我的电脑有16 GB的内存和Intel(R)Core(TM)i7- 8565 u处理器(CPU@1.80GHz)。在我的Windows任务管理器中,我可以看到RStudio使用了20-30%的CPU和20-50%的内存,这些使用值是不断变化的,而不是静态的。x1c 0d1x
1条答案
按热度按时间rn0zuynd1#
要了解
bam()
的作用,应该在传递给control
参数的列表中设置trace = TRUE
:这样你就可以在
bam()
运行的时候在控制台中得到打印出来的语句。我会在Windows上的RStudio中检查一组更小的数据,看看它是否真正起作用(比如在?bam()
中运行这个例子);我从来没有用过它,所以你不会希望跟踪输出只在函数完成后才出现,在一个洪流中。)你的问题是随机效应,而不是数据的大小;您要为两个随机效应估计2500 + 2500个系数,为两个因子估计10 *
nlevels(org.type)
+ 10 *nlevels(region)
。对于58,000个观测,这是一个很大的数目。由于你没有设置
nthreads
,它适合在一个CPU核心上的模型。我不一定要改变,虽然使用2+线程可能只会使内存情况更糟。16 GB的Windows是不是很多RAM这些天- RStudio是使用~一半的可用RAM与您的其他软件和Windows使用剩余的36%,任务管理器报告正在使用中。您还应该检查操作系统是否必须将内存交换到磁盘;如果发生这种情况,那么给予,因为从磁盘检索数据的模型拟合的每次迭代将是痛苦的,即使有一个相当快的SSD。
随机效应可以在专用混合模型软件中更有效地完成,但您会遇到以这种形式写入GAM位(两个因子的平滑)的问题-您会在公式的相关部分分别以{brms}或{lme 4}所需的符号将随机效应写为
(1 + year | org.name)
(或gamm4())
中的random
参数)。{brms}和{gamm 4}可以做到这一点,但对于前者,您需要知道如何驱动{brms}和Stan(它进行后验的HMC采样),而{lme 4}(它是{gamm 4}用来进行拟合的)不具有beta响应族。{bamlss}包也具有用于此的选项,但是它是一个相当复杂的包,所以一定要理解如何指定模型估计方法。
所以也许可以重新审视一下你的模型结构;为什么您想要区域和组织类型的平滑
year
,而单个组织的线性趋势?