在样条包中使用 BS 函数指定 B 样条拟合的自由度



我正在使用样条曲线包的 bs 函数来创建用于图形目的的 b 样条平滑曲线。(至少有一个报表表明 Excel 使用三阶 b 样条作为其平滑折线图,我希望能够复制这些曲线。我无法理解 bs 函数所需的参数。代表代码如下,改编自 bs 文档:

require(splines)
require(ggplot2)
n <- 10
x <- 1:10
y <- rnorm(n)
d <- data.frame(x=x, y=y)
summary(fm1 <- lm(y ~ bs(x, degree=3)), data=d)
x.spline <- seq(1, 10, length.out=n*10)
spline.data <- data.frame(x=x.spline, y=predict(fm1, data.frame(x=x.spline)))
ggplot(d, aes(x,y)) + geom_point + geom_line(aes(x,y), data=spline.data)

bs 文档中的示例代码在调用 bs 时指定 df=5,并且不指定度数。我不知道我有多少个自由度。我只知道我想要一个三阶b样条。我尝试过指定不同的 df 值,而不是度数,或者除了度数之外,我得到了截然不同的结果。这就是为什么我怀疑 df 的规范是这里的问题。在这种情况下,我将如何计算 df?

帮助文件建议 df = 长度(节(+ 度。如果我将内部点视为节点,则此示例的 df=11 会生成错误消息和无意义的样条拟合。

提前谢谢你。

我显然不清楚我的意图。我正在尝试这样做:我怎样才能将样条((与ggplot一起使用?,但与b样条一起使用。

你不应该试图适应每一个点。目标是找到一个可接受的适合但取决于有限数量的结的摘要。将多项式的次数增加到默认值 3 以上没有多大价值。只有10分,你肯定不希望df=11。尝试 df=5,结果应该相当平坦。rms/Hnisc 包作者 Frank Harrell 更喜欢受限三次样条曲线,因为极值的预测是线性的,因此不像其他多项式基那样狂野。

我纠正了几个拼写错误,并添加了一个knots参数来使您的代码正常工作:

require(splines)
require(ggplot2); set.seed(trunc(100000*pi))
n <- 10
x <- 1:10
y <- rnorm(n)
d <- data.frame(x=x, y=y)
summary(fm1 <- lm(y ~ bs(x, degree=3, knots=2)), data=d)
x.spline <- seq(1, 10, length.out=n*10)
spline.data <- data.frame(x=x.spline, y=predict(fm1, data.frame(x=x.spline)))
ggplot(d, aes(x,y)) + geom_point() + geom_line(aes(x,y), data=spline.data)

我放弃了改变随机种子的练习,认为弗兰克·哈雷尔知道他在说什么。在使用他的软件包时,我不会在极端情况下得到同样的行为。

我做了更多的工作,想出了以下内容。首先,道歉。我正在寻找的是平滑样条,而不是回归样条。我没有词汇来正确表达这个问题。虽然 bs(( 帮助文件中的示例似乎提供了这一点,但该函数并没有为我的示例数据提供相同的行为。stats 包中还有另一个函数 smooth.spline,它提供了我需要的东西。

set.seed(tunc(100000*pi))
n <- 10
x <- 1:n
xx <- seq(1, n, length.out=200)
y <- rnorm(n)
d <- data.frame(x=x, y=y)
spl <- smooth.spline(x,y, spar=0.1)
spline.data <- data.frame(y=predict(spl,xx))
ggplot(d,aes(x,y)) + geom_point() + geom_line(aes(x,y), spline.data)
spl2 <- smooth.spline(x, y, control=
            list(trace=TRUE, tol=1e-6, spar=0.1, low=-1.5, high=0.3))
spline.data2 <- data.frame(predit(spl2,xx))
ggplot(d,aes(x,y)) + geom_point() + geom_line(aes(x,y), spline.data2)

对 smooth.spline 的两个调用代表了两种方法。第一个手动指定平滑参数,第二个迭代到最佳解。我发现我必须正确约束优化才能获得我想要的解决方案类型。

结果旨在匹配 Excel 线图使用的 b 样条。我的协作者认为 Excel 图形是标准,我至少需要匹配该性能。

最新更新