Hình dung một cơ sở spline


17

Sách giáo khoa thường có các ví dụ điển hình về cơ sở cho các spline thống nhất khi họ đang giải thích chủ đề. Một cái gì đó giống như một hàng các hình tam giác nhỏ cho một spline tuyến tính, hoặc một hàng các bướu nhỏ cho một spline hình khối.

Đây là một ví dụ điển hình:

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

Tôi tự hỏi liệu có một cách dễ dàng để tạo ra một âm mưu của cơ sở spline bằng cách sử dụng các hàm R tiêu chuẩn (như bs hoặc ns). Tôi đoán có một số phép tính số học ma trận đơn giản kết hợp với chương trình R tầm thường sẽ tạo ra một lô khá đẹp của cơ sở spline một cách tao nhã. Tôi không thể nghĩ về nó!

Câu trả lời:


22

Hãy thử điều này, làm ví dụ cho 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)

Đưa ra điều này:

nhập mô tả hình ảnh ở đây


4
Sẽ hiệu quả hơn một chút khi sử dụng matplothàm thay vì lặp qua các cột.
Greg Snow

Vì vậy, nó là (+1), tôi không biết tại sao tôi lại bỏ nó khỏi bộ công cụ tinh thần của mình.
jbowman

9

Đây là một autoplotphương thức cho lớp "cơ sở" (mà cả bs và ns đều thừa hưởng từ):

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

Điều này cho phép bạn chỉ cần gọi autoplotmột đối tượng ns hoặc bs. Lấy ví dụ của jbowman:

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

sản xuất:

Cơ sở tự động

Chỉnh sửa: Điều này sẽ được bao gồm trong phiên bản tiếp theo của gói ggfortify: https://github.com/sinhrks/ggfortify/pull/129 . Sau đó, tôi tin rằng tất cả những gì bạn cần là:

library(splines)
library(ggfortify)
x <- seq(0, 1, by=0.001)
spl <- bs(x,df=6)
autoplot(spl)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.