[R] formula for nls

Christian Ritz ritz at life.ku.dk
Fri Jan 25 22:00:31 CET 2008


Hi Jarek,

an alternative approach is to provide more precise starting values!

It pays off to realise that it's possible to find quite good guesses 
for some of the parameters in your model function:

t ~ tr+    (ts-tr)/    ((1+    (a*h)^n)^(1-(1/n)))

The parameters tr and ts correspond to the response t for h equal to 
infinity and h=0. Therefore by looking at the plot of your data I 
would set:

tr = 0
ts = 15000

The parameter n must be above 1 in order to achieve a decreasing 
function. We will not think more about this at the moment.

For n somewhat larger than 1 (in which case I would approximate the 
exponent 1-(1/n) by 1) the parameter a is approximately equal to the 
reciprocal of the h value resulting in a response halfway between tr 
and ts. Therefore (again from looking at the plot) I would set a=10.

Using the above starting values and simply increasing n in steps of 1 
eventually results in a useful model fit:

## Fails
tmp.m1<-nls(t ~    tr+    (ts-tr)/    ((1+    (a*h)^n)^(1-(1/n))), 
data = tmp, start = list(a=10, n=1, tr=0, ts=15000))

## Fails
tmp.m1<-nls(t ~    tr+    (ts-tr)/    ((1+    (a*h)^n)^(1-(1/n))), 
data = tmp, start = list(a=10, n=2, tr=0, ts=15000))

## Works!!
tmp.m1<-nls(t ~    tr+    (ts-tr)/    ((1+    (a*h)^n)^(1-(1/n))), 
data = tmp, start = list(a=10, n=3, tr=0, ts=15000))

summary(tmp.m1)

plot(t ~ h, data = tmp)
lines(tmp$h, predict(tmp.m1))


I hope you can use this explanation?!

Christian



More information about the R-help mailing list