Skip to content

Exponential fit of form y=exp(a*x) and not of form y=l*exp(a*x)

2 messages · Carl Witthoft, (Ted Harding)

#
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).
#
On 23-Oct-11 19:03:05, Carl Witthoft wrote:
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 ------------------------------