教科书在解释该主题时通常有很好的均匀样条曲线基础示例图。类似于线性样条曲线的一排小三角形,三次样条曲线的一排小驼峰。
这是一个典型的例子:
我想知道是否有一种简单的方法可以使用标准 R 函数(如 bs 或 ns)生成样条基图。我想有一些简单的矩阵算术与一个简单的 R 程序相结合,它将以一种优雅的方式吐出一个漂亮的样条基础图。我就是想不出来!
教科书在解释该主题时通常有很好的均匀样条曲线基础示例图。类似于线性样条曲线的一排小三角形,三次样条曲线的一排小驼峰。
这是一个典型的例子:
我想知道是否有一种简单的方法可以使用标准 R 函数(如 bs 或 ns)生成样条基图。我想有一些简单的矩阵算术与一个简单的 R 程序相结合,它将以一种优雅的方式吐出一个漂亮的样条基础图。我就是想不出来!
试试这个,作为 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)
给出这个:
这是“基础”类的一个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)