首页 > 解决方案 > 是否可以拟合特定的斜率以最适合 R 中的数据段?

问题描述

背景:我正在分析石油生产数据,我在 y 轴上绘制每日石油产量,在 x 轴上绘制诊断“时间”因子。这种组合往往表现出一定的趋势,具体取决于流态,其中通常有一个半坡度或四分之一坡度,然后是一个单位坡度。这是非常基本的,但方法是过时的,一切都是手动完成的。

我想知道 R 中是否有一种方法可以找到最适合特定斜率的数据段,并在该数据上拟合相关线,可能达到对数图上的 R^2 标准?还有一种方法可以得到斜率变化的点吗?

原始数据是什么样子的示例

期望的最终结果示例

标签: rautomationbest-fit-curve

解决方案


将来请以可重复的形式提供您的数据,以便我们可以使用它。这次我在最后的 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)

推荐阅读