Duncan has given a indication of why nls() has troubles, and you have found a
way to work
around the problem partially. However, you may like to try nlmrt (from R-forge
project
R-forge.r-project.org/R/?group_id=395
It is intended to be very aggressive in finding a solution, and also to deal
with small
residual problems that are really not statistical in nature i.e., nonlinear
least squares
but not nonlinear regression. Note that there is a function wrapnls() if you
want the
nls() output structure which is very useful for modeling. nlmrt::nlxb is closer
to an
optimization method.
I'd be interested to know if you find the solution found by nlmrt is useful
in your context.
----------------------------------------------
require(nlmrt)
nlsfit2<- nlxb(data=dd, y ~ 1/2 * ( 1- tanh((x - ttt)/smallc) * exp(-x /
tau2) ),
start=list(ttt=0.4, tau2=0.1) ,
trace=TRUE)
----------------------------------------------
Best, JN
On 07/12/2012 06:00 AM, r-help-request at r-project.org
wrote:> From: Jonas Stein <news at jonasstein.de>
> To: <r-help at stat.math.ethz.ch>
> Subject: [R] nls problem: singular gradient
> Message-ID: <e8h0d9-ao4.ln1 at news.jonasstein.de>
> Content-Type: text/plain
>
> Why fails nls with "singular gradient" here?
> I post a minimal example on the bottom and would be very
> happy if someone could help me.
> Kind regards,
>
> ###########
>
> # define some constants
> smallc <- 0.0001
> t <- seq(0,1,0.001)
> t0 <- 0.5
> tau1 <- 0.02
>
> # generate yy(t)
>
> yy <- 1/2 * ( 1- tanh((t - t0)/smallc) * exp(-t / tau1) ) +
rnorm(length(t))*0.01
>
> # show the curve
>
> plot(x=t, y=yy, pch=18)
>
> # prepare data
>
> dd <- data.frame(y=yy, x=t)
>
> nlsfit <- nls(data=dd, y ~ 1/2 * ( 1- tanh((x - ttt)/smallc) * exp(-x
/ tau2) ), start=list(ttt=0.4, tau2=0.1) , trace=TRUE)
>
> # get error:
> # Error in nls(data = dd, y ~ 1/2 * (1 - tanh((x - ttt)/smallc) *
exp(-x/tau2)), :
> # singular gradient
>
> -- Jonas Stein <news at jonasstein.de> ----------------------------