背景:我正在分析石油生产数据,其中我在y轴上绘制每日机油率,在x轴上绘制诊断“时间”因子。该组合趋向于呈现出一定的趋势,这取决于流态,其中通常存在半斜率或四分之一斜率,随后是单位斜率。这是非常基础的,但是这种方法是过时的,并且所有操作都是手动完成的。
我想知道R中是否有一种方法可以找到最适合特定斜率的数据段,并在该数据上拟合关联的线,也许可以达到对数对数图上的R ^ 2标准?还可以找到斜率变化的点吗?
答案 0 :(得分:0)
如何使用散点图?
scatter.smooth(x=data$x, y=data$y, main="y ~ x") # scatterplot
答案 1 :(得分:0)
将来,请以可复制的形式提供您的数据,以便我们处理。这次,我在末尾的注释中提供了一些示例数据。
让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)