gam / bam / bam(discrete = TRUE)不包含/不包含/不包含交互(predict(type =“ terms”))

时间:2019-06-21 15:43:55

标签: r gam mgcv

使用bam(discrete = TRUE)选项时,predict(type =“ terms”)函数不再报告交互项。可以通过将交互项放在单独的交互列中来避免这种情况,以防止函数看到交互源,但这很麻烦。即使我们可以通过显式创建交互来完成相同的事情,是否有一些理论上的原因使我们不希望看到bam(discrete = TRUE)的交互?

每当我们用一堆明确编码交互作用的列替换交互作用项x:y时,该问题就可以解决。我尝试了其他各种修复方法,以试图使交互通过。例如(0 + x):y,我不确定这是否有意义,因为怀疑该列的删除方式与从predict.bam(type =“ terms”)中删除截距的方式相同。

library(mgcv)

mydf <- data.frame(class = factor(round(runif(500), digits=1)),
               x     = runif(500),
               y     = runif(500))

mydf$z <- 1 + as.numeric(mydf$class) * mydf$x + 6*(mydf$y - 0.5)^2 + 
rnorm(n=500, mean=0, sd=0.1)

mygam <- gam(z ~ 0 + class + class:x + s(y), data=mydf)

head(predict(mygam, type="terms"))

mybam <- bam(z ~ 0 + class + class:x + s(y), data=mydf)

head(predict(mybam, type="terms"))

mydiscretebam <- bam(z ~ 0 + class + class:x + s(y), discrete=TRUE, data=mydf)

head(predict(mydiscretebam, type="terms"))

我期望结果会有所不同,因为使用了两种不同的优化算法,但是令我惊讶的是,在第三个预测调用中甚至没有报告交互作用。在这种情况下,模型估计值不是项的总和。为什么要删除拦截器?这还负责删除交互吗?摘要中提供了这些系数,与其他任何参数系数一样,所以排除它们是偶然的吗?

据我所知,我实际上只是在更改优化算法。某些列来自交互的事实似乎无关紧要。

1 个答案:

答案 0 :(得分:1)

这是predict.gam中的一个错误(由predict.bam的离散版本调用以执行参数项)。已为下一个版本修复。谢谢。同时,您可以使用

predict(mydiscretebam, type="terms",discrete=FALSE)

Simon(mgcv维护者)