我正在寻找一种使用样条插值数据的方法,但强制终点处的值和导数。这是我的数据:
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')
正如您所看到的,由于噪音,左侧的花键有一个略微向上的曲率(右侧有一个向下的曲率)。
当x = 0时,我想强制样条曲线的值为0,样条曲线的导数为0(水平)。到目前为止,我无法做到这一点。
我也尝试过使用Boundary.knots参数,但这对我没有帮助。
答案 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')
(via)