我一直在探索许多用于预测的工具,并且发现广义可加模型(GAM)具有最大的潜力。GAM非常棒!它们允许非常简洁地指定复杂的模型。但是,同样的简洁性使我有些困惑,特别是在GAM如何理解交互作用项和协变量方面。
考虑一个示例数据集(发布后的代码可重现),其中y
是一个由几个高斯扰动的单调函数,外加一些噪声:
数据集具有一些预测变量:
x
:数据索引(1-100)。w
:辅助功能标记出y
存在高斯的部分。w
的值为1-20,其中x
介于11到30之间,以及51到70之间。否则w
为0。w2
:w + 1
,因此没有0值。
R的mgcv
软件包可轻松为这些数据指定许多可能的模型:
模型1和2非常直观。默认情况下,y
仅根据索引值进行x
平滑度预测会产生一些模糊正确的提示,但过于平滑。y
仅根据w
结果预测存在于的“平均高斯”模型中y
,而没有其他w
值的“感知”模型,所有其他数据点的值均为0。
模型3同时使用x
和w
作为1D平滑,产生了很好的拟合。模型4使用x
并w
在2D平滑中使用,也非常适合。这两个模型非常相似,尽管不完全相同。
模型5 x
通过“ 模型” w
。模型6则相反。mgcv
的文档指出,“ by参数可确保平滑函数乘以[by参数中给定的协变量]”。那么5和6型不应该等效吗?
模型7和8使用预测变量之一作为线性项。这些对我来说很直观,因为它们只是在使用GLM对这些预测变量进行处理,然后将影响添加到模型的其余部分。
最后,模型9与模型5相同,除了模型x
“通过” w2
(为w + 1
)进行了平滑处理。对我而言,奇怪的是,w2
“ by”交互中缺少零会产生明显不同的效果。
所以,我的问题是:
- 3型和4型的规格之间有何区别?还有其他例子可以更清楚地说明差异吗?
- 确切地说,“通过”在这里做什么?我在伍德的书中读到的大部分内容以及该网站的内容都表明“ by”会产生乘法效应,但是我很难理解它的直觉。
- 为什么模型5和9之间会有如此显着的差异?
接下来是Reprex,用R编写。
library(magrittr)
library(tidyverse)
library(mgcv)
set.seed(1222)
data.ex <- tibble(
x = 1:100,
w = c(rep(0, 10), 1:20, rep(0, 20), 1:20, rep(0, 30)),
w2 = w + 1,
y = dnorm(x, mean = rep(c(20, 60), each = 50), sd = 3) + (seq(0, 1, length = 100)^2) / 2 + rnorm(100, sd = 0.01)
)
models <- tibble(
model = 1:9,
formula = c('y ~ s(x)', 'y ~ s(w)', 'y ~ s(x) + s(w)', 'y ~ s(x, w)', 'y ~ s(x, by = w)', 'y ~ s(w, by = x)', 'y ~ x + s(w)', 'y ~ w + s(x)', 'y ~ s(x, by = w2)'),
gam = map(formula, function(x) gam(as.formula(x), data = data.ex)),
data.to.plot = map(gam, function(x) cbind(data.ex, predicted = predict(x)))
)
plot.models <- unnest(models, data.to.plot) %>%
mutate(facet = sprintf('%i: %s', model, formula)) %>%
ggplot(data = ., aes(x = x, y = y)) +
geom_point() +
geom_line(aes(y = predicted), color = 'red') +
facet_wrap(facets = ~facet)
print(plot.models)