Seleccionar nudos para un GAM

9

Al seleccionar un número apropiado de nudos para un GAM, uno puede tener en cuenta el número de datos e incrementos en el eje x.

¿Qué pasa si tenemos 100 incrementos en el eje x con 1000 puntos de datos en cada incremento?

La información aquí dice:

Si no se suministran, los nudos de la spline se colocan de manera uniforme a lo largo de los valores covariables a los que se refiere el término: por ejemplo, si se ajustan 101 datos con una spline de 11 nudos de x, entonces habría un nudo cada 10 (ordenado) x valor

Entonces, ¿un comienzo básico debería ser de 9 nudos en este ejemplo? No estoy seguro de qué rango de nudos sería adecuado para este conjunto de datos, ya que es posible ajustar números muy pequeños a muy 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")

Si k = 25 proporcionó un ajuste útil, ¿sería razonable para estos datos?

usuario1320502
fuente

Respuestas:

12

Una opción mucho mejor es ajustar su modelo usando gam () en el paquete mgcv, que contiene un método llamado Validación cruzada generalizada (GCV). GCV elegirá automáticamente el número de nudos para su modelo para que la simplicidad se equilibre con el poder explicativo. Cuando use gam () en mgcv, active GCV configurando k para que sea igual a -1.

Solo así:

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 trazar su línea suave, tendrá que extraer el ajuste del modelo. Esto debería funcionar:

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

También puede ajustar k manualmente, y ver qué número de k lo acerca más al valor k establecido automáticamente por GCV.

Ira S
fuente
¿Qué hace el bs = "cs"término en la spline?
user321627
1
"cs" especifica que la base para el suavizado debe ser una spline cúbica.
Manuel Bickel
¿Especificar no es kequivalente a especificar k=-1?
Nakx
No estoy seguro de entender totalmente a Nakx, pero aclararé que k = -1 permitirá que el modelo determine un número óptimo de nodos utilizando Validación cruzada generalizada. El ajuste manual permitirá la comparación de cómo el modelo se ajusta a los cambios según el número de nodos. Eso puede ser perspicaz y puede ayudar a representar el fenómeno de interés.
Ira S
+1 ¡Gran respuesta! ¿Cómo visualizas cómo resultó la spline? Quiero decir, la gráfica de los coeficientes?
Erosennin
6

¿De dónde viene la idea de que GCV elegirá automáticamente el número de nudos? El número de nudos (es decir, la dimensión base) es fijo y no se puede cambiar durante el ajuste del modelo. Lo que el puntaje del GCV en la función gam () está haciendo "automáticamente" no es elegir la dimensión base k, como dice Ira S, sino elegir el nivel uniforme de cada spline básico al introducir una penalización de wigliness en el objetivo de minimización o ajuste. Para elegir la cantidad de nudos k debe usar un valor mayor que la cantidad de grados de libertad que espera. Citando la ayuda de choose.k: "la elección exacta de k no es generalmente crítica: debe elegirse para que sea lo suficientemente grande como para estar razonablemente seguro de tener suficientes grados de libertad para representar la 'verdad' subyacente razonablemente bien, pero lo suficientemente pequeña para mantener una eficiencia computacional razonable ". Entonces, básicamente aumente k en pasos grandes hasta que no vea cambios en su trama, por ejemplo. Resumiendo: No hay nada como una opción "automática" para k como dice Ira S, el usuario deberíasiempre elija un valor k como parte del diseño del modelo. De lo contrario, lo más probable es que no esté ajustando su modelo.

nukimov
fuente
Solo otra pregunta de aclaración. En el archivo de viñeta mgcv del paquete, dice que k es la dimensión de la base de las variables de las que la función suave es una función. Al usar bs = "cr", las splines de regresión cúbica, pensé que la dimensión de la base es 3. Es decir, k = 3 cuando bs = "cr", ¿estaba equivocado?
vtshen 01 de
Casi correcto pero no del todo. Lo que diga sería cierto si una spline consistiera en un solo polinomio de tercer grado, que es solo un caso especial de una spline. Una spline es una serie de polinomios concatenados (normalmente más de uno). Las estrías básicas utilizadas para construir las estrías de suavizado consisten en muchos polinomios que se unen en los nudos, cuantos más nudos tenga, más grados de libertad. Es por eso que k está intrínsecamente relacionado con el número de nudos, que se describe detalladamente en el libro de Simon Woods.
nukimov