如何估计一系列线性线段以拟合指数曲线? [英] how can I estimate a series of linear segments to fit an exponential curve?

查看:10
本文介绍了如何估计一系列线性线段以拟合指数曲线?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这可能更像是一个数学问题,但最终我想用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆