Selecionando nós para um GAM

9

Ao selecionar um número apropriado de nós para um GAM, convém levar em consideração o número de dados e incrementos no eixo x.

E se tivermos 100 incrementos no eixo x com 1000 pontos de dados em cada incremento.

A informação aqui diz:

Se eles não forem fornecidos, os nós do spline serão colocados uniformemente nos valores covariáveis ​​aos quais o termo se refere: Por exemplo, se ajustar 101 dados com um spline de 11 nós de x, haveria um nó a cada 10 (pedido) valor x.

Então, um começo básico deve ser de 9 nós neste exemplo? Apenas não tenho certeza de qual faixa de nós seria adequada para esse conjunto de dados, pois é possível ajustar números muito pequenos a muito grandes.

set.seed(1)
dat <- data.frame(y = rnorm(10000), x = 100)

library(ggplot)
ggplot(dat, aes(x = x, y = y)) + 
              geom_point(size= 0.5) +                      
stat_smooth(method = "gam", 
            formula = y ~ s(x, bs = "cs"),k=9, col = "black")

Se k = 25 fornecesse um ajuste útil, seria razoável para esses dados?

user1320502
fonte

Respostas:

12

Uma opção muito melhor é ajustar seu modelo usando gam () no pacote mgcv, que contém um método chamado Validação Cruzada Generalizada (GCV). O GCV escolherá automaticamente o número de nós para o seu modelo, para que a simplicidade seja equilibrada em relação ao poder explicativo. Ao usar gam () em mgcv, ative o GCV configurando k como igual a -1.

Bem assim:

set.seed(1)
dat <- data.frame(y = rnorm(10000), x = rnorm(10000))

library(mgcv)
G1 <- gam(y ~ s(x, k = -1, bs = "cs"), data = dat)
summary(G1) # check the significance of your smooth term
gam.check(G1) # inspect your residuals to evaluate if the degree of smoothing is good

Para traçar sua linha suave, você precisará extrair o ajuste do modelo. Isso deve fazer o truque:

plot(y~x, data = dat, cex = .1)
G1pred <- predict(G1)
I1 <- order(dat$y)
lines(dat$x, G1pred)

Você também pode ajustar k manualmente e ver qual número de k o aproxima mais do valor k definido automaticamente pelo GCV.

Ira S
fonte
O que o bs = "cs"termo no spline faz?
user321627
1
"cs" especifica que a base para a suavização deve ser um spline cúbico.
Manuel Bickel
Especificar não é kequivalente a especificar k=-1?
Nakx
Não tenho certeza de entender totalmente o Nakx, mas vou esclarecer que k = -1 permitirá que o modelo determine um número ideal de nós usando a Validação Cruzada Generalizada. O ajuste manual permitirá a comparação de como o ajuste do modelo é alterado com base no número de nós. Isso pode ser esclarecedor e pode ajudar a representar o fenômeno de interesse.
Ira S
+1 Ótima resposta! Como você visualiza o resultado do spline? Quero dizer, o gráfico dos coeficientes?
Erosennin
5

De onde vem a ideia de que o GCV escolherá automaticamente o número de nós? O número de nós (ou seja, a dimensão base) é fixo e não pode ser alterado durante o ajuste do modelo. O que a pontuação do GCV na função gam () está fazendo "automaticamente" não é escolher a dimensão base k, como diz Ira S, mas sim escolher o nível suave de cada spline base, introduzindo uma penalidade de peruca no minimizador ou no objetivo de ajuste. Para escolher o número de nós k, você deve usar um valor maior que o número de graus de liberdade que espera. Citando a ajuda de choose.k: "a escolha exata de k geralmente não é crítica: deve ser escolhida para ser grande o suficiente para que você tenha razoavelmente certeza de ter graus de liberdade suficientes para representar a 'verdade' subjacente razoavelmente bem, mas pequena o suficiente manter razoável eficiência computacional ". Então, basicamente aumente k em grandes etapas até que você não veja alterações em seu gráfico, por exemplo. Resumindo: Não há nada como uma opção "automática" para k, como Ira S está dizendo, o usuário devesempre escolha um valor ak como parte do design do modelo. Caso contrário, você provavelmente está sub-ajustando seu modelo!

nukimov
fonte
apenas mais uma pergunta de esclarecimento. No arquivo de vinheta mgcv do pacote, ele diz que k é a dimensão da base de variáveis ​​das quais o smooth é uma função. Ao usar bs = "cr", a regressão cúbica splines, pensei que a dimensão da base é 3. Ou seja, k = 3 quando bs = "cr", eu estava errado?
Vtshen #
Quase certo, mas não exatamente. O que você diz seria verdadeiro se um spline consistisse em um único polinômio de terceiro grau, que é apenas um caso especial de um spline. Um spline é uma série de polinômios concatenados (normalmente mais de um). As splines de base usadas para construir as splines de suavização consistem em muitos polinômios que se juntam aos nós, quanto mais nós você tiver, mais graus de liberdade. É por isso que k está intrinsecamente relacionado ao número de nós, detalhados no livro de Simon Woods.
Nukimov 02/07/19