Sha*_*ala 7 regression r curve-fitting
我试图按照本例分段回归,断点分析实现分段回归.
现在,我怎么能以这样的方式实现它,第二部分将是二次多项式,其余的是相同的.
我通过改变尝试了同样Z= ~poly(DistanceMeters, 2)但它没有用.
另外,我怎样才能得到类似的方程式
part 1: a1*x+b1
part 2: a2*x2**2 + b2*x + c1
part 3 :a3*x + b3
Run Code Online (Sandbox Code Playgroud)
有类似的问题,但他们无法解释使用分段功能.
我有两个想法,都有缺点。也许您可以根据需要调整其中之一。不幸的是,目前无法访问云端硬盘,因此使用了一些人工数据。
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'
)
)
Run Code Online (Sandbox Code Playgroud)
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()
Run Code Online (Sandbox Code Playgroud)
两者都可以使用例如list()和lapply()来实现一点自动化(对于不同数量的中断等)。
编辑:
poly通过更改和的参数,s您可以获得稍微“更好”的拟合模型,但是对于gam边缘上的误差相当大,请参见degree = 6和k = 30:
| 归档时间: |
|
| 查看次数: |
447 次 |
| 最近记录: |