[R] question about nls
Prof J C Nash (U30A)
nashjc at uottawa.ca
Fri Mar 15 15:30:29 CET 2013
As Gabor indicates, using a start based on a good approximation is
usually helpful, and nls() will generally find solutions to problems
where there are such starts, hence the SelfStart methods. The Marquardt
approaches are more of a pit-bull approach to the original
specification. They grind away at the problem without much finesse, but
generally get there eventually. If one is solving lots of problems of a
similar type, good starts are the way to go. One-off (or being lazy), I
like Marquardt.
It would be interesting to know what proportion of random starting
points in some reasonable bounding box get the "singular gradient"
message or other early termination with nls() vs. a Marquardt approach,
especially as this is a tiny problem. This is just one example of the
issue R developers face in balancing performance and robustness. The GN
method in nls() is almost always a good deal more efficient than
Marquardt approaches when it works, but suffers from a fairly high
failure rate.
JN
On 13-03-15 10:01 AM, Gabor Grothendieck wrote:
> On Fri, Mar 15, 2013 at 9:45 AM, Prof J C Nash (U30A) <nashjc at uottawa.ca> wrote:
>> Actually, it likely won't matter where you start. The Gauss-Newton direction
>> is nearly always close to 90 degrees from the gradient, as seen by turning
>> trace=TRUE in the package nlmrt function nlxb(), which does a safeguarded
>> Marquardt calculation. This can be used in place of nls(), except you need
>> to put your data in a data frame. It finds a solution pretty
>> straightforwardly, though with quite a few iterations and function
>> evaluations.
>>
>
> Interesting observation but it does converge in 5 iterations with the
> improved starting value whereas it fails due to a singular gradient
> with the original starting value.
>
>> Lines <- "
> + x y
> + 60 0.8
> + 80 6.5
> + 100 20.5
> + 120 45.9
> + "
>> DF <- read.table(text = Lines, header = TRUE)
>>
>> # original starting value - singular gradient
>> nls(y ~ exp(a + b*x)+d,DF,start=list(a=0,b=0,d=1))
> Error in nlsModel(formula, mf, start, wts) :
> singular gradient matrix at initial parameter estimates
>>
>> # better starting value - converges in 5 iterations
>> lm1 <- lm(log(y) ~ x, DF)
>> st <- setNames(c(coef(lm1), 0), c("a", "b", "d"))
>> nls(y ~ exp(a + b*x)+d, DF, start=st)
> Nonlinear regression model
> model: y ~ exp(a + b * x) + d
> data: DF
> a b d
> -0.1492 0.0342 -6.1966
> residual sum-of-squares: 0.5743
>
> Number of iterations to convergence: 5
> Achieved convergence tolerance: 6.458e-07
>>
More information about the R-help
mailing list