使用 nls 的指数回归

Exponential regression using nls

我无法为我的数据拟合指数曲线。

这是我的代码:

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)

但是我得到以下错误:

Error in numericDeriv(form[[3L]], names(ind), env) : Missing value or an infinity produced when evaluating the model

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

只是猜测 list(b1=1, b2=1) 没问题。 (全部填写是合理的 default/desperation 策略 如果 模型中的所有预测变量都经过合理缩放 ...)

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-folding 时间”,看起来大约是 0.1 或可能少一点(曲线看起来在 x= 之间增加了大约 5 倍0.4 和 x=0.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")