[R] Parameter names in nls
Rolf Turner
r.turner at auckland.ac.nz
Mon Jul 21 22:30:36 CEST 2008
On 22/07/2008, at 3:49 AM, rhelp.20.trevva at spamgourmet.com wrote:
> Dear R-help,
>
> Could you please examine the following code, and see if I have
> discovered a bug or not, or am just doing something silly.
>
> I am trying to create a package to do fish stock assessment using
> the nls() function to fit the modelled stock size to the various
> pieces of information that we have. The main problem with this sort
> of task is that the number and type of parameters that go into the
> model are highly variable between stocks, but the method needs to
> be "intelligent" enough to handle this. The way I have chosen to
> handle this is through the names in my parameter vector, and using
> code inside the objective function to figure out which parameter is
> which.
>
> The problem I have encountered is that I don't think nls() always
> passes a named vector - indeed, after the first set of function
> evaluations, it drops the names from the parameters vector
> altogether. I believe this to be a bug - it certaintly plays havoc
> with my code!
>
> As a demonstration of this problem, consider the piece of code
> below. It is basically fitting a straight line to some synthetic
> data (with noise). I have setup the objective function so that it
> prints the names of the parameters every time that it is called. As
> you can see, the names are there to begin with, but rapidly
> disappear after the first "step" is made.
>
> Is this a bug? Or is it intended behaviour? Or is this a completely
> daft approach I am taking?
I think the latter. You are simply not using nls correctly. Try
fit <- nls(data.y ~ a + b*data.x, start=ips)
(and compare with the result of lm(data.y ~ data.x)).
cheers,
Rolf Turner
>
> I look forward to your comments.
>
> cheers,
>
> Mark
>
>
>
> rm(list=ls())
> fitting.fn <-function(x,params) {
> #The model - so that it works
> y <- params[1] + x*params[2]
> #How I would prefer it to work
> # y <- params["a"] + x*params["b"]
>
> #Display information about function eval
> cat(paste("Evaluation # :",counter,"\t Names :"))
> print(names(params))
> counter <<- counter +1
> return(y)
> }
> counter <<- 1
>
> data.x <- 1:50
> data.y <- pi*data.x + rnorm(50,sd=20)
> plot(data.x,data.y)
> ips <- c(a=0,b=0)
> nls("data.y~fitting.fn(data.x,params)",data=data.frame(data.x,data.y),
> start=list(params=ips),trace=TRUE,control=nls.control(tol=1e-8))
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-
> guide.html
> and provide commented, minimal, self-contained, reproducible code.
######################################################################
Attention:\ This e-mail message is privileged and confid...{{dropped:9}}
More information about the R-help
mailing list