r - 使用 nls 的指数回归

标签 r regression curve-fitting 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) 效果很好。 (如果模型中的所有预测变量都经过合理缩放,则填写所有内容是合理的默认/绝望策略...)

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")

points, initial guess,and final fit

关于r - 使用 nls 的指数回归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67152592/

相关文章:

r - 如何使用 dplyr 管道一次性取消嵌套数据帧的多个列表列

r - 使用 Data.table r 聚合大型 data.tables 中具有不同公式的多个列

python - 如何在 Python 中进行三次或更高多项式多元回归?

r - 使用 qqline() 检查残差正态性时出现 "plot.new"错误

python - 曲线拟合到格式为 'datetime' 的时间序列?

r - Data.Frame 到带有彩色文本的 PDF/HTML 表格

从第一个字符到字符串末尾的正则表达式

r - 如何使用 lapply 函数将回归输出列表转换为 broom::tidy 的数据框?

python - scipy.optimize curve_fit 返回错误值

python - 使用 python(或其他有用的语言)在积分内拟合参数