背景:我正在分析石油生产数据,我在 y 轴上绘制每日石油产量,在 x 轴上绘制诊断“时间”因子。这种组合往往表现出一定的趋势,具体取决于流态,其中通常有一个半坡度或四分之一坡度,然后是一个单位坡度。这是非常基本的,但方法是过时的,一切都是手动完成的。
我想知道 R 中是否有一种方法可以找到最适合特定斜率的数据段,并在该数据上拟合相关线,可能达到对数图上的 R^2 标准?还有一种方法可以得到斜率变化的点吗?
背景:我正在分析石油生产数据,我在 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)
使用散点图怎么样?
scatter.smooth(x=data$x, y=data$y, main="y ~ x") # scatterplot