Visualisierung einer Spline-Basis


17

Lehrbücher enthalten in der Regel schöne Beispieldiagramme der Basis für einheitliche Splines, wenn sie das Thema erläutern. So etwas wie eine Reihe kleiner Dreiecke für einen linearen Spline oder eine Reihe kleiner Höcker für einen kubischen Spline.

Dies ist ein typisches Beispiel:

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

Ich frage mich, ob es eine einfache Möglichkeit gibt, mit Standard-R-Funktionen (wie bs oder ns) ein Diagramm der Spline-Basis zu erstellen. Ich denke, es gibt ein einfaches Stück Matrixarithmetik in Kombination mit einem trivialen R-Programm, das auf elegante Weise hübsche Plots auf Spline-Basis ausspuckt. Daran kann ich einfach nicht denken!

Antworten:


22

Versuchen Sie dies als Beispiel für 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)

Geben Sie dies:

Bildbeschreibung hier eingeben


4
Es ist etwas effizienter, die matplotFunktion zu verwenden, als die Spalten zu durchlaufen.
Greg Snow

Es ist also (+1). Ich weiß nicht, warum ich es aus meinem mentalen Toolkit entfernt habe.
Bogenschütze

9

Hier ist eine autoplotMethode für die "Basis" -Klasse (von der sowohl bs als auch ns erben):

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)
}

Auf diese Weise können Sie nur autoplotein ns- oder bs-Objekt aufrufen . Nehmen wir das Beispiel von jbowman:

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

welche produziert:

Basis Autoplot

Bearbeiten: Dies wird in der nächsten Version des ggfortify-Pakets enthalten sein: https://github.com/sinhrks/ggfortify/pull/129 . Danach glaube ich, dass alles, was Sie brauchen sollten, ist:

library(splines)
library(ggfortify)
x <- seq(0, 1, by=0.001)
spl <- bs(x,df=6)
autoplot(spl)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.