背景:我正在分析石油生产数据,我在y轴上绘制了日产油率,在x轴上绘制了一个诊断“时间”因子。这种组合倾向于表现出一定的趋势,这取决于流动状况,其中通常有半坡或四分之一坡,然后是单位坡度。这是非常基本的,但方法是过时的,所有的事情都是手动完成的。
我想知道在R中是否有一种方法可以找到最适合特定斜率的数据段,并在该数据上拟合关联线,可能在对数-对数图上达到R^2标准?另外,有没有一种方法可以得到斜率变化的点?
发布于 2019-12-20 15:07:49
使用散点图怎么样?
scatter.smooth(x=data$x, y=data$y, main="y ~ x") # scatterplot
发布于 2019-12-20 15:52:03
将来请以可复制的形式提供您的数据,以便我们可以使用它。这一次,我在结尾处的注释中提供了一些示例数据。
设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)
https://stackoverflow.com/questions/59427311
复制