R中的样条拟合 - 如何强制传递两个数据点?

机器算法验证 r 平滑 样条
2022-03-16 05:02:05

我在 R 中使用“smooth.spline”。这是文档中的一个片段:

http://stat.ethz.ch/R-manual/R-patched/library/stats/html/smooth.spline.html

smooth.spline {stats} R 文档

拟合平滑样条描述 将三次平滑样条拟合到提供的数据。

使用 smooth.spline(x, y = NULL, w = NULL, df, spar = NULL, cv = FALSE, all.knots = FALSE, nknots = NULL, keep.data = TRUE, df.offset = 0, 惩罚 = 1 , control.spar = list(), tol = 1e-6 * IQR(x))


我的问题是:

我有两个数据向量 x 和 y,其中 x 的下限是 -100,x 的上限是 +100。

我知道对于 y=f(x):

f(-100)=-1

f(+100)=+1

也就是说,我希望通过三次样条程序强制通过下边界和上边界点。

因为这两点是准确的和精确的。

怎么做?

有人可以帮我吗?

非常感谢!

2个回答

smooth.spline()与在包中使用不同的是cob 包stats中有一个函数可以让您完全按照自己的意愿做事。COBS 代表约束 B 样条。可能的约束包括通过特定点、将导数设置为指定值、单调性(增加或减少)、凹度、凸度、周期性等。cobs()

在你的情况下,使用

cobs(x, y, pointwise=rbind(c(0,-100,-1),c(0,100,1)))

我想不出任何方法来使用smooth.spline. 如果您要使用样条基础,例如bssplines 包中的样条,那么您可以使用二次规划来约束端点,但计算约束可能会很复杂。

这是一种使用 xsplines 的方法(与其他类型的样条曲线不同但相似)和optim查找要使用的值的函数(nls也可以使用)。我选择了 3 个内部等距控制点和 1 的形状,但您可以使用这些来比较适合度:

x <- seq( -100, 100, length=101 )
y <- sin( x/200*pi ) + rnorm(101, 0, 0.15)

myfun <- function(par) {
    yh <- c(-1, par, 1)
    xh <- c(-100, -50, 0, 50, 100)
    sp <- xspline( xh,yh, shape=1, draw=FALSE)
    yhat <- approx( sp, xout=x )$y
    sum( (y-yhat)^2 )
}

out <- optim( c(-.5, 0, .5), myfun )

plot(x,y)
xspline( c(-100, -50, 0, 50, 100), c(-1, out$par, 1), shape=1,
        border='blue' )