Cómo ajustar el suavizado en el modelo mgcv GAM


14

Estoy tratando de descubrir cómo controlar los parámetros de suavizado en un modelo mgcv: gam.

Tengo una variable binomial que intento modelar principalmente como una función de las coordenadas xey en una cuadrícula fija, además de algunas otras variables con influencias menores. En el pasado, he construido un modelo de regresión local razonablemente bueno utilizando el paquete locfit y solo los valores (x, y).

Sin embargo, quiero intentar incorporar las otras variables en el modelo, y parecía que los modelos aditivos generalizados (GAM) eran una buena posibilidad. Después de mirar los paquetes gam y mgcv, los cuales tienen una función GAM, opté por el último ya que una serie de comentarios en los hilos de la lista de correo parecen recomendarlo. Una desventaja es que no parece soportar una regresión local más suave como loess o locfit.

Para comenzar, solo quería intentar replicar aproximadamente el modelo locfit, usando solo coordenadas (x, y). Probé con suavidades de producto tanto regulares como tensoras:

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)

Sin embargo, trazando las predicciones del modelo, son mucho más suaves en comparación con el modelo locfit. Así que he estado tratando de ajustar el modelo para que no sea demasiado suave. He intentado ajustar los parámetros sp y k, pero no me queda claro cómo afectan el suavizado. En locfit, el parámetro nn controla la duración del vecindario utilizado, con valores más pequeños que permiten menos suavizado y más "meneo", lo que ayuda a capturar algunas áreas en la cuadrícula donde la probabilidad de los resultados binomiales cambia rápidamente. ¿Cómo haría para configurar el modelo gam para permitir que se comporte de manera similar?

Respuestas:


22

El kargumento establece efectivamente la dimensionalidad de la matriz de suavizado para cada término. gam()está usando un puntaje GCV o UBRE para seleccionar una cantidad óptima de suavidad, pero solo puede funcionar dentro de la dimensionalidad de la matriz de suavizado. Por defecto, los te()suavizados tienen k = 5^2para superficies 2D. Olvidé para qué sirve, s()así que revise los documentos. El consejo actual de Simon Wood, autor de mgcv , es que si el grado de suavidad seleccionado por el modelo está en o cerca del límite de la dimensionalidad impuesta por el valor utilizado k, debe aumentar ky ajustar el modelo para ver si El modelo más complejo se selecciona de la matriz de suavizado dimensional superior.

Sin embargo, no sé cómo funciona locfit , pero necesitas tener algo que te impida ajustar una superficie demasiado compleja (GCV y UBRE, o (RE) ML si eliges usarlos [no puedes como tú set scale = -1], están tratando de hacer eso), eso no es compatible con los datos. En otras palabras, podría ajustar características muy locales de los datos, pero ¿está ajustando el ruido en la muestra de datos que recopiló o está ajustando la media de la distribución de probabilidad? gam() puede estar diciéndole algo sobre lo que se puede estimar a partir de sus datos, suponiendo que haya resuelto la dimensionalidad básica (arriba).

Otra cosa a tener en cuenta es que los suavizadores que está utilizando actualmente son globales en el sentido de que la suavidad seleccionada se aplica en todo el rango del suavizado. Los suavizadores adaptativos pueden gastar la "asignación" de suavidad asignada en partes de los datos donde la respuesta está cambiando rápidamente. gam()tiene capacidades para usar suavizadores adaptativos.

Vea ?smooth.termsy ?adaptive.smoothpara ver qué se puede instalar usando gam(). te()puede combinar la mayoría de estos suavizadores, si no todos (verifique los documentos para los que se pueden y no se pueden incluir en los productos tensoriales) para que pueda utilizar una base de suavizado adaptativo para tratar de capturar la escala local más fina en las partes de los datos donde La respuesta varía rápidamente.

Debo añadir, que se puede obtener R para estimar un modelo con un conjunto fijo de grados de libertad utilizados por un término suave, utilizando el fx = TRUEargumento de s()y te(). Básicamente, establezca k para que sea lo que quiere fx = TRUEyygam() sólo va a adaptarse a una spline regresión de grados fijos de la libertad no es una regresión spline penalizado.


Muchas gracias, Gavin, por una respuesta tan detallada. Eché de menos a los suavizadores adaptativos y los intentaré. Entiendo la preocupación por el sobreajuste, pero lo que había estado haciendo con gam hasta ahora no era mostrar características en los datos que se sabe que están allí a través de la experiencia en el dominio.
coronel triq
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.