19 votos

Visualización de una base spline

Los libros de texto suelen tener bonitos gráficos de ejemplo de la base de los splines uniformes cuando explican el tema. Algo así como una fila de pequeños triángulos para un spline lineal, o una fila de pequeñas jorobas para un spline cúbico.

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 un gráfico de la base del spline utilizando funciones estándar de R (como bs o ns). Supongo que hay alguna pieza simple de aritmética matricial combinada con un programa trivial de R que escupirá un bonito gráfico de una base spline de una manera elegante. Pero no se me ocurre.

23voto

bheklilr Puntos 113

Prueba esto, como ejemplo para las 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:

enter image description here

4 votos

Es un poco más eficiente utilizar el matplot en lugar de hacer un bucle a través de las columnas.

0 votos

Así es (+1), no sé por qué lo he eliminado de mi caja de herramientas mental.

10voto

Tim Koscielski Puntos 409

Aquí hay un autoplot método para la clase "base" (de la que heredan tanto bs como 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 simplemente llamar a autoplot en un 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:

Basis autoplot

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 debería necesitar es:

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

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