我无法将指数曲线拟合到我的数据。
这是我的代码:
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)
效果很好。 (如果模型中的所有预测变量都经过合理缩放,则填写所有内容是合理的默认/绝望策略...)
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
表示曲线的“电子折叠时间”,看起来大约是 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")
关于r - 使用 nls 的指数回归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67152592/