如何估计一系列线性线段以拟合指数曲线? [英] how can I estimate a series of linear segments to fit an exponential curve?
本文介绍了如何估计一系列线性线段以拟合指数曲线?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
这可能更像是一个数学问题,但最终我想用R来实现这一点。如果我有一条基本的指数曲线,我想了解如何使用R来应用一系列线性函数来尽可能地拟合指数曲线。原因是直线是一种特殊的关系,而直线代表了一个变化率,在每个拐点,变化率都会增加。这些拐点对用户来说很重要。我附上了一张我正在努力完成的粗略图样。
黑线是指数曲线,红线是一系列直线,橙色圆圈当然代表这些直线相交的地方。我可以随意地执行这项任务,只需挑选任意数据点并构建线性模型,直到找到我认为最符合指数曲线的组合,但我知道还有比这更好的方法。
以下是一些可能有帮助的代码:
data <- c(1:34)
sales <- c(20000000, 25000000, 30000000, 35000000, 43000000,
50000000, 57000000, 65000000, 72000000, 80000000, 89000000,
97000000, 108000000, 118000000, 128000000, 138000000, 150000000,
161000000, 174000000, 187000000, 203000000, 218000000, 235000000,
251000000, 260000000, 280000000 ,293000000, 310000000, 333000000,
363000000, 390000000, 415000000, 454000000, 540000000)
data2 <- data.frame(data,sales)
plot(data2$data,data2$sales)
推荐答案
使用segmented
包(参见this question):
library(segmented)
m1 <- lm(sales ~ data, data = data2) ## initial fit
s1 <- segmented(m1) ## one breakpoint
s2 <- segmented(m1, psi = c(10,25)) ## two breakpoints, estimated starting values
plot(sales ~ data, data = data2)
lines(data2$data, predict(s1))
lines(data2$data, predict(s2), col = 2, lwd =2)
结果:
s2
Call: segmented.lm(obj = m1, psi = c(10, 25))
Meaningful coefficients of the linear terms:
(Intercept) data U1.data U2.data
5942857 7732143 7105220 26962637
Estimated Break-Point(s):
psi1.data psi2.data
15.72 29.65
与@Jacquelin提供的解决方案不同,在估计&>1断点时,您确实需要提供断点的起始值,但它们只需要是合理的值-特别是对于简单/行为良好的数据,对于一系列类似的起始值选择,结果将(几乎)相同。
从数学上讲,我会挑剔地说,指数曲线并没有真正的拐点--斜率不断地逐渐增加--但如果这是向观众传达某种信息的有用方式,那就去做吧。
这篇关于如何估计一系列线性线段以拟合指数曲线?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文