【问题标题】:R: determining coefficients for nlsR:确定 nls 的系数
【发布时间】:2018-11-21 08:59:44
【问题描述】:

我正在尝试使用 nls 函数在 R 中拟合这个非线性模型。

这是我要拟合的数据:

tab2 = data.frame(n = c(10,100,1000,10000,100000), Time = c(3.989220e-03, 
1.994681e-02, 3.311172e-01, 5.142252e+00, 1.314725e+03))

我们看到时间呈指数级增长,因此我想使用 nls 对此进行建模。这是我迄今为止尝试过的:

mod4 = nls(Time ~ exp(a + b*n), data = tab2, start = list(a = -3, b = 0))

但是,这不起作用,并且出现以下错误消息:

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

我不知道为什么会这样,但我猜这与这些起始值有关?我通过使用 lm 估计模型得到它们:

mod3 = lm(log(Time) ~ n, data = tab2); coef(mod3)
 (Intercept)             n 
-2.5908574883  0.0001010623 

由于这是几乎相同的模型,我认为系数会匹配,但是当我使用接近它们的值作为起始值时,nls 模型不起作用。

关于为什么会发生这种情况的任何建议?

【问题讨论】:

  • 你试过getInitial吗?它是否给出相同的起始值?
  • 不,我没有,那怎么用?抱歉,这是我第一次使用nls
  • 类似的东西; getInitia(Time ~ exp(a + b*n), data = tab2, start = list(a = -3, b = 0))。看看帮助文件。此外,通常n 将是您的响应,受Time 影响。这是你的目标吗?在这种情况下,您需要在模型中交换这些回合。
  • 也看看这个问题,和你一样报错stackoverflow.com/questions/38207716/…

标签: r compiler-errors nls


【解决方案1】:

需要更好的起始值。如果我们取双方的对数,那么它就变成了一个线性模型,并且任何起始值都应该起作用,所以只需使用 a = b = 1,例如。 (我们可以交替使用lm。)然后使用第一个模型的系数作为原始模型的起始值。

fo1 <- log(Time) ~ a + b*n
fm1 = nls(fo1, data = tab2, start = list(a = 1, b = 1))

fo2 <- Time ~ exp(a + b * n)
fm2 <- nls(fo2, tab2, start = coef(fm1))

fm2

给予:

Nonlinear regression model
  model: Time ~ exp(a + b * n)
   data: tab2
        a         b 
3.567e-01 6.825e-05 
 residual sum-of-squares: 10.84

Number of iterations to convergence: 7 
Achieved convergence tolerance: 2.051e-06

【讨论】:

    猜你喜欢
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 2017-02-21
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多