Prof J C Nash (U30A)
2015-Feb-26 13:07 UTC
[R] Help with nonlinear least squares regression curve fitting
Andrew's suggestion for Year is a help, but package nlmrt shows the problem you are trying to solve is truly one where there is a Jacobian singularity. (nlmrt produces the Jacobian singular values -- but read the output carefully because these are placed for compact output as if they correspond to parameters, which they do not). Unfortunately, nlmrt tries to use analytic derivatives, and sign() is not in the derivatives table for the double sigmoid. BTW, your function has a typo. Do provide reproducible results. Here is what I did using callaghan.csv: Area,Year 104.7181283,1984 32.88026974,1985 56.07395863,1986 191.3422143,1987 233.4661392,1988 57.28317116,1989 201.1273404,1990 34.42570796,1991 165.8962342,1992 58.21905274,1993 114.6643724,1994 342.3461986,1995 184.8877994,1996 94.90509356,1997 45.2026941,1998 68.6196393,1999 575.2440229,2000 519.7557581,2001 904.157509,2002 1107.357517,2003 1682.876061,2004 40.55667824,2005 740.5032604,2006 885.7243469,2007 395.4190968,2008 1031.314519,2009 2597.544987,2010 1316.968695,2011 848.7093901,2012 5076.675075,2013 6132.975491,2014 code: library(nlmrt) df <- read.csv("callaghan.csv") fitmodeliq <- nlxb(Area ~ (-a*Year)*(Year + b), data = df, start=list(a=1,b=1, c=1)) fitmodelsig <- nlxb(Area~a/(1+exp(-(b+c*Year))), data=df, start=list(a=1,b=1, c=1)) fitmodelds <- nlxb(Area ~ a+2*b*(1/(1+exp(-abs(-c*Year+d)))-1/2)*sign(-c*Year+d), data=df, start=list(a=1, b=1, c=1)) For information of readers, Duncan Murdoch and I have been working on nls14 to replace/augment nls(), but we've a way to go yet before this is ready for CRAN. Collaborators welcome. John Nash On 15-02-26 06:00 AM, r-help-request at r-project.org wrote:> Message: 24 > Date: Thu, 26 Feb 2015 07:26:50 +1100 > From: Andrew Robinson <A.Robinson at ms.unimelb.edu.au> > To: Corey Callaghan <ccallaghan2013 at fau.edu> > Cc: "R help \(r-help at r-project.org\)" <r-help at r-project.org> > Subject: Re: [R] Help with nonlinear least squares regression curve > fitting > Message-ID: > <CAHyGmd6rrUC_AOBHRHw7babXnMzrSbi4b7ZJt0vN5LRWVW2HAw at mail.gmail.com> > Content-Type: text/plain; charset="UTF-8" > > Finding starting values is a bit of a dark art. That said, there are steps > you can take, but it may take time. > > First, I would scale Year so that it's not in the thousands! Experiment > with subtracting 1980 or so. For specific advice, see inline. > > On Thu, Feb 26, 2015 at 3:03 AM, Corey Callaghan <ccallaghan2013 at fau.edu> > wrote: > >> > The curves' functions that I want to test are in the code here (hopefully >> > correctly): >> > >> > Inverse Quadratic Curve: >> > fitmodel <- nls(Area ~ (-a*Year)*(Year + b), data = df, start=list(a=??, >> > b=??, c=??)) >> > > I would plot the data and a smooth spline, differentiate the curve > function, identify some parameter values somewhere stable, and estimate > some values by eye, or even predict them from the first derivative of the > spline - spline.smooth will do this. > > Sigmodial Curve: >> > fitmodel <- nls(Area~a/(1+exp(-(b+c*Year))), data=df, start=list(a=???, >> > b=???, c=??)) >> > > I'd use the highest value as a, fit spline as above then invert area at two > times to get b and c. > > Double sigmoidal Curve: >> > fitmodel <- nls(Area~a+2b(1/(1+exp(-abs(-c*Year+d)))-1/2)*sign(-c*Year+d), >> > data=df, start=list(a=???, b=???, c=???) >> > > I'd use min(Area) as a, figure out b from the maximum (I guess 2b+a is the > asymptote), and experiment with two values for year to retrieve c and d > .... uniroot might help? > > Cheers > > Andrew > > -- Andrew Robinson Deputy Director, CEBRA, School of Biosciences Reader > & Associate Professor in Applied Statistics Tel: (+61) 0403 138 955 > School of Mathematics and Statistics Fax: +61-3-8344 4599 University of > Melbourne, VIC 3010 Australia Email: a.robinson at ms.unimelb.edu.au > Website: http://www.ms.unimelb.edu.au/~andrewpr MSME: > http://www.crcpress.com/product/isbn/9781439858028 FAwR: > http://www.ms.unimelb.edu.au/~andrewpr/FAwR/ SPuR: > http://www.ms.unimelb.edu.au/spuRs/ [[alternative HTML version deleted]]