R: определение коэффициентов для nls - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь подогнать эту нелинейную модель в R, используя функцию nls.

Вот данные, которые я пытаюсь подогнать:

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 модель не работает.

Есть какие-либо предложения относительно того, почему это происходит?

1 Ответ

0 голосов
/ 21 ноября 2018

Требуются лучшие начальные значения.Если мы берем бревно с обеих сторон, то оно становится линейной моделью, и любые начальные значения должны работать, поэтому просто используйте 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
...