可视化样条曲线基础


18

教科书在解释主题时,通常会以漂亮的示例样条为基础,说明统一样条曲线的基础。像是线性样条线的一排小三角形,或者是三次样条线的一排小驼峰。

这是一个典型的例子:

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

我想知道是否有使用标准R函数(如bs或ns)生成样条曲线基础图的简便方法。我猜想有一个简单的矩阵算术与一个琐碎的R程序相结合,可以优雅地吐出漂亮的样条曲线图。我只是想不到!

Answers:


22

尝试以下操作,作为B样条曲线的示例:

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函数比遍历各列要有效得多。
格雷格·斯诺

所以是(+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)
}

这使您可以仅调用autoplotns或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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.