如何解决具有大型数据集> 100 万行的广义加性混合效应模型 (GAMM)
我有一个大型数据集,我想将广义加性混合效应模型拟合到该数据集。总的来说,我的意思是 > 500 万行数据。我已经尝试使用以下规格在 mgcv 包中同时使用 GAM 和 GAMM 来拟合它:
m1 <- gamm(y~s(time,by=category,k=-1) + category,random=list(model=~1),family=betar,data=df)
m2 <- gam(y~s(time,k=-1) + category + s(model,bs='re'),data=df)
我对拟合 GAM 模型以解释时间和 y 之间的非线性关系以及量化类别之间的差异感兴趣。模型作为随机效应包含在内,因为每个模型有 5 个不同的类别(下面是虚拟数据)。
我已将原始数据(约 600 万行)子集化为较小的数据帧(30 万行)以进行试验,但即使在具有 128GB RAM 的机器上我也遇到问题:
nlminb 问题收敛错误代码 = 1 消息 = 达到迭代限制但未收敛 (10)
和:
错误,无法分配 32.6GB 的向量大小
我的问题有两个:
-
具有这种规模的数据集在计算上易于处理的 GAMM,并且
-
我可以做些什么来优化代码以使其运行?
我已尝试将 niterPQL=500 添加到 GAM 模型,但仍然存在收敛问题。最终,我想在 GAMM 模型中包含 corSpatial(form = ~ lat + long) 的空间自相关,或在 GAM 模型中包含 s(lat,long),但即使在基本形式中,我也无法运行模型.
如果它有助于理解数据的结构,我在下面添加了虚拟代码(有 200,000 行):
library(mgcv)
beta <- 0.0002
n <- 10000
temp1a <- data.frame(y = exp(beta * seq(n)) + rnorm(n),time = seq(n),model="a",category="a")
temp1b <- data.frame(y = exp(beta * seq(n)) + rnorm(n),model="b",category="a")
temp1c <- data.frame(y = exp(beta * seq(n)) + rnorm(n),model="c",category="a")
temp1d <- data.frame(y = exp(beta * seq(n)) + rnorm(n),model="d",category="a")
temp1e <- data.frame(y = exp(beta * seq(n)) + rnorm(n),model="e",category="a")
temp2a <- data.frame(y = exp(beta * seq(n)) + rnorm(n),category="b")
temp2b <- data.frame(y = exp(beta * seq(n)) + rnorm(n),category="b")
temp2c <- data.frame(y = exp(beta * seq(n)) + rnorm(n),category="b")
temp2d <- data.frame(y = exp(beta * seq(n)) + rnorm(n),category="b")
temp2e <- data.frame(y = exp(beta * seq(n)) + rnorm(n),category="b")
temp3a <- data.frame(y = exp(beta * seq(n)) + rnorm(n),category="c")
temp3b <- data.frame(y = exp(beta * seq(n)) + rnorm(n),category="c")
temp3c <- data.frame(y = exp(beta * seq(n)) + rnorm(n),category="c")
temp3d <- data.frame(y = exp(beta * seq(n)) + rnorm(n),category="c")
temp3e <- data.frame(y = exp(beta * seq(n)) + rnorm(n),category="c")
temp4a <- data.frame(y = exp(beta * seq(n)) + rnorm(n),category="d")
temp4b <- data.frame(y = exp(beta * seq(n)) + rnorm(n),category="d")
temp4c <- data.frame(y = exp(beta * seq(n)) + rnorm(n),category="d")
temp4d <- data.frame(y = exp(beta * seq(n)) + rnorm(n),category="d")
temp4e <- data.frame(y = exp(beta * seq(n)) + rnorm(n),category="d")
df <- rbind(temp1a,temp1b,temp1c,temp1d,temp1e,temp2a,temp2b,temp2c,temp2d,temp2e,temp3a,temp3b,temp3c,temp3d,temp3e,temp4a,temp4b,temp4c,temp4d,temp4e)
df$model <- as.factor(df$model)
df$category <- as.factor(df$category)
df$time <- as.numeric(df$time)
df$y <- as.numeric(df$y)
df$y [df$y == 1] <- 0.999999
df$y [df$y == 0] <- 0.000001
range01 <- function(x){(x-min(x))/(max(x)-min(x))}
df$y <- range01(df$y)
m1 <- gamm(y~s(time,data=df)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。