From ripley at stats.ox.ac.uk  Tue Jul 22 11:50:07 2008
From: ripley at stats.ox.ac.uk (Prof Brian Ripley)
Date: Tue, 22 Jul 2008 10:50:07 +0100 (BST)
Subject: [Rd] Parameter names in nls()
In-Reply-To: <77d47f530807220226n7a210879ja06d30bbe7ee76e2@mail.gmail.com>
References: <77d47f530807220226n7a210879ja06d30bbe7ee76e2@mail.gmail.com>
Message-ID: <alpine.LFD.1.10.0807221041040.23268@auk.stats.ox.ac.uk>

They are not 'stripped': nothing says that because you named the starting 
value that other values will be named.

You are misusing nls(): the documented way would be to have

data.x <- 1:50
data.y <- pi*data.x + rnorm(50,sd=20)
fitting.fn <-function(x, a, b) a + b*x
nls(data.y ~ fitting.fn(data.x, a, b),data=data.frame(data.x,data.y),
     start=list(a=0, b=0),trace=TRUE,control=nls.control(tol=1e-8))


On Tue, 22 Jul 2008, Mark Payne wrote:

> Dear R-dev,
>
> I have been having some problems with regards to names in the parameter
> vector being stripped when passed to the objective function when using
> nls(). I was relieved to find that it wasn't me, and that this behaviour has
> previously been reported in optim() also. See eg
> https://stat.ethz.ch/pipermail/r-devel/2006-March/036710.html

Note that you are quoting a comment about a different function in a long 
obsolete version of R, with a very different interface.  That's called 
'clutching at straws'.

> The solution at that time was to make a change so that vector passed into
> the objective function was named (eg see following two discussions).
>
> The problem that I am having is virtually identical, but is occuring with
> nls() instead of optim(). To illustrate the problem, I have put together the
> following example code (see bottom). Basically, it is doing a linear least
> squares by hand, but it also displays the names associated on the parameters
> vector - if you run it, you will see that the names are there for the first
> few function evaluations, but after the first "step", the names are dropped.
>
> I was wondering if I could please ask for a similar fix as that applied to
> optim() to be carried across to nls() also?
>
> Many thanks,
>
> Mark
>
>
> #Setup environment
> rm(list=ls())
> counter <- 1
>
> #Objective function for nls
> fitting.fn <-function(x,params) {
>  #The model - so that it works
>  y <- params[1] + x*params[2]
>  #Referring to the parameters this way stops working after the first "step"
> #  y <- params["a"] + x*params["b"]
>
>  #Display information about function eval and parameter names
>  cat(paste("Evaluation # :",counter,"\t Names :"))
>  print(names(params))
>  counter <<- counter +1
>  return(y)
> }
>
> #Synthetic data
> data.x <- 1:50
> data.y <- pi*data.x + rnorm(50,sd=20)
>
> #Fit objective function
> 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))
>
> 	[[alternative HTML version deleted]]
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595



[Rd] Parameter names in nls()
Prof Brian Ripley