r - nls() 的后续步骤?

标签 r regression non-linear-regression nls

在 R 中工作,我正在尝试使用 nls() 将一些数据拟合到以下模型:

y ~ c - a * exp(-b * x)

我的数据:

x <- c(8, 8, 10, 10, 10, 10, 12, 12, 12, 12, 14, 14, 14, 16, 16, 16, 18, 18, 20, 20, 20, 22, 22, 22, 24, 24, 24, 26, 26, 26, 28, 28, 30, 30, 30, 32, 32, 34, 36, 36, 38, 38, 40, 42)
y <- c(0.49, 0.49, 0.48, 0.47, 0.48, 0.47, 0.46, 0.46, 0.45, 0.43, 0.45, 0.43, 0.43, 0.44, 0.43, 0.43, 0.46, 0.45, 0.42, 0.42, 0.43, 0.41, 0.41, 0.40, 0.42, 0.40, 0.40, 0.41, 0.40, 0.41, 0.41, 0.40, 0.40, 0.40, 0.38, 0.41, 0.40, 0.40, 0.41, 0.38, 0.40, 0.40, 0.39, 0.39)


data <- data.frame(x, y)

检查数据是否符合模型的形式:

Plot of data

我正在使用的书上说系数估计应该是:c=0.3896,a=-0.2194,b=0.992。

我基于此线程尝试使用给定值 2 , 返回奇异梯度误差:

m <- nls(y ~ I(c-a*exp(-b*x)), data=data, start=list(a=-.2194, b=1, c=0.3), trace=T)

当我尝试拟合 y ~ a * exp(-b * x)y ~ exp(-b * x) 时,我得到了可接受的值,但是当我添加了“c”项,我得到了奇异梯度误差。我也尝试过使用 nlsLM,它有同样的问题,所以我认为这与我在该拦截项中添加的方式有关。感谢任何建议,谢谢。

最佳答案

使用线性算法,在这种情况下,线性输入的参数不需要起始值。在这种情况下,右侧应该是一个矩阵,使得每一列都乘以线性输入的参数之一。

fm <- nls(y ~ cbind(c = 1, a = -exp(-b*x)), data, 
  start = list(b = 1), alg = "plinear")
fm

给予:

Nonlinear regression model
  model: y ~ cbind(c = 1, a = -exp(-b * x))
   data: data
       b   .lin.c   .lin.a 
 0.09916  0.38963 -0.21940 
 residual sum-of-squares: 0.004997

Number of iterations to convergence: 6 
Achieved convergence tolerance: 3.075e-07

我们可以直观地检查拟合:

plot(y ~ x, data)
lines(fitted(fm) ~ x, data, col = "red")

screenshot

关于r - nls() 的后续步骤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68787634/

相关文章:

r - 在gganimate中以不同的速度显示不同的时间元素

r - 文件名未知的文件

r - 如何将回归线添加到具有多个按因子颜色编码的数据系列的图中?

c# - Accord.NET 中的回归分析

python-2.7 - 如何使用 scikit-learn 只删除多项式回归中的交互项?

r - R中的非线性回归分析

r - 仅使用代码保存 networkD3 Sankey 图

machine-learning - 如何计算线性回归中的正则化参数

r - 如何使用 cumsum 但条件是 <0 然后使用 0