Вот несколько подходов:
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
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