【问题标题】:Segmented regression with quadratic polynomial and a strightline二次多项式和直线的分段回归
【发布时间】:2017-07-27 04:07:34
【问题描述】:

我正在尝试按照此示例 Segmented Regression, Breakpoint analysis 实现分段回归。

现在,我如何以这样的方式实现它,第二部分将是二次多项式,而其他部分保持不变。

我通过更改Z= ~poly(DistanceMeters, 2) 尝试了同样的方法,但没有成功。

另外,我怎样才能得到像

这样的方程
part 1: a1*x+b1
part 2: a2*x2**2 + b2*x + c1
part 3 :a3*x + b3

有类似的问题,但是他们没有使用分段函数来解释。

【问题讨论】:

  • 您是否需要使用 segmented 包,或者您是否可以只对数据集进行子集化并为每个细分构建单独的 lm 模型?
  • 是的,因为我希望也可以使用示例中的一些起始值来计算休息时间
  • 确切地说,这是精确数据的确切问题stackoverflow.com/q/42643638/4729183
  • 但是示例中没有数据。您能否提供一些与您正在使用的数据相似的人工数据?
  • @m-dz 这是实际数据link

标签: r regression curve-fitting


【解决方案1】:

我有两个想法,都有缺点。也许您可以根据需要调整其中之一。很遗憾目前无法访问云端硬盘,因此使用了一些人工数据。

1. “手动”拟合多项式模型

在这里你可以指定你喜欢的模型,一些段可以是lm,一些多项式等。

代码:

library(segmented)
library(ggplot2)
library(data.table)

# Data
set.seed(12)
xx <- 1:100
yy <- 2 + 1.5 * pmax(xx-35, 0) - 1.5 * pmax(xx-70, 0) + 15 * pmax(runif(100) - 0.5, 0) + rnorm(100, 0, 2)

dt <- data.table(x = xx, y = yy, type = 'act')
dt_all <- copy(dt)

# lm
lm_lin <- lm(y ~ x, data = dt)
summary(lm_lin)

# Find segments
lm_seg <- segmented(
  lm_lin, seg.Z = ~ x, psi = list(x = c(30, 80)))

# "Manual" lm's
breaks <- unname(lm_seg$psi[, 'Est.'])
lm_poly1 <- lm(y ~ poly(x, 4), data = dt[x < breaks[1], ])
lm_2 <- lm(y ~ x, data = dt[x > breaks[1] & x < breaks[2], ])
lm_poly3 <- lm(y ~ poly(x, 4), data = dt[x > breaks[2], ])

dt_all <- rbind(
  dt_all,
  data.table(x = xx, y = c(
    predict(lm_poly1),
    predict(lm_2),
    predict(lm_poly3)),
    type = 'lm_poly'
  )
)

2。使用 segmented 的中断和一些样条线拟合游戏模型

在这里,您将在片段之间获得平滑的过渡,但您对正在发生的事情的控制要少得多。

# Using splines for smooth segments
library(mgcv)

spl <- gam(y ~ s(x, bs = "cc", k = 12), data = dt, knots = list(xx = breaks))

# Plot
dt_all <- rbind(dt_all, data.table(x = xx, y = predict(spl), type = 'spl'))
ggplot(dt_all, aes(x = x, y = y)) + geom_point(size = 1) +
  facet_grid(. ~ type) + theme_minimal()

两者都可以使用例如list()lapply() 自动化一点(用于不同数量的休息等)。

编辑:

通过更改polys 的参数,您可以获得稍微“更好”的拟合模型,但对于gam 边缘的错误相当大,请参阅degree = 6k = 30

【讨论】:

    猜你喜欢
    • 2016-02-16
    • 1970-01-01
    • 2021-07-07
    • 2018-08-27
    • 2023-01-17
    • 1970-01-01
    • 2022-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多