Visualizar una base de spline

18

Los libros de texto suelen tener buenas parcelas de base para splines uniformes cuando explican el tema. Algo así como una fila de pequeños triángulos para una spline lineal, o una fila de pequeñas jorobas para una spline cúbica.

Este es un ejemplo típico:

http://support.sas.com/documentation/cdl/en/statug/63033/HTML/default/viewer.htm#statug_introcom_a0000000525.htm

Me pregunto si hay una manera fácil de generar una gráfica de la base de spline usando funciones R estándar (como bs o ns). Supongo que hay una pieza simple de aritmética matricial combinada con un programa trivial R que escupirá una bonita parcela de spline de una manera elegante. ¡No puedo pensar en eso!

Patrick Caldon
fuente

Respuestas:

22

Pruebe esto, como un ejemplo para B-splines:

x <- seq(0, 1, by=0.001)
spl <- bs(x,df=6)
plot(spl[,1]~x, ylim=c(0,max(spl)), type='l', lwd=2, col=1, 
     xlab="Cubic B-spline basis", ylab="")
for (j in 2:ncol(spl)) lines(spl[,j]~x, lwd=2, col=j)

Dando esto:

ingrese la descripción de la imagen aquí

jbowman
fuente
44
Es un poco más eficiente usar la matplotfunción en lugar de recorrer las columnas.
Greg Snow
Entonces es (+1), no sé por qué lo saqué de mi kit de herramientas mentales.
jbowman
9

Aquí hay un autoplotmétodo para la clase "base" (de la cual heredan bs y ns):

library(ggplot2)
library(magrittr)
library(reshape2)
library(stringr)
autoplot.basis <- function(basis, n=1000) {
    all.knots <- sort(c(attr(basis,"Boundary.knots") ,attr(basis, "knots"))) %>%
        unname
    bounds <- range(all.knots)
    knot.values <- predict(basis, all.knots) %>%
        set_colnames(str_c("S", seq_len(ncol(.))))
    newx <- seq(bounds[1], bounds[2], length.out = n+1)
    interp.values <- predict(basis, newx) %>%
        set_colnames(str_c("S", seq_len(ncol(.))))
    knot.df <- data.frame(x=all.knots, knot.values) %>%
        melt(id.vars="x", variable.name="Spline", value.name="y")
    interp.df <- data.frame(x=newx, interp.values) %>%
        melt(id.vars="x", variable.name="Spline", value.name="y")
    ggplot(interp.df) +
        aes(x=x, y=y, color=Spline, group=Spline) +
        geom_line() +
        geom_point(data=knot.df) +
        scale_color_discrete(guide=FALSE)
}

Esto le permite invocar autoplotun objeto ns o bs. Tomando el ejemplo de jbowman:

library(splines)
x <- seq(0, 1, by=0.001)
spl <- bs(x,df=6)
autoplot(spl)

que produce:

Base de trazado automático

Editar: Esto se incluirá en la próxima versión del paquete ggfortify: https://github.com/sinhrks/ggfortify/pull/129 . Después de eso, creo que todo lo que necesitas es:

library(splines)
library(ggfortify)
x <- seq(0, 1, by=0.001)
spl <- bs(x,df=6)
autoplot(spl)
Ryan C. Thompson
fuente