Memvisualisasikan basis spline

18

Buku teks biasanya memiliki contoh plot yang bagus dari dasar untuk splines seragam ketika mereka menjelaskan topik tersebut. Sesuatu seperti deretan segitiga kecil untuk spline linier, atau deretan punuk kecil untuk spline kubik.

Ini adalah contoh khas:

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

Saya bertanya-tanya apakah ada cara mudah untuk menghasilkan plot basis spline menggunakan fungsi R standar (seperti bs atau ns). Saya kira ada beberapa bagian sederhana dari aritmatika matriks dikombinasikan dengan program R sepele yang akan memuntahkan plot yang cukup dari basis spline dengan cara yang elegan. Aku hanya tidak bisa memikirkannya!

Patrick Caldon
sumber

Jawaban:

22

Coba ini, sebagai contoh untuk 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)

Memberi ini:

masukkan deskripsi gambar di sini

Jbowman
sumber
4
Ini sedikit lebih efisien untuk menggunakan matplotfungsi daripada perulangan melalui kolom.
Greg Snow
Jadi (+1), saya tidak tahu mengapa saya menjatuhkannya dari perangkat mental saya.
jbowman
9

Berikut adalah autoplotmetode untuk kelas "dasar" (yang diwarisi oleh bs dan 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)
}

Ini memungkinkan Anda memanggil objek autoplotns atau bs. Mengambil contoh jbowman:

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

yang menghasilkan:

Dasar autoplot

Sunting: Ini akan disertakan dalam versi selanjutnya dari paket ggfortify: https://github.com/sinhrks/ggfortify/pull/129 . Setelah itu, saya percaya semua yang Anda butuhkan adalah:

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