r - 在 R 中拟合两个断点的分段回归:一条水平线、一条直线,然后又是一条水平线
问题描述
我想用 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
。 是交点的 x 值,a
是中间部分的截距, 是中间部分的斜率。b
.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")
推荐阅读
- python - 了解 TensorFlow 检查点加载?
- oracle - 根据用户过滤交互式报表中的数据
- asp.net - 在 ASP .NET Core 2.1 Web Api 中启用 CORS
- java - 将选定的文本文件数据插入 jtable
- android - android studio avd manager 无效选项——'-enable-whpx'
- android - 如何在 Android 上使用应用程序运行 react-native(使用 CRNA)
- android-studio - 应用程序元素未显示在设计预览中
- c++ - 无法调用结构内的成员函数指针
- amazon-web-services - 时间戳未从 Glue 加载到 Redshift 表中
- c# - 从 object[,] 数组 c# 中删除空元素