21 votos

Cómo ajustar el suavizado en el modelo GAM mgcv

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

Tengo una variable binomial que estoy tratando de modelar como una función principalmente de coordenadas x e y 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 sólo los valores (x,y).

Sin embargo, quiero intentar incorporar las demás variables al modelo, y parecía que los modelos aditivos generalizados (GAM) eran una buena posibilidad. Tras examinar los paquetes gam y mgcv, ambos con una función GAM, opté por este último, ya que varios comentarios en hilos de listas de correo parecen recomendarlo. Una desventaja es que no parece soportar un suavizador de regresión local como loess o locfit.

Para empezar, sólo quería tratar de replicar aproximadamente el modelo locfit, utilizando sólo (x,y) coordenadas. Lo intenté tanto con suavizados regulares como con suavizados de producto tensorial:

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, al trazar las predicciones del modelo, éstas están mucho más suavizadas en comparación con el modelo locfit. Así que he estado intentando ajustar el modelo para que no se suavice tanto. He intentado ajustar los parámetros sp y k, pero no me queda claro cómo afectan al suavizado. En locfit, el parámetro nn controla la amplitud de la vecindad utilizada, con valores más pequeños que permiten menos suavizado y más "ondulación", lo que ayuda a capturar algunas áreas de la cuadrícula donde la probabilidad de los resultados binomiales cambia rápidamente. ¿Cómo puedo configurar el modelo gam para que se comporte de forma similar?

29voto

David J. Sokol Puntos 1730

En k establece efectivamente la dimensionalidad de la matriz de suavizado para cada término. gam() utiliza una puntuación GCV o UBRE para seleccionar una cantidad óptima de suavizado, pero sólo puede funcionar dentro de la dimensionalidad de la matriz de suavizado. Por defecto, te() lisos tienen k = 5^2 para superficies 2D. No recuerdo para qué sirve s() así que comprueba 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 impuesto por el valor utilizado para k debe aumentar k y volver a ajustar el modelo para ver si se selecciona un modelo más complejo a partir de la matriz de suavizado de mayor dimensión.

Sin embargo, no sé cómo locfit funciona, pero es necesario tener algo que le impida ajustar una superficie demasiado compleja (GCV y UBRE, o (RE)ML si decide utilizarlos [no se puede ya que establece scale = -1 ], intentan hacer precisamente eso), eso no está respaldado por los datos. En otras palabras, podría ajustarse a características muy locales de los datos, pero ¿se está ajustando al ruido de la muestra de datos que ha recogido o se está ajustando a la media de la distribución de probabilidad? gam() mayo estar diciéndote algo sobre lo que puede estimarse a partir de sus datos, suponiendo que haya ordenado la dimensionalidad de la base (más arriba).

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

Véase ?smooth.terms y ?adaptive.smooth para ver qué se puede montar con gam() . te() puede combinar la mayoría de estos suavizadores, si no todos (consulte la documentación para saber cuáles pueden incluirse y cuáles no en los productos tensoriales), por lo que podría utilizar una base suavizadora adaptativa para intentar capturar la escala local más fina en las partes de los datos en las que la respuesta varía rápidamente.

Debo añadir que se puede hacer que R estime un modelo con un conjunto fijo de grados de libertad utilizados por un término suave, utilizando la función fx = TRUE argumento para s() y te() . Básicamente, establece k sea lo que quieras y fx = TRUE y gam() sólo ajustará un spline de regresión de grados de libertad fijos no un spline de regresión penalizado.

3voto

Michael Kniskern Puntos 7276

Hay varias opciones para hacer un gam menos movedizo:

  • Establecer el valor predeterminado s(..., k = 10) a un valor menor.
  • Establecer el valor predeterminado s(...,bs = 'tp') a ts .
  • Establecer gam(..., select = TRUE) .
  • Establecer el valor predeterminado gam(..., gamma = 1) a un valor mayor. Pruebe con valores entre 1 y 2.
  • Establecer el valor predeterminado s(..., m = 2) a m = 1 .
  • Establecer el valor predeterminado method = "GCV.Cp" a method = "REML" (sección 1.1; Madera, 2011 ).
  • Forzar curvas monotónicamente crecientes/ decrecientes. Véase scam y otras opciones.
  • Cambiar algunos de los predictores suavizados + s(X1) a términos lineales + X1 .
  • Utilizar menos predictores.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X