Работа с функцией NLS производит особый градиент - PullRequest
1 голос
/ 22 марта 2020

Я хочу подогнать нелинейную модель наименьших квадратов к своим данным, используя функцию nls, но получаю ошибку:

Мои данные:

y=c(0.3,1.5,4.1,10.1,21.9,39,4,58.2,77,89.6,95,98.3,100)

x=c(30,35,40,45,50,55,60,65,70,75,80,85,90)

У меня есть использовал следующую команду R:

fit<-nls(y~a/(1+exp(-b*(x-c))), start=list(a=1,b=0.5,c=25))

Кажется, что что-то пошло не так при запуске, но не уверен.

1 Ответ

3 голосов
/ 22 марта 2020

Вот несколько подходов:

1) nls Требуются лучшие начальные значения. Сначала возьмем обратную величину обеих сторон и используем алгоритм "plinear", который не требует начальных значений для линейных параметров, в данном случае a. Затем используйте это в качестве начальных значений для вашей подгонки.

fit0 <- nls(1/y ~ 1 + exp(-b*(x-c)), start = list(b = .5, c = 25), alg = "plinear")
fit <- nls(y~1/(1+exp(-b*(x-c))),start=coef(fit0)[1:2], alg = "plinear")

plot(y ~ x)
lines(fitted(fit) ~ x)
fit

давая:

Nonlinear regression model
  model: y ~ 1/(1 + exp(-b * (x - c)))
   data: parent.frame()
       b        c     .lin 
  0.1355  64.9761 106.7095 
 residual sum-of-squares: 1516

Number of iterations to convergence: 13 
Achieved convergence tolerance: 6.85e-06

screenshot

2) nls / SSlogis R предоставляет SSlogis модель самозапуска. Никаких начальных значений не требуется. Обратите внимание, что он параметризован так, что b = 1 / B.

nls(y ~ SSlogis(x, a, c, B))

дает:

Nonlinear regression model
  model: y ~ SSlogis(x, a, c, B)
   data: parent.frame()
     a      c      B 
106.71  64.98   7.38 
 residual sum-of-squares: 1516

Number of iterations to convergence: 2 
Achieved convergence tolerance: 4.087e-06

3) dr c dr c Пакет также может соответствовать этому и предоставляет свои собственные начальные значения. Имена параметров отличаются от b, d и e ниже, соответствующих -b, a и c в вопросе.

library(drc)

fm <- drm(y ~ x, fct = L.3())
plot(fm)
fm

, давая:

A 'drc' model.

Call:
drm(formula = y ~ x, fct = L.3())

Coefficients:
b:(Intercept)  d:(Intercept)  e:(Intercept)  
      -0.1355       106.7093        64.9761  
...