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.
Of course, one may not really want to do any statistics with 4
observations and 3 parameters, but the problem illustrates the GN vs.
Marquardt directions.
JN
> sol<-nlxb(y ~ exp(a + b*x)+d,start=list(a=0,b=0,d=1), data=mydata,
trace=T)
formula: y ~ exp(a + b * x) + d
lower:[1] -Inf -Inf -Inf
upper:[1] Inf Inf Inf
...snip...
Data variable y :[1] 0.8 6.5 20.5 45.9
Data variable x :[1] 60 80 100 120
Start:lamda: 1e-04 SS= 2291.15 at a = 0 b = 0 d = 1 1 / 0
gradient projection = -2191.093 g-delta-angle= 90.47372
Stepsize= 1
lamda: 0.001 SS= 4.408283e+55 at a = -25.29517 b = 0.74465 d =
-24.29517 2 / 1
gradient projection = -2168.709 g-delta-angle= 90.48307
Stepsize= 1
lamda: 0.01 SS= 3.986892e+54 at a = -24.55223 b = 0.7284461 d =
-23.55223 3 / 1
gradient projection = -1991.804 g-delta-angle= 90.58199
Stepsize= 1
lamda: 0.1 SS= 2.439544e+46 at a = -18.71606 b = 0.6010118 d =
-17.71606 4 / 1
gradient projection = -1476.935 g-delta-angle= 92.79733
Stepsize= 1
lamda: 1 SS= 4.114152e+23 at a = -2.883776 b = 0.2505892 d =
-1.883776 5 / 1
gradient projection = -954.5234 g-delta-angle= 91.78881
Stepsize= 1
lamda: 10 SS= 39033042903 at a = 2.918809 b = 0.07709855 d =
3.918809 6 / 1
gradient projection = -264.9953 g-delta-angle= 91.41647
Stepsize= 1
<<lamda: 4 SS= 571.451 at a = 1.023367 b = 0.01762421 d = 2.023367
7 / 1
gradient projection = -60.46016 g-delta-angle= 90.96421
Stepsize= 1
<<lamda: 1.6 SS= 462.3257 at a = 1.080764 b = 0.0184132 d =
1.981399 8 / 2
gradient projection = -56.91866 g-delta-angle= 90.08103
Stepsize= 1
<<lamda: 0.64 SS= 359.6233 at a = 1.135265 b = 0.01942354 d =
0.9995471 9 / 3
gradient projection = -65.90027 g-delta-angle= 90.04527
Stepsize= 1
... snip ...
lamda: 0.2748779 SS= 0.5742948 at a = -0.1491842 b = 0.03419761 d =
-6.196575 31 / 20
gradient projection = -6.998402e-25 g-delta-angle= 90.07554
Stepsize= 1
lamda: 2.748779 SS= 0.5742948 at a = -0.1491842 b = 0.03419761 d =
-6.196575 32 / 20
gradient projection = -2.76834e-25 g-delta-angle= 90.16973
Stepsize= 1
lamda: 27.48779 SS= 0.5742948 at a = -0.1491842 b = 0.03419761 d =
-6.196575 33 / 20
gradient projection = -4.632864e-26 g-delta-angle= 90.08759
Stepsize= 1
No parameter change
On 13-03-15 07:00 AM, r-help-request at r-project.org
wrote:> Message: 36
> Date: Thu, 14 Mar 2013 11:04:27 -0400
> From: Gabor Grothendieck<ggrothendieck at gmail.com>
> To: meng<laomeng_3 at 163.com>
> Cc: R help<r-help at r-project.org>
> Subject: Re: [R] question about nls
> Message-ID:
> <CAP01uRmoDFN87QQvTWMaTuid0FX0d7LqMFqh4ChoFm5B2C9-tQ at
mail.gmail.com>
> Content-Type: text/plain; charset=ISO-8859-1
>
> On Thu, Mar 14, 2013 at 5:07 AM, meng<laomeng_3 at 163.com> wrote:
>> >Hi,all:
>> >I met a problem of nls.
>> >
>> >My data:
>> >x y
>> >60 0.8
>> >80 6.5
>> >100 20.5
>> >120 45.9
>> >
>> >I want to fit exp curve of data.
>> >
>> >My code:
>>> >>nls(y ~ exp(a + b*x)+d,start=list(a=0,b=0,d=1))
>> >Error in nlsModel(formula, mf, start, wts) :
>> > singular gradient matrix at initial parameter estimates
>> >
>> >I can't find out the reason for the error.
>> >Any suggesions are welcome.
>> >
> The gradient is singular at your starting value so you will have to
> use a better starting value. If d = 0 then its linear in log(y) so
> you can compute a starting value using lm like this:
>
> lm1 <- lm(log(y) ~ x, DF)
> st <- setNames(c(coef(lm1), 0), c("a", "b",
"d"))
>
> Also note that you are trying to fit a model with 3 parameters to only
> 4 data points.
>
> --
> Statistics & Software Consulting
> GKX Group, GKX Associates Inc.
> tel: 1-877-GKX-GROUP
> email: ggrothendieck at gmail.com