【问题标题】:Exponential regression using nls使用 nls 进行指数回归
【发布时间】:2021-07-13 02:17:07
【问题描述】:

我无法将指数曲线拟合到我的数据中。

这是我的代码:

x<-c(0.134,0.215,0.345,0.482,0.538,0.555)
y<-c(0,0,0.004,0.291,1.135,1.684)
plot(x,y)
estimates<- list(b1 = 0.1, b2 = 5e-7)
nlfit <- nls(y ~ b1 * (exp(x/b2)-1), start=estimates)
lines(x, predict(nlfit), col = 2)

但我收到以下错误:

numericDeriv(form[[3L]], names(ind), env) 中的错误: 评估模型时产生的缺失值或无穷大

我尝试了 Stack Overflow 上描述的几种方法,例如删除零或将其拟合到更简单的模型(日志),但所有这些方法都给了我一个不同的错误。我的猜测是我需要更好的起始值,但我似乎无法在没有任何错误的情况下找到它们。

【问题讨论】:

    标签: r regression curve-fitting nls


    【解决方案1】:

    只是猜测list(b1=1, b2=1) 工作正常。 (全部填写是一种合理的默认/绝望策略如果您的模型中的所有预测变量都经过合理缩放...)

    nlfit <- nls(y ~ b1 * (exp(x/b2)-1), start=list(b1=1,b2=1))
    lines(x, predict(nlfit), col = 2)
    

    为了找到良好的初始估计值,转换为对数线性模型的常规技巧有点困难,因为您有 -1 项修改指数...但是,您可以尝试找出一个稍微了解一下曲线的几何形状并关注您拥有的数据:

    • 在 x=0 时,y 应该大约等于 0(好吧,这并没有给我们提供太多关于参数值的信息)
    • b2 代表曲线的“e 折叠时间”,看起来大约是 0.1 或者可能更小一点(曲线看起来在 x=0.4 和 x=0.5 之间增加了大约 5 倍,但是这大约是正确的数量级)
    • x=0.5 处的 y 值约为 0.5,因此 b1 的合理起始值约为 0.5/(exp(0.5/0.1)-1) = 0.003。

    最终估计为b1=3.1e-6, b2=4.2e-2,但初始值足够接近,可以合理提供合理的拟合,这通常足够好。

    nlfit <- nls(y ~ b1 * (exp(x/b2)-1), start=list(b1=1,b2=1), data=data.frame(x,y))
    plot(x,y)
    curve(0.003*(exp(x/0.1)-1), col="blue", add=TRUE)
    xvec <- seq(0.1,0.6,length=51)
    lines(xvec,predict(nlfit,newdata=data.frame(x=xvec)),col="red")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      • 1970-01-01
      • 2017-09-04
      • 2020-05-16
      • 1970-01-01
      相关资源
      最近更新 更多