Have you plotted the data? There are two standard sources of non-convergence problems like this: First, there may not be enough information in your data to estimate all four parameters. Second, if that's not the case, then your starting values are not appropriate.

I routinely use "optim" or "nlminb" to find a sensible solution, because these general purpose optimizers are more likely to converge than "nls". To do this, I write a function with a name like "SSElogistic" to compute the sum of squares of residuals for your model. I like to use "optim" with "hessian=TRUE". Then I compute "eigen(fit$hessian, symmetric=TRUE)", with "fit" = the object returned by "optim". If the smallest eigenvalue is negative, it says that optim found a saddle point. If the smallest eigenvalue is less than, e.g., 1e-8 times the largest, it says that the smallest eigenvector is very poorly estimated. Round those numbers off grossly to 1 significant digit, and they will likely suggest which parameter you can fix and drop from the model.

Hope this helps. Spencer Graves


UyenThao Nguyen wrote:
Hi,

I am trying to fit a 4p logistic to this data, using nls function. The function 
didn't freely converge; however, it converged if I put a lower and an upper 
bound (in algorithm port). Also, the b1.A parameter always takes value of the 
upper bound, which is very strange. Has anyone experienced about non-convergent 
of nls and how to deal with this kind of problem?

Thank you very much.



########################################################################3
           y           x
1  0.8924619 -0.31875876
2  1.1814749 -0.21467016
3  1.6148266  0.06069784
4  2.2091363  0.54032947
5  2.7019079  1.04921802
6  3.0679585  1.60745502
9  0.9436973 -0.31875876
10 1.2201133 -0.21467016
11 1.6470043  0.06069784
12 2.2090048  0.54032947
13 2.6864857  1.04921802
14 3.0673523  1.60745502

new.cont=nls.control(maxiter = 10000, tol = 1e-05, minFactor = 1e-08,
            printEval = FALSE, warnOnly = FALSE)


b0.A=.9*min(DAT$y)
b1.A=1.1*max(DAT$y)-b0.A
b2.A=-1*mean(DAT$x)
b3.A=1


b0.A
b1.A
b2.A
b3.A

nls.mdl.A=nls(y~b0 + b1/(1+exp(-b2-b3*x)),data=DAT,start = list(b0=b0.A, b1=b1.A, 
b2=b2.A, b3=b3.A), lower=-10, upper=10, 
algorithm="port",trace=T,control=new.cont)

##################################



        [[alternative HTML version deleted]]

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.



______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to