[英]Running random error model with mgcv gam takes too much memory
我正在研究 model,其中包括多個 RE 和一個變量的樣條曲線,因此我正在嘗試使用gam()
。 但是,我遇到了 memory exhaust limit 錯誤(即使我在 128GB 的集群上運行它)。 即使我只用一個 RE 運行最簡單的模型,也會發生這種情況。 當我改用lmer()
時,相同的模型(減去樣條曲線)運行平穩,只需幾秒鍾(或完整模型的幾分鍾)。
我想知道是否有人知道為什么gam()
和lmer()
之間存在差異以及任何可能的解決方案。
下面是一些帶有模擬數據和最簡單模型的代碼:
library(mgcv)
library(lme4)
set.seed(1234)
person_n <- 38000 # number of people (grouping variable)
n_j <- 15 # number of data points per person
B1 <- 3 # beta for the main predictor
n <- person_n * n_j
person_id <- gl(person_n, k = n_j) #creating the grouping variable
person_RE <- rep(rnorm(person_n), each = n_j) # creating the random errors
x <- rnorm(n) # creating x as a normal dist centered at 0 and sd = 1
error <- rnorm(n)
#putting it all together
y <- B1 * x + person_RE + error
dat <- data.frame(y, person_id, x)
m1 <- lmer(y ~ x + (1 | person_id), data = dat)
g1 <- gam(y ~ x + s(person_id, bs = "re"), method = "REML", data = dat)
m1
在我的電腦上只運行了幾秒鍾,而g1
遇到了錯誤:
錯誤:矢量 memory 耗盡(達到限制?)
來自?mgcv::random.effects
:
對於具有大量隨機效應的擬合模型,
gam
可能會很慢,因為它沒有利用參數隨機效應通常具有的稀疏性......但是“gam”通常比“gamm”或“gamm4”更快更可靠',當隨機效應的數量適中時。 [強調]
這意味着在設置 model 的過程中, s(., bs = "re")
嘗試生成一個密集的 model 矩陣,相當於model.matrix( ~ person_id - 1)
; 這需要 (nrows x nlevels x 8 bytes/double) = (3.8e4*5.7e5*8)/2^30
= 161.4 Gb(這正是我的機器報告它無法分配的 object 大小)。
查看mgcv::gamm
和gamm4::gamm4
以獲得更節省內存(在本例中更快)的方法...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.