如何使用 R 生成零度 B 样条曲线

How to generate B-spline of degree zero using R

我目前正在使用包 splines 中的 R 函数 bs 来处理 B 样条曲线,作为一个图形示例,我想提供一个图表来显示具有不同的样条曲线集之间的差异度数。

问题是 bs 只支持大于 0 的度数。 零度样条曲线只不过是节点定义的给定区域的指示函数,但我真的不知道如何生成它。 这是我到目前为止所做的

x<-seq(0,1,length.out =1000)
    par(mfrow=c(3,1))
    B1<-bs(x,knots = seq(0,1,length.out = 11)[-c(1,11)],Boundary.knots = c(0,1),intercept = T,degree = 1)
    matplot(x,B1,type="l",lty=1,ylim = c(-0.1,1.2),xlab = "",ylab = "")
    abline(v=seq(0,1,length.out = 11),lty=2)
    legend("top", legend ="B-splines of order 2")

    B2<-bs(x,knots = seq(0,1,length.out = 11)[-c(1,11)],Boundary.knots = c(0,1),intercept = T,degree = 2)
    matplot(x,B2,type="l",lty=1,ylim = c(-0.1,1.2),xlab = "",ylab = "")
    abline(v=seq(0,1,length.out = 11),lty=2)
    legend("top", legend ="B-splines of order 3")

    B3<-bs(x,knots = seq(0,1,length.out = 11)[-c(1,11)],Boundary.knots = c(0,1),intercept = T,degree = 3)
    matplot(x,B3,type="l",lty=1,ylim = c(-0.1,1.2),xlab = "",ylab = "")
    abline(v=seq(0,1,length.out = 11),lty=2)
    legend("top", legend ="B-splines of order 4")

这张取自 Hastie et.al (2017) 的图片基本上是我所缺少的。

提前致谢

正如我从评论中了解到的那样,您想要一个函数,它给定一个输入向量 x 个 n 点 returns 一系列 n-1 "splines";其中 ith 样条被定义为在其他地方 x[i] < x < x[i+1]0 范围内具有值 1

我们可以这样做:

x <- seq(0,1,length.out =10)

zero_spline = function(x, xout, n=1000) {
  if (missing(xout)) xout = seq(min(x), max(x), length.out = n)
  zs = data.frame()
  y = numeric(length(xout))
  for (i in 1:(length(x)-1L)) {
    yi = y
    yi[(xout > x[i]) & (xout < x[i+1])] = 1
    zs = rbind(zs, data.frame(xout, yi, interval=i))
  }
  zs
}

zs = zero_spline(x, n=100) 

library(ggplot2)
ggplot(zs, aes(xout, yi, color=factor(interval))) +
  geom_line()