如何解决使用 nls 进行指数回归
我无法为我的数据拟合指数曲线。
这是我的代码:
x<-c(0.134,0.215,0.345,0.482,0.538,0.555)
y<-c(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 上描述的几种方法,例如删除零或将其拟合到更简单的模型(日志),但所有这些都给了我一个不同的错误。我的猜测是我需要更好的起始值,但我似乎无法在不出错的情况下找到它们。
解决方法
只需猜测 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,但这是正确的数量级) - 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),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")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。