Eu estive explorando várias ferramentas de previsão e constatei que os Modelos Aditivos Generalizados (GAMs) têm o maior potencial para essa finalidade. GAMs são ótimos! Eles permitem que modelos complexos sejam especificados de maneira muito sucinta. No entanto, essa mesma sucessão está me causando alguma confusão, especificamente no que diz respeito à forma como os GAMs concebem termos e covariáveis de interação.
Considere um exemplo de conjunto de dados (código reproduzível no final do post) no qual y
é uma função monotônica perturbada por alguns gaussianos, além de algum ruído:
O conjunto de dados possui algumas variáveis preditoras:
x
: O índice dos dados (1-100).w
: Um recurso secundário que marca as seções emy
que um gaussiano está presente.w
possui valores de 1 a 20,x
entre 11 e 30 e 51 a 70. Caso contrário,w
é 0.w2
:w + 1
, para que não haja 0 valores.
O mgcv
pacote de R facilita a especificação de vários modelos possíveis para esses dados:
Os modelos 1 e 2 são bastante intuitivos. Prever y
apenas a partir do valor do índice na x
suavidade padrão produz algo vagamente correto, mas suave demais. Prever y
apenas a partir de w
resultados em um modelo do "gaussiano médio" presente em y
, e nenhuma "conscientização" dos outros pontos de dados, todos com o w
valor 0.
O modelo 3 usa ambos x
e w
como 1D suaviza, produzindo um bom ajuste. O modelo 4 usa x
e w
em um 2D suave, também dando um bom ajuste. Esses dois modelos são muito semelhantes, embora não sejam idênticos.
Modelo 5 modelos x
"por" w
. O modelo 6 faz o oposto. mgcv
A documentação de 'afirma que "o argumento by garante que a função suave seja multiplicada por [a covariável fornecida no argumento' by ']". Os modelos 5 e 6 não deveriam ser equivalentes?
Os modelos 7 e 8 usam um dos preditores como um termo linear. Isso faz sentido para mim, pois eles estão simplesmente fazendo o que um GLM faria com esses preditores e adicionando o efeito ao restante do modelo.
Por fim, o Modelo 9 é igual ao Modelo 5, exceto que x
é suavizado "por" w2
(que é w + 1
). O que é estranho para mim aqui é que a ausência de zeros w2
produz um efeito notavelmente diferente na interação "por".
Então, minhas perguntas são estas:
- Qual é a diferença entre as especificações nos modelos 3 e 4? Existe algum outro exemplo que destacaria a diferença mais claramente?
- O que exatamente "está" fazendo aqui? Muito do que li no livro de Wood e neste site sugere que "by" produz um efeito multiplicativo, mas estou tendo problemas para entender a intuição.
- Por que haveria uma diferença tão notável entre os modelos 5 e 9?
Reprex segue, escrito em 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)