[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