分段回归(Segmented regression)使用二次多项式和一条直线

6
我将尝试按照这个例子实现分段回归:分段回归,断点分析
现在,我该如何实现第二部分为二次多项式,而其余部分保持不变?
我尝试通过更改Z= ~poly(DistanceMeters, 2)来实现,但是没有成功。
此外,我该如何获得类似以下的方程:
part 1: a1*x+b1
part 2: a2*x2**2 + b2*x + c1
part 3 :a3*x + b3

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


1
您是否需要使用“segmented”软件包,或者只需对数据集进行子集划分,并为每个段构建单独的“lm”模型即可? - C8H10N4O2
是的,因为我希望像示例中那样使用一些起始值来计算休息时间。 - Shankar Pandala
准确地说,这是确切数据的确切问题。http://stackoverflow.com/q/42643638/4729183 - Shankar Pandala
但是示例中没有数据。您能否提供一些类似于您正在处理的人工数据? - m-dz
@m-dz 这是实际数据链接 - Shankar Pandala
@ShankarPandala,你找到建立模型的方法了吗? - m-dz
1个回答

3

我有两个想法,但都有缺点。也许你可以根据自己的需求调整其中一个。很遗憾此时无法访问Drive,所以使用了一些人工数据。

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中的断点和一些样条拟合gam模型

在这里,您将获得分段之间的平滑过渡,但对发生的情况很少有控制。

# 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()

enter image description here

这两个可以用list()lapply()等方法自动化处理(对于不同数量的间断点等)。

编辑:

通过修改polys的参数,你可以得到略微“更好”的拟合模型,但是对于gam而言,误差在边缘处相当大,参见degree = 6k = 30的情况:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接