分段包装中的相等和相反斜率

时间:2016-02-13 18:16:11

标签: r package breakpoints

您好我正在尝试使用R中的分段包来拟合分段线性回归模型来估计我的数据中的断点。我使用以下代码来获取此图。

library(segmented)
set.seed(5)
x <- c(1:10, 13:22)
y <- numeric(20)
## Create first segment
y[1:10] <- 20:11 + rnorm(10, 0, 1.5)
## Create second segment
y[11:20] <- seq(11, 15, len=10) + rnorm(10, 0, 1.5)

## fitting a linear model
lin.mod <- lm(y~x)
segmented.mod <- segmented(lin.mod, seg.Z = ~x, psi=15)
summary(segmented.mod)
plot(x,y, pch=".",cex=4,xlab="x",ylab="y")
plot(segmented.mod, add=T, lwd = 3,col = "red") 

enter image description here

我的理论计算表明,关于断点的两条线的斜率应该在幅度上相等但符号相反。我是lm和glms的初学者。我希望是否有办法估算受关系约束的斜坡的断点,slope1 = -slope2

enter image description here

1 个答案:

答案 0 :(得分:0)

分段包中不支持此功能。

可以使用具有nls2算法的

"plinear-brute"。输出.lin1.lin2分别是常数项和斜率。这会尝试x范围内的每个值作为可能的bp,对每个值进行线性回归。

library(nls2)

st <- data.frame(bp = seq(min(x), max(x)))
nls2(y ~ cbind(1, abs(x - bp)), start = st, alg = "plinear-brute")

,并提供:

Nonlinear regression model
  model: y ~ cbind(1, abs(x - bp))
   data: parent.frame()
       bp     .lin1     .lin2 
14.000000  9.500457  0.709624 
 residual sum-of-squares: 45.84213

Number of iterations to convergence: 22 
Achieved convergence tolerance: NA

这是另一个可以澄清这一点的例子,因为它从适合的模型生成数据:

library(nls2)

set.seed(123)
n <- 100
bp <- 25
x <- 1:n
y <- rnorm(n, 10 + 2 * abs(x - bp))

st <- data.frame(bp = seq(min(x), max(x)))
fm <- nls2(y ~ cbind(1, abs(x - bp)), start = st, alg = "plinear-brute")

,并提供:

> fm
Nonlinear regression model
  model: y ~ cbind(1, abs(x - bp))
   data: parent.frame()
    bp  .lin1  .lin2 
25.000  9.935  2.005 
 residual sum-of-squares: 81.29

Number of iterations to convergence: 100 
Achieved convergence tolerance: NA

注意:在上面我们假设bpx范围内的整数但我们可以放松,如果不希望这样的条件使用结果nls2作为nls优化的起始值,即nls(y ~ cbind(1, abs(x - bp)), start = coef(fm)[1], alg = "plinear")