r - 是否可以拟合特定的斜率以最适合 R 中的数据段?
问题描述
背景:我正在分析石油生产数据,我在 y 轴上绘制每日石油产量,在 x 轴上绘制诊断“时间”因子。这种组合往往表现出一定的趋势,具体取决于流态,其中通常有一个半坡度或四分之一坡度,然后是一个单位坡度。这是非常基本的,但方法是过时的,一切都是手动完成的。
我想知道 R 中是否有一种方法可以找到最适合特定斜率的数据段,并在该数据上拟合相关线,可能达到对数图上的 R^2 标准?还有一种方法可以得到斜率变化的点吗?
解决方案
将来请以可重复的形式提供您的数据,以便我们可以使用它。这次我在最后的 Note 中提供了一些示例数据。
设kvalues
为变化点 x 的可能索引。我们不包括靠近末端的那些以避免数字问题。然后对于每个kvalue
我们执行regr
函数中定义的回归并使用 计算残差平方和deviance
。采取最少的 thoxe 并显示该回归。不使用任何包。
(如果要修复斜率,则从公式和起始值中删除斜率参数,并将它们替换为公式中的固定值。)
kvalues <- 5:45
st <- list(a1 = 1, b1 = 1, a2 = 2, b2 = 2)
regr <- function(k) try(nls(y ~ ifelse(x < k, a1 + b1 * x, a2 + b2 * x), start = st))
i <- which.min(sapply(kvalues, function(k) deviance(regr(k))))
k <- kvalues[i]
k; x[k]
## [1] 26
## [1] 26
fm <- regr(k)
fm
## Nonlinear regression model
## model: y ~ ifelse(x < k, a1 + b1 * x, a2 + b2 * x)
## data: parent.frame()
## a1 b1 a2 b2
## 1.507 -1.042 1.173 -2.002
## residual sum-of-squares: 39.52
##
## Number of iterations to convergence: 1
## Achieved convergence tolerance: 2.917e-09
plot(y ~ x)
lines(fitted(fm) ~ x)
abline(v = x[k])
笔记
set.seed(123)
x <- 1:50
y <- 1 - rep(1:2, each = 25) * x + rnorm(50)
推荐阅读
- c# - 即使实体框架核心中的模型没有任何更新,DateTime 属性也会导致新的迁移更新
- javascript - D3 折线图红线为零值
- latex - 线图图例阻碍视图,将其移到外面?
- wordpress - 通过 post 请求将 wordpress 表单数据发送到 odoo 以获取潜在客户
- tslint - tslint:如何确保变量不是未定义的?
- php - 使用 html 下拉菜单单击更改 PHP 项目
- php - 只有当用户查看自己的个人资料而不是其他人的个人资料时,我才能使某些文本对用户可见?
- python-3.x - 如何使按钮在文本更改长度时保持原位
- mysql - Laravel 错误:违反完整性约束
- visual-foxpro - 如何使用like函数检查字符表达式是否在文本开头包含“*”