r - 使用离散化时无法在 mgcv 中生成预测(离散=T)

标签 r gam mgcv

我正在使用广义加法模型使用随机站点级效应来拟合模型,该模型在 mgcv 中实现我一直在使用函数 gam() 来完成此操作。但是,为了加快速度,我需要切换到 bam()框架,与 gam() 基本相同,但速度更快。我通过传递选项 bam(nthreads = N, discrete=T) 进一步加快了拟合速度,其中nthreads是我机器上的核心数量。但是,当我使用离散化选项,然后尝试使用我的模型对新数据进行预测,同时忽略随机效应时,我始终会遇到错误。

这里是生成示例数据并重现错误的代码。

library(mgcv)
#generate data.
N <- 10000
x <- runif(N,0,1)
y <- (0.5*x / (x + 0.2)) + rnorm(N)*0.1 #non-linear relationship between x and y.

#uninformative random effect.
random.x <- as.factor(do.call(paste0, replicate(2, sample(LETTERS, N, TRUE), FALSE)))


#fit models.
fit1 <- gam(y ~ s(x) + s(random.x, bs = 're')) #this one takes ~1 minute to fit, rest faster.
fit2 <- bam(y ~ s(x) + s(random.x, bs = 're'))
fit3 <- bam(y ~ s(x) + s(random.x, bs = 're'), discrete = T, nthreads = 2)

#make predictions on new data.
newdat <- data.frame(runif(200, 0, 1))
colnames(newdat) <- 'x'
test1 <- predict(fit1, newdata=newdat, exclude = c("s(random.x)"), newdata.guaranteed = T)
test2 <- predict(fit2, newdata=newdat, exclude = c("s(random.x)"), newdata.guaranteed = T)
test3 <- predict(fit3, newdata=newdat, exclude = c("s(random.x)"), newdata.guaranteed = T)

使用使用离散化的第三个模型进行预测会引发此错误(其他两个模型不会):

Error in model.frame.default(object$dinfo$gp$fake.formula[-2], newdata) : 
  variable lengths differ (found for 'random.x')
In addition: Warning message:
'newdata' had 200 rows but variables found have 10000 rows 

如何使用离散化拟合模型对新数据集进行预测?

最佳答案

newdata.gauranteed 似乎不适用于具有 discrete = TRUEbam() 模型。您可以向 mgcv 的作者和维护者发送电子邮件,并向他发送可重现的示例,以便他查看。请参阅?bug.reports.mgcv

你可能想要

names(newdat) <- "x"

因为数据框有名称

但解决方法只是为 random.x 传递一些内容

newdat <- data.frame(x = runif(200, 0, 1), random.x = random.x[[1]])

然后调用生成test3,它将起作用。

警告消息和错误是由于您没有在新数据中指定random.x,然后mgcv寻找random.x并在全局环境中找到它的结果。您确实应该将这些变量收集到数据框中,并在拟合模型时使用 data 参数,并尽量不要将类似命名的对象留在全局环境中。

关于r - 使用离散化时无法在 mgcv 中生成预测(离散=T),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62913730/

相关文章:

r - 对于传单代理中多个多边形的循环?

r - 1 :object$nsdf : argument of length 0 when using plot. gam 中的错误

r - 是否可以在 mgcv gam 模型中包含两个平滑项的乘积

r - 是否可以用ggplot2绘制gam拟合的平滑分量?

r - 如何在具有相同名称的 2 个不同库中使用 2 个不同函数

r - 用于运行统计分析的数据集

r - 向 R 条形图添加垂直分隔符和标签

r - r 中的 library()/require() 和 source() 有什么区别?

gam - GAMLSS错误:响应变量超出范围

r - mgcv:如何返回估计的平滑参数?