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!

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


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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.