在约束下使用样条回归

时间:2017-09-07 17:54:00

标签: r spline

我正在寻找一种使用样条插值数据的方法,但强制终点处的值和导数。这是我的数据:

library(tidyverse)
data <- tibble(x = 0:600, y = pnorm((-300:300)/100)+(runif(0:600)-0.5)/20)
# add noise
data$y[1] <- 0.35
data$y[2] <- 0.25
ggplot(data, aes(x = x, y = y)) + geom_point()

现在让我们用样条曲线

拟合这些数据
fit <- lm(formula = y ~ splines::ns(x, 5),
          data = data)
data$y_new <- predict.lm(fit)
ggplot(data, aes(x = x, y = y_new)) + geom_point(aes(y = y), alpha = 0.5) + 
geom_point(color = 'red')

enter image description here

正如您所看到的,由于噪音,左侧的花键有一个略微向上的曲率(右侧有一个向下的曲率)。

当x = 0时,我想强制样条曲线的值为0,样条曲线的导数为0(水平)。到目前为止,我无法做到这一点。

我也尝试过使用Boundary.knots参数,但这对我没有帮助。

1 个答案:

答案 0 :(得分:2)

这是一种方法

spline <- with(data, cobs::cobs(x, y, pointwise=rbind(c(0,min(x),0),c(0,max(x),1))))
data$y_new <- predict(spline, z = data$x)[,2]
ggplot(data, aes(x = x, y = y_new)) + 
  geom_point(aes(y = y), alpha = 0.5) + 
  geom_point(color = 'red')

enter image description here

via