[R] error using nls with logistic derivative

Francisco Mora Ardila fmora at oikos.unam.mx
Tue Apr 17 18:42:18 CEST 2012


It seems to work!

Thanks and sorry for the personal message

Francisco

On Tue, 17 Apr 2012 09:09:24 +0200, peter dalgaard wrote
> On Apr 17, 2012, at 06:23 , Francisco Mora Ardila wrote:
> 
> > Hi
> > 
> > I´m trying to fit a nonlinear model to a derivative of the logistic function
> > 
> > y = a/(1+exp((b-x)/c)) (this is the parametrization for the SSlogis function with 
nls)
> > 
> > The derivative calculated with D function is:
> > 
> >> logis<- expression(a/(1+exp((b-x)/c)))
> >> D(logis, "x")
> > a * (exp((b - x)/c) * (1/c))/(1 + exp((b - x)/c))^2
> > 
> > So I enter this expression in the nls function:
> > 
> > ratelogis <- nls(Y ~ a*(exp((b-X)/c)*(1/c))/(1 + exp((b-X)/c))^2,
> > start=list(a = 21.16322, b = 8.83669, c = 2.957765),
> > )
> > 
> > The data is:
> > 
> >> Y
> > [1]  5.5199668  1.5234525  3.3557000  6.7211704  7.4237955  1.9703127
> > [7]  4.3939336 -1.4380091  3.2650180  3.5760906  0.2947972  1.0569417
> >> X
> > [1]   1   0   0   4   3   5  12  10  12 100 100 100
> > 
> > The problem is that I got the next error:
> > 
> > Error en nls(Y ~ a * (exp((b - X)/c) * (1/c))/(1 + exp((b - X)/c))^2,  : 
> >  step factor 0.000488281 reduced below 'minFactor' of 0.000976563
> > 
> > I trien to change the minFactor using the control argument inside nls
> > 
> > control=nls.control(maxiter=50, tol=1e-5, minFactor = 1/2048
> > 
> > but got a new error message:
> > 
> > 
> > Error en nls(Y ~ a * (exp((b - X)/c) * (1/c))/(1 + exp((b - X)/c))^2,  : 
> >  step factor 0.000244141 reduced below 'minFactor' of 0.000488281
> > 
> > So it seems that as I modify minFactor, the step factor reduces also and I can never 
> > reach a solution.
> > 
> > Does anybody Know what am I doing wrong? Is there a problem with the formula? How 
can I 
> > solve it? I tried some suggestions on R-help related topics but did not work.
> 
> (Please don't send private messages. I don't do free consulting outside of the 
> mailing lists.)
> 
> With nls(), there's really no substitute for good data and good starting 
> values. Did you actually try plotting those data? At best, they are extremely 
> noisy. How did you obtain the starting values? They seem remarkably accurate 
> for something that fits data so poorly.
> 
> What is happening is that the algorithm shoots off into a region of the 
> parameter space where it can't make any progress:
> 
> > ratelogis <- nls(Y ~ a*(exp((b-X)/c)*(1/c))/(1 + exp((b-X)/c))^2,+ start=list(a = 
21.16322, b = 8.83669, c = 2.957765),+ trace=TRUE)
> 151.098 :  21.163220  8.836690  2.957765 
> 127.1149 :  103.49326  11.43274  20.29663 
> 111.344 :  833.02386 -45.86244 140.32985 
> 111.3375 :  978.97214 -76.20571 159.90833 
> 111.3374 :  1097.1376 -101.6771  174.2037 
> 111.3228 :  1179.8451 -119.7416  183.3794
> 
> Notice that the "b" parameter which is supposed to be the maximum point starts 
> off well to the right of the position of the largest Y values, then shoots 
> into large negative values.
> 
> With a little eyeballing, I can do better:
> 
> > ratelogis <- nls(Y ~ a*(exp((b-X)/c)*(1/c))/(1 + exp((b-X)/c))^2,
> + start=list(a = 40, b = 3.5, c = 10),trace=T)
> 139.5173 :  40.0  3.5 10.0 
> 97.28614 :  26.513424  4.052639  2.267709 
> 81.53127 :  32.384910  3.473411  2.307504 
> 65.11387 :  39.53542  3.01097  2.07678 
> 50.66328 :  36.223529  2.590102  1.133965 
> 50.50921 :  35.984466  2.565698  1.067731 
> 50.50162 :  36.149993  2.573420  1.081673 
> 50.50145 :  36.129962  2.572195  1.079504 
> 50.50144 :  36.133656  2.572402  1.079862 
> 50.50144 :  36.133061  2.572368  1.079803
> 
> However, the fit isn't exactly stellar. Try this:
> 
> X <- c(1, 0, 0, 4, 3, 5, 12, 10, 12, 100, 100, 100)
> Y <- c(5.5199668, 1.5234525, 3.3557, 6.7211704, 7.4237955, 1.9703127, 
>    4.3939336, -1.4380091, 3.265018, 3.5760906, 0.2947972, 1.0569417)
> plot(X,Y)
> ratelogis <- nls(Y ~ a*(exp((b-X)/c)*(1/c))/(1 + exp((b-X)/c))^2,
>  start=list(a = 40, b = 3.5, c = 10),trace=T)
> x0 <-  seq(0,100,,1000)
> lines(x0,predict(ratelogis,newdata=data.frame(X=x0)))
> lines(x0,evalq(a*(exp((b-X)/c)*(1/c))/(1 + exp((b-X)/c))^2,envir=list(a = 
> 21.16322, b = 8.83669, c = 2.957765, X=x0)), lty="dashed")
> 
> -- 
> Peter Dalgaard, Professor,
> Center for Statistics, Copenhagen Business School
> Solbjerg Plads 3, 2000 Frederiksberg, Denmark
> Phone: (+45)38153501
> Email: pd.mes at cbs.dk  Priv: PDalgd at gmail.com


----------------------
Francisco Mora Ardila
Estudiante de Doctorado
Centro de Investigaciones en Ecosistemas
Universidad Nacional Autónoma de México



More information about the R-help mailing list