【问题标题】:Regression with spline under constraints约束下的样条回归
【发布时间】:2017-09-07 17:54:00
【问题描述】:

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

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 参数,但这对我也没有帮助。

【问题讨论】:

    标签: r spline


    【解决方案1】:

    这是一种方法

    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)

    【讨论】:

    • 这并不能完全解决问题的衍生部分,但显然这也可以用 cobs
    • @takje Hm 也强制第二个 x 值的预测为零?
    • 这可能会导致极值插值,或者我错了。它仍然可以在 x1 和 x2 之间做任何想做的事情。它不一定是一条直线。
    • 不幸的是,cob 样条曲线只运行到第二个订单。您可以使用 pointwise = c(2,xi,yi) 修复它们的一阶导数,其中 2 表示它是二阶,xi 是您要修复导数的点的 x 值,yi 是值的导数。感谢您的回答,但不幸的是它并没有完全回答我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 2017-02-26
    • 1970-01-01
    相关资源
    最近更新 更多