分段回归,在 R 中拟合两个断点:一条水平线,一条直线,然后再一条水平线
piecewise regression with two breakpoints to be fitted in R: a horizontal line, a straight line and then again a horizontal line
我想用 R 中的两个断点进行分段回归:首先是斜率为 0 的水平线,然后是直线,然后是斜率为 0 的水平线。这两个断点也应该拟合。
我的数据是这样的(我总共有 60 个类似的数据集):
x <- c(1.306, 1.566, 1.736, 1.854, 2.082, 2.328, 2.650, 2.886, 3.162, 3.392)
y <- c(176.4, 188.0, 193.8, 179.4, 134.4, 119.0, 66.2, 58.2, 58.2, 41.2)
有人知道怎么做吗?
使用 nls
在 x
上拟合一条具有最小值和最大值的线,就像这样。 a
和b
是交点的x值,.lin1
是中间部分的截距,.lin2
是中间部分的斜率。
fm <- nls(y ~ cbind(1, pmax(pmin(x, b), a)), alg = "plinear", start = list(a = 2, b = 3))
给予:
Nonlinear regression model
model: y ~ cbind(1, pmax(pmin(x, b), a))
data: parent.frame()
a b .lin1 .lin2
1.774 2.764 425.463 -134.940
residual sum-of-squares: 530.7
Number of iterations to convergence: 5
Achieved convergence tolerance: 6.489e-09
水平部分在与交点的x值对应的y值处:
predict(fm, list(x = coef(fm)[1:2]))
## [1] 186.06667 52.53333
或者可以计算为最小和最大x值对应的y值:
predict(fm, list(x = range(x)))
## [1] 186.06667 52.53333
我们可以像这样绘制点和拟合:
plot(y ~ x)
xx <- seq(min(x), max(x), length = 100)
p <- predict(fm, list(x = xx))
lines(p ~ xx, col = "red")
更新的答案需要更少的人际互动,不过,
基本和之前的回答一样
您可以将点粗略地分为上层和下层
自动点。一些过渡点可能
与上点或下点分组,所以我们使用
boxplot.stats
消除任何看起来像
这些群体中的异常值。然后我们可以取平均值
用于估计水平高度的高点和低点
线。我们还使用非异常值的上下点来
确定转换的 x 值。
HighLine = (2*max(y) + min(y))/3
HighPoints = which(y >= boxplot.stats(y[y>HighLine])$stats[1])
HighY = mean(y[HighPoints])
LowLine = (max(y) + 2*min(y))/3
LowPoints = which(y <= boxplot.stats(y[y<LowLine])$stats[5])
LowY = mean(y[LowPoints])
x1 = max(x[HighPoints])
x2 = min(x[LowPoints])
plot(x,y)
lines(c(min(x), x1,x2, max(x)), c(HighY, HighY, LowY, LowY))
我想用 R 中的两个断点进行分段回归:首先是斜率为 0 的水平线,然后是直线,然后是斜率为 0 的水平线。这两个断点也应该拟合。
我的数据是这样的(我总共有 60 个类似的数据集):
x <- c(1.306, 1.566, 1.736, 1.854, 2.082, 2.328, 2.650, 2.886, 3.162, 3.392)
y <- c(176.4, 188.0, 193.8, 179.4, 134.4, 119.0, 66.2, 58.2, 58.2, 41.2)
有人知道怎么做吗?
使用 nls
在 x
上拟合一条具有最小值和最大值的线,就像这样。 a
和b
是交点的x值,.lin1
是中间部分的截距,.lin2
是中间部分的斜率。
fm <- nls(y ~ cbind(1, pmax(pmin(x, b), a)), alg = "plinear", start = list(a = 2, b = 3))
给予:
Nonlinear regression model
model: y ~ cbind(1, pmax(pmin(x, b), a))
data: parent.frame()
a b .lin1 .lin2
1.774 2.764 425.463 -134.940
residual sum-of-squares: 530.7
Number of iterations to convergence: 5
Achieved convergence tolerance: 6.489e-09
水平部分在与交点的x值对应的y值处:
predict(fm, list(x = coef(fm)[1:2]))
## [1] 186.06667 52.53333
或者可以计算为最小和最大x值对应的y值:
predict(fm, list(x = range(x)))
## [1] 186.06667 52.53333
我们可以像这样绘制点和拟合:
plot(y ~ x)
xx <- seq(min(x), max(x), length = 100)
p <- predict(fm, list(x = xx))
lines(p ~ xx, col = "red")
更新的答案需要更少的人际互动,不过, 基本和之前的回答一样
您可以将点粗略地分为上层和下层
自动点。一些过渡点可能
与上点或下点分组,所以我们使用
boxplot.stats
消除任何看起来像
这些群体中的异常值。然后我们可以取平均值
用于估计水平高度的高点和低点
线。我们还使用非异常值的上下点来
确定转换的 x 值。
HighLine = (2*max(y) + min(y))/3
HighPoints = which(y >= boxplot.stats(y[y>HighLine])$stats[1])
HighY = mean(y[HighPoints])
LowLine = (max(y) + 2*min(y))/3
LowPoints = which(y <= boxplot.stats(y[y<LowLine])$stats[5])
LowY = mean(y[LowPoints])
x1 = max(x[HighPoints])
x2 = min(x[LowPoints])
plot(x,y)
lines(c(min(x), x1,x2, max(x)), c(HighY, HighY, LowY, LowY))