使用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"))
我期望结果会有所不同,因为使用了两种不同的优化算法,但是令我惊讶的是,在第三个预测调用中甚至没有报告交互作用。在这种情况下,模型估计值不是项的总和。为什么要删除拦截器?这还负责删除交互吗?摘要中提供了这些系数,与其他任何参数系数一样,所以排除它们是偶然的吗?
据我所知,我实际上只是在更改优化算法。某些列来自交互的事实似乎无关紧要。
答案 0 :(得分:1)
这是predict.gam中的一个错误(由predict.bam的离散版本调用以执行参数项)。已为下一个版本修复。谢谢。同时,您可以使用
predict(mydiscretebam, type="terms",discrete=FALSE)
Simon(mgcv维护者)