การแสดงภาพเป็นเส้นโค้ง


18

โดยปกติแล้วหนังสือเรียนจะมีตัวอย่างที่ดีในเรื่องพื้นฐานของเส้นโค้งสม่ำเสมอเมื่ออธิบายหัวข้อ บางอย่างเช่นแถวของสามเหลี่ยมเล็ก ๆ สำหรับเส้นโค้งเชิงเส้นหรือแถวของ humps เล็ก ๆ สำหรับลูกบาศก์เส้นโค้ง

นี่คือตัวอย่างทั่วไป:

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

ฉันสงสัยว่าถ้ามีวิธีง่ายๆในการสร้างพล็อตของพื้นฐาน spline โดยใช้ฟังก์ชั่น R มาตรฐาน (เช่น bs หรือ ns) ฉันเดาว่ามีบางส่วนของเลขคณิตเมทริกซ์ง่าย ๆ รวมกับโปรแกรม R เล็กน้อยซึ่งจะพ่นพล็อตพื้นฐานของเส้นโค้งในลักษณะที่สง่างาม ฉันคิดไม่ออกเลย!

คำตอบ:


22

ลองสิ่งนี้เป็นตัวอย่างสำหรับ 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)

ให้สิ่งนี้:

ป้อนคำอธิบายรูปภาพที่นี่


4
มีประสิทธิภาพมากกว่าเล็กน้อยในการใช้matplotฟังก์ชันแทนที่จะวนลูปผ่านคอลัมน์
Greg Snow

ดังนั้นจึงเป็น (+1) ฉันไม่รู้ว่าทำไมฉันทิ้งมันลงจากชุดเครื่องมือทางจิตของฉัน
jbowman

9

ต่อไปนี้เป็นautoplotวิธีสำหรับคลาส "พื้นฐาน" (ซึ่งทั้ง bs และ 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)
}

สิ่งนี้ทำให้คุณสามารถเรียกautoplotใช้วัตถุ ns หรือ bs รับตัวอย่างของ jbowman:

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

ซึ่งผลิต:

เกณฑ์อัตโนมัติ

แก้ไข:นี้จะรวมอยู่ในรุ่นถัดไปของแพคเกจ ggfortify: https://github.com/sinhrks/ggfortify/pull/129 หลังจากนั้นฉันเชื่อว่าทุกสิ่งที่คุณต้องการคือ:

library(splines)
library(ggfortify)
x <- seq(0, 1, by=0.001)
spl <- bs(x,df=6)
autoplot(spl)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.