R语言 计算时间GAM

lb3vh1jj  于 2023-02-06  发布在  其他
关注(0)|答案(1)|浏览(200)

我正在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

rn0zuynd

rn0zuynd1#

要了解bam()的作用,应该在传递给control参数的列表中设置trace = TRUE

ctrl <- gam.control(trace = TRUE)
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 = TRUE, 
          discrete = TRUE,
          control = ctrl)

这样你就可以在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,而单个组织的线性趋势?

相关问题