Como ajustar a suavização no modelo mgcv GAM

14

Estou tentando descobrir como controlar os parâmetros de suavização em um modelo mgcv: gam.

Eu tenho uma variável binomial que estou tentando modelar principalmente como uma função das coordenadas xey em uma grade fixa, além de outras variáveis ​​com influências menores. No passado, eu construí um modelo de regressão local razoavelmente bom usando o pacote locfit e apenas os valores (x, y).

No entanto, quero tentar incorporar as outras variáveis ​​no modelo, e parecia que os modelos aditivos generalizados (GAM) eram uma boa possibilidade. Depois de analisar os pacotes gam e mgcv, ambos com uma função GAM, optei pelo último, pois vários comentários nos tópicos da lista de discussão parecem recomendá-lo. Uma desvantagem é que ele não parece suportar uma regressão local mais suave como loess ou locfit.

Para começar, eu só queria tentar replicar aproximadamente o modelo locfit, usando apenas coordenadas (x, y). Tentei com produtos regulares e tensores:

my.gam.te <- gam(z ~ te(x, y), family=binomial(logit), data=my.data, scale = -1)

my.gam.s  <- gam(z ~  s(x, y), family=binomial(logit), data=my.data, scale = -1)

No entanto, plotando as previsões do modelo, elas são muito mais suavizadas em comparação com o modelo locfit. Então, eu tenho tentado ajustar o modelo para não exagerar tanto. Tentei ajustar os parâmetros sp e k, mas não está claro para mim como eles afetam a suavização. No locfit, o parâmetro nn controla a extensão da vizinhança usada, com valores menores permitindo menos suavização e mais "oscilação", o que ajuda a capturar algumas áreas da grade nas quais a probabilidade de resultados binomiais muda rapidamente. Como eu configuraria o modelo gam para permitir que ele se comporte da mesma forma?

coronel triq
fonte

Respostas:

22

O kargumento efetivamente configura a dimensionalidade da matriz de suavização para cada termo. gam()está usando uma pontuação GCV ou UBRE para selecionar uma quantidade ideal de suavidade, mas só pode funcionar dentro da dimensionalidade da matriz de suavização. Por padrão, os te()suaves têm k = 5^2superfícies 2D. Eu esqueço para que serve, s()então verifique os documentos. O conselho atual de Simon Wood, autor do mgcv , é que, se o grau de suavidade selecionado pelo modelo estiver no ou próximo do limite da dimensionalidade imposta pelo valor usado k, você deverá aumentar ke reequipar o modelo para verificar se Um modelo mais complexo é selecionado a partir da matriz de suavização dimensional mais alta.

No entanto, eu não sei como o locfit funciona, mas você precisa ter algo que o impeça de aplicar uma superfície muito complexa (GCV e UBRE, ou (RE) ML, se você optar por usá-las [você não pode como você set scale = -1], estão tentando fazer exatamente isso), que não é suportado pelos dados. Em outras palavras, você pode ajustar características muito locais dos dados, mas está ajustando o ruído na amostra de dados coletados ou a média da distribuição de probabilidade? gam() pode estar lhe dizendo algo sobre o que pode ser estimado a partir de seus dados, supondo que você tenha classificado a dimensionalidade básica (acima).

Outra coisa a observar é que os smoothers que você está usando no momento são globais no sentido de que a suavidade selecionada é aplicada em toda a faixa de suavidade. As pessoas adaptáveis ​​podem gastar a "margem" de suavidade alocada em partes dos dados em que a resposta está mudando rapidamente. gam()possui recursos para usar adaptadores adaptáveis.

Veja ?smooth.termse ?adaptive.smoothveja o que pode ser montado usando gam(). te()você pode combinar a maioria, se não todos, esses smoothers (verifique os documentos que podem e não podem ser incluídos nos produtos tensores) para que você possa usar uma base mais suave e adaptativa para tentar capturar a escala local mais fina nas partes dos dados em que o resposta está variando rapidamente.

Devo acrescentar que você pode obter R para estimar um modelo com um conjunto fixo de graus de liberdade usado por um termo suave, usando o fx = TRUEargumento para s()e te(). Basicamente, conjunto k ser o que você quer e fx = TRUEe gam()só vai caber uma ranhura de regressão de graus fixos de liberdade não uma spline regressão penalizado.

Restabelecer Monica - G. Simpson
fonte
Muito obrigado, Gavin, por uma resposta tão detalhada. Eu perdi completamente os smoothers adaptáveis ​​e os experimentarei. Entendo a preocupação com o sobreajuste, mas o que eu vinha fazendo com o gam até agora não mostrava recursos nos dados que existem por meio de conhecimentos no domínio.
coronel triq