Exponential fit of form y=exp(a*x) and not of form y=l*e
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.harding at wlandres.net> Fax-to-email: +44 (0)870 094 0861 Date: 23-Oct-11 Time: 21:22:53 ------------------------------ XFMail ------------------------------