Earlier, I posted a question concerning the syntax of nls() when the
nonlinear function within the call is specified outside of nls().
Sundar showed me how to do this.  Now I have a slightly more complex
problem that is analogous to a broken-stick regression but in a
non-linear context.

 

I want my data to be fit to a non-rectangular hyperbola if the value of
the independent variable (I) is less than some value (“Icut”, to be
estimated) and to be fit to a constant value (to be estimated) if the
value of the independent variable is greater than or equal to “Icut”.
That is, if the value of the independent variable is less than Icut,
then fit the non-rectangular hyperbola, otherwise fit a constant.  

Here is the function that I wrote.  “a” is the non-rectangular hyperbola
and “b” is the constant.  When I give this to nls() I get an error
message stating:

Error in nlsModel(formula, mf, start) : singular gradient matrix at
initial parameter estimates

 

> NRHyperbolic.cut

function (Am,alpha,theta,Rd,I,Icut,const) 

{

b<-rep(1e6,length(I))

yes<- (I>=Icut)

vec<-as.numeric(yes)

a<-(1/(2*theta))*(alpha*I+Am-sqrt((alpha*I+Am)^2-4*theta*alpha*I*Am))-Rd

b[yes]<-vec[yes]*rep(const,length(I[yes]))

apply(cbind(a,b),1,min)

}

 

This is a non-rectangular hyperbola (a)

 

Bill Shipley

Subject Matter Editor, Ecology

North American Editor, Annals of Botany

Département de biologie, Université de Sherbrooke,

Sherbrooke (Québec) J1K 2R1 CANADA

Bill.Shipley@USherbrooke.ca

 <http://callisto.si.usherb.ca:8080/bshipley/>
http://callisto.si.usherb.ca:8080/bshipley/

 


	[[alternative HTML version deleted]]


