On 23-Oct-11 19:03:05, Carl Witthoft wrote: > You misused nls(). Observe: > > x<- 1:101 > y2 <- 5*exp(x/20) + runif(101)/100 # nls will NOT converge for perfect > data. > > nls(y2 ~ exp(A*x), start=list(A=.1)) > > Nonlinear regression model > model: y2 ~ exp(A * x) > data: parent.frame() > A > 0.06709 > residual sum-of-squares: 136703 > > Number of iterations to convergence: 7 > Achieved convergence tolerance: 2.694e-06 > > Which is a lousy fit. Compare with > > nls(y2~B*exp(A*x), start=list(A=.1,B=.3)) > > Nonlinear regression model > model: y2 ~ B * exp(A * x) > data: parent.frame() > A B > 0.050 5.001 > residual sum-of-squares: 0.001398 > > Number of iterations to convergence: 13 > Achieved convergence tolerance: 5.073e-08 > > So either form works, but only one will give you a result > that fits your original data. > > <quote> > Henri Mone <henriMone <at> gmail.com> writes: > > > I want to fit to my data an exponential function with following > > functional form: > > y=exp(a*x) > > > > I used the function "nls" but this gives me exponential fits with > > following functional form: > > y=l*exp(a*x) > > > > With "l" being an scaling factor. What do I need to change in my R > code? > > > > t.dataFitModel=nls(t.dataForFitY ~exp(a*t.dataForFitX), > > data=t.dataForFit, start=list(a = 0.01242922), trace=TRUE, algorithm > = > > "plinear") > Use an algorithm other than "plinear", I think (admittedly this is > not at all clear from ?nls -- you would really have to go to the > references to find out). > -- > Sent from my Cray XK6 > "Pendeo-navem mei anguillae plena est."
Of course fitting y2 ~ 1.0*exp(A*x) to datatiplicativel generated by y2 <- 5*exp(x/20) + runif(101)/100 will result in a bad fit! Henri's original query stated that he wanted to fit y ~ exp(A*x), and I presume he had a reason for not including a multiplicative constant as in your y2 ~ B*exp(A*x). It may well be that he knows, for some reason, that, in B*exp(A*x), B must be 1, though he was certainly not explicit about this ! Generating the data with 1.0*exp(x/20) and then using nls in the form nls(y2 ~ exp(A*x) works perfectly: x <- 1:101 y2 <- 1.0*exp(x/20) + runif(101)/100 nls(y2 ~ exp(A*x), start=list(A=.1)) # Nonlinear regression model # model: y2 ~ exp(A * x) # data: parent.frame() # A # 0.05 # residual sum-of-squares: 0.002608 # # Number of iterations to convergence: 9 # Achieved convergence tolerance: 5.962e-08 So I would not say he was "misusing nls", since we do not have information about his data. Throwing up a counter-eaxample where the data are deliberately generated so as to be impossible to fit with the formula he wants to use (for whatever reason) is not a good argument! Hoping this helps, Ted. -------------------------------------------------------------------- E-Mail: (Ted Harding) <ted.hard...@wlandres.net> Fax-to-email: +44 (0)870 094 0861 Date: 23-Oct-11 Time: 21:22:53 ------------------------------ XFMail ------------------------------ ______________________________________________ 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.