Splines

Os splines ajustam curvas suaves aos dados unindo polinômios por partes em locais chamados nós. Eles superam a rigidez global da regressão polinomial, evitando ao mesmo tempo a aspereza dos ajustes lineares por partes. Splines são os blocos de construção dos GAMs e são usados em todos os lugares: de curvas dose-resposta a modelos de crescimento e regressão flexível.

Por que não usar simplesmente um polinômio de grau alto?

Um polinômio global de grau \(d\) ajustado a \(n\) pontos tem apenas um conjunto de coeficientes para toda a faixa de \(x\). Polinômios de grau alto oscilam violentamente nas bordas (fenômeno de Runge) e são sensíveis a qualquer observação isolada. Os splines resolvem isso ajustando polinômios de grau baixo (geralmente cúbicos) em subintervalos, unidos suavemente em nós.

O resultado: flexibilidade local sem instabilidade global.

Splines de regressão

Um spline de regressão com \(K\) nós \(\xi_1 < \xi_2 < \cdots < \xi_K\) ajusta um polinômio separado em cada intervalo \((-\infty, \xi_1)\), \([\xi_1, \xi_2)\), …, \([\xi_K, +\infty)\), com restrições de continuidade em cada nó.

Um spline cúbico exige continuidade da função e de suas primeira e segunda derivadas em cada nó. Isso dá \(K+4\) parâmetros livres (4 para o cúbico base, \(K\) termos de salto adicionais). A representação em base usa funções de potência truncadas:

\[h(x, \xi) = (x - \xi)_+^3 = \begin{cases}(x-\xi)^3 & x > \xi \\ 0 & x \leq \xi\end{cases}\]

O spline é: \[f(x) = \beta_0 + \beta_1 x + \beta_2 x^2 + \beta_3 x^3 + \sum_{k=1}^K \gamma_k h(x, \xi_k)\]

Esse é um modelo linear nas funções de base: o MQO se aplica diretamente.

Spline cúbico natural: adiciona a restrição de que a função é linear além dos nós de fronteira (\(f'' = 0\) para \(x < \xi_1\) e \(x > \xi_K\)). Isso reduz a variância na fronteira ao custo de um pequeno viés, e geralmente é recomendado em vez do spline cúbico sem restrição.

Três painéis comparando regressão polinomial, splines de regressão e splines cúbicos naturais no mesmo conjunto de dados

Splines de suavização

Em vez de escolher um conjunto fixo de nós, um spline de suavização coloca um nó em cada \(x_i\) observado e penaliza a aspereza:

\[\min_{f} \sum_{i=1}^n (y_i - f(x_i))^2 + \lambda \int [f''(x)]^2 dx\]

A penalidade \(\lambda \int [f'']^2 dx\) desencoraja um \(f\) ondulado. A solução é sempre um spline cúbico natural com nós em cada \(x_i\), independentemente de \(\lambda\).

  • \(\lambda = 0\): interpola cada ponto (aspereza máxima, gl = \(n\)).
  • \(\lambda \to \infty\): aproxima-se de uma linha reta (aspereza mínima, gl = 2).
  • \(\lambda\) ótimo: escolhido por validação cruzada deixando um de fora ou validação cruzada generalizada (GCV), que minimiza o erro de previsão em pontos retidos.

Os graus de liberdade efetivos \(\text{gl}_\lambda\) diminuem de \(n\) para 2 conforme \(\lambda\) aumenta, fornecendo uma medida interpretável de complexidade.

Splines de suavização com três valores de lambda mostrando o efeito do parâmetro de suavização

Posicionamento de nós para splines de regressão

O número e a localização dos nós são a decisão-chave de modelagem:

  • Nós fixos nos quantis: coloque \(K\) nós em quantis igualmente espaçados de \(x\). Concentra os nós onde os dados são densos. O padrão mais comum.
  • Validação cruzada: ajuste o modelo para vários valores de \(K\) e escolha o que minimiza o erro de validação cruzada.
  • Seleção adaptativa de nós: métodos como o MARS (Multivariate Adaptive Regression Splines) buscam automaticamente as melhores localizações dos nós.

Como regra geral para splines de regressão: 3-5 nós nos quantis costuma ser suficiente para a maioria das aplicações. Mais nós nem sempre ajudam e aumentam o risco de overfitting.

⚠️ A extrapolação além dos nós de fronteira é pouco confiável

Splines de regressão se comportam bem dentro do intervalo dos dados, mas extrapolam mal fora dos nós de fronteira, em que o modelo não tem restrição. Splines cúbicos naturais são lineares além das fronteiras, o que é um padrão razoável. Splines cúbicos padrão podem se curvar abruptamente fora do intervalo dos dados.

Nunca use um spline para previsões fora da amostra além do intervalo observado de \(x\) sem inspecionar cuidadosamente o comportamento na fronteira.

Conexão com os GAMs

Um Modelo Aditivo Generalizado (GAM) estende a regressão logística e linear substituindo cada termo linear \(\beta_j x_j\) por uma função suave \(f_j(x_j)\):

\[g(E[y]) = \beta_0 + f_1(x_1) + f_2(x_2) + \cdots + f_k(x_k)\]

Cada \(f_j\) é tipicamente um spline de suavização ou um spline de regressão. Os splines são os blocos de construção que tornam os GAMs flexíveis: sem eles, os GAMs se reduzem a GLMs padrão.

💡 Splines em R

library(splines)

# Regression spline with bs() - B-spline basis
fit_bs <- lm(y ~ bs(x, knots=c(0.25, 0.5, 0.75), degree=3))

# Natural cubic spline with ns()
fit_ns <- lm(y ~ ns(x, df=5))        # df controls knot number
fit_ns <- lm(y ~ ns(x, knots=c(0.33, 0.67)))  # explicit knots

# Smoothing spline
fit_ss <- smooth.spline(x, y, cv=TRUE)  # cv=TRUE selects lambda by LOO-CV
plot(fit_ss)

# GAM with penalized splines (mgcv)
library(mgcv)
fit_gam <- gam(y ~ s(x1) + s(x2), data=df)
plot(fit_gam)  # shows each smooth component