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!

Patrick Caldon
quelle

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

Bogenschütze
quelle
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)
Ryan C. Thompson
quelle