分段包中的等斜率和相反斜率
Equal and opposite slopes in segmented package
您好,我正在尝试使用 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")
我的理论计算表明,关于断点的两条线的斜率应该大小相等但符号相反。我是 lm 和 glms 的初学者。我希望是否有一种方法可以估计斜率受关系约束的断点,slope1=-slope2
enter image description here
分段包不支持此功能。
可以使用 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
这是另一个可以澄清这一点的例子,因为它从与 fit 相同的模型生成数据:
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
注:上面我们假设bp
是一个在x
范围内的整数,但是如果不满足这样的条件我们可以放宽希望通过使用 nls2
的结果作为 nls
优化的起始值,即 nls(y ~ cbind(1, abs(x - bp)), start = coef(fm)[1], alg = "plinear")
.
您好,我正在尝试使用 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")
我的理论计算表明,关于断点的两条线的斜率应该大小相等但符号相反。我是 lm 和 glms 的初学者。我希望是否有一种方法可以估计斜率受关系约束的断点,slope1=-slope2
enter image description here
分段包不支持此功能。
可以使用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
这是另一个可以澄清这一点的例子,因为它从与 fit 相同的模型生成数据:
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
注:上面我们假设bp
是一个在x
范围内的整数,但是如果不满足这样的条件我们可以放宽希望通过使用 nls2
的结果作为 nls
优化的起始值,即 nls(y ~ cbind(1, abs(x - bp)), start = coef(fm)[1], alg = "plinear")
.