12 Smoothing Splines
12.1 Modelo simulado
Considere el siguiente conjunto de datos simulados a partir de un modelo del tipo
\[ y_i = f(x_i) + \varepsilon_i \hspace{2cm} i=1,...,n \]
Donde \(\varepsilon_i\) tiene una distribución normal \(\varepsilon_i \sim \mathrm{N} (0, \sigma^2)\)
- Intente aproximar una forma funcional adecuada para estos datos
- ¿Cuántas opciones tiene disponible?
- ¿Cómo saber si la elección es adecuada o no?
12.2 Agreguemos algo de información
Es muy difícil hacerse una idea de la forma funcional real solo con la gráfica anterior.
Suponga que \(\varepsilon_i\) tiene una distribución normal con media 0 y desviación 0.2.
Además, se muestra la función real en color azul.
- ¿Ahora sí?
- ¿es polinómica?, ¿es trigonométrica, exponencial?, ¿es racional?, ¿Es alguna combinación de funciones elementales?
- Está bien, sigue siendo difícil, miremos la ecuación de la función con la que se simularon los datos
12.3 Forma funcional
La función real a partir de la cual se simularon los datos tiene la forma
\[f(x) = \frac{\left( \cos(ae^{bx}) \right) ^2}{c\sqrt{x}+d}\]
Ahora sí está fácil, ¿o no?, tenemos la forma funcional. Solo debemos encontrar los valores de a, b, c y d.
¿Cómo estimamos los parámetros?
¿Mínimos cuadrados, máxima verosimilitud?
Hay una dificultad, el modelo planteado no es lineal en los parámetros, la función de mínimos cuadrados ya no tendrá esa forma sencilla que podíamos incluso resolver de forma matricial (¿se acuerdan de aquella solución elegante \(\hat{\boldsymbol{\beta}} = (\textbf{X}^T\textbf{X})^{-1}\textbf{X}^T\textbf{Y}\)?)
Ni qué hablar de máxima verosimilitud, de por sí ya es más complicado de manejar numéricamente que el método de mínimos cuadrados.
La forma real es: \[f(x) = \frac{\left( \cos(2.5e^{1.1x}) \right) ^2}{2.1\sqrt{x}+ e/\pi}\]
¡Tampoco estaba tan difícil!
12.3.1 Haga la simulación en su computador
library(tidyverse)
library(plotly)
set.seed(1005)
<- 500
n <- runif(n, 0, 1.5)
x <- function(x) (cos(2.5*exp(1.1*x))^2/(2.1*sqrt(x)+exp(1)/pi))
f <- rnorm(n, 0, 0.2)
error <- f(x) + error
y <- tibble(
datos x = x,
y = y
)<- datos |> ggplot(aes(x = x, y = y)) +
plot1 geom_point() +
geom_function(fun = f, color = "blue",
linewidth = 1)
ggplotly(plot1)
12.4 Métodos de regularización
12.4.1 Características
En la práctica, es muy difícil encontrar una forma funcional a priori adecuada para un modelo. Algunas veces contamos con suficiente evidencia empírica o teórica (por ejemplo, la popular función de Cobb Douglas para modelos econométricos) para respaldar nuestra elección, pero estos casos son más bien rarezas o los supuestos y simplificaciones son poco convenientes en algunos contextos.
Hemos visto algunas alternativas que intentan evitar esta difícil elección, como los regression splines. Sin embargo, seguimos en la necesidad de parametrizar nuestros modelos aunque ahora lo hagamos de manera más sencilla y en pequeños intervalos.
Los regression splines necesitan establecer un conjunto de knots para controlar la flexibilidad del modelo. Se puede abordar el problema de regresión desde un punto de vista más general, una familia de métodos no paramétricos. Los llamados modelos de regularización plantean problemas de optimización sobre espacios funcionales bastante generales y controlan la flexiblidad del modelo a través de penalizaciones
12.4.2 Planteamiento matemático
Matemáticamente, se puede escribir como
\[ \hat{f}(x) = \underset{f \in \mathcal{H}}{\arg \min} \left\{ \sum_{i=1}^{n} L(y_i, f(x_i)) + \lambda J(f) \right\} \]
Esto es un problema bastante general y podemos comentar algunas cosas sin entrar en el detalle matemático:
- \(\mathcal{H}\) Es un espacio funcional de infinitas dimensiones (entiéndase como un conjunto muy grande de funciones).
- \(L(y_i, f(x_i))\) es una función de pérdida y mide qué tan bien se ajusta la función estimada a los datos.
- \(J(f)\) Es una penalización funcional definida sobre el espacio \(\mathcal{H}\). Este término en el problema mide qué tan flexible es la función estimada.
- \(\lambda \geq0\) es el tuning parameter y es el que controla el trade-off entre sesgo y varianza del modelo. A medida que aumenta el valor de \(\lambda\) el sesgo aumenta y la varianza disminuye (¿por qué?)
- Cuando \(\lambda = 0\), la solución \(\hat{f}\) es cualquier función que interpole los datos. El espacio de funciones es tan grande que siempre podemos encontrar una función que haga cero la función objetivo (¿cómo se llama eso?)
12.5 Smoothing Spline
Un Smoothing Spline, es un caso particular del problema más general planteado anteriormente con las siguientes características:
- El espacio \(\mathcal{H}\) Es un espacio de funciones con segundas derivadas continuas y con norma finita, es decir, un espacio de Sobolev de orden 2 (piense en una función que no cumpla este requisito).
- La función de pérdida es la de mínimos cuadrados.
- El término de penalización está expresado en términos de la segunda derivada.
- Bajo estas condiciones, el problema de regularización se reduce a: \[ \hat{f}(x) = \underset{f \in \mathcal{H}}{\arg \min} \left\{ \sum_{i=1}^{n} \left( y_i - f(x_i) \right)^2 + \lambda \int (f''(t))^2dt \right\}\] Y es conocido como Smoothing Splines
12.5.1 ¿Cómo es la solución para un smoothing spline?
El problema sigue siendo bastante general, pero…
- Se puede hacer uso de algunas propiedades del espacio \(\mathcal{H}\). Resulta que es un espacio de Hilbert con Kernel reproducible. ¿Cómo así? 😪
- El kernel trick nos permite expresar la solución en términos de un número finito de bases (parámetros) ¡un resultado bastante impresionante!
- De esa manera ya podemos optimizar y encontrar nuestra \(\hat{f}\)
- Como siempre \(\lambda\) debe ser calibrado para ajustar la flexibilidad del modelo. Es posible hacerlo con CV
- ¿qué pasa si \(\lambda=0\)?
- ¿y si \(\lambda \to \infty\)?
12.5.2 Calibración
Como se mencionó, debemos controlar la flexibilidad de la estimación para evitar overfitting. En este caso, debemos encontrar el valor de \(\lambda\) que minimiza el MSE calculado con CV. Hay varios paquetes disponibles en R
para hacer la tarea. Usaremos gam
que viene de Generalized Additive Models 🥱
12.5.3 Un modelo muy flexible: \(\lambda = 0.1\)
# install.packages("gam")
library(gam)
<- 0.1
lambda <- gam(formula = y ~ s(x, spar = lambda), data = datos)
mod <- mod$fitted.values
y_pred <- plot1 + geom_line(aes(x = x, y = y_pred),
smooth1 color = "red", linewidth = 1)
ggplotly(smooth1)
12.5.4 Un modelo poco flexible: \(\lambda = 2\)
<- 2
lambda <- gam(formula = y ~ s(x, spar = lambda), data = datos)
mod <- mod$fitted.values
y_pred <- plot1 + geom_line(aes(x = x, y = y_pred),
smooth2 color = "red", linewidth = 1)
ggplotly(smooth2)
12.5.5 Un modelo calibrado (a ojo): \(\lambda = 0.7\)
<- 0.7
lambda <- gam(formula = y ~ s(x, spar = lambda), data = datos)
mod <- mod$fitted.values
y_pred <- plot1 + geom_line(aes(x = x, y = y_pred),
smooth3 color = "red", linewidth = 1)
ggplotly(smooth3)
Implemente una función que calibre el valor de la pelnalización a través de validación cruzada