From rpeng at jhsph.edu  Wed Jul 14 16:38:34 2004
From: rpeng at jhsph.edu (rpeng@jhsph.edu)
Date: Wed Jul 14 16:38:41 2004
Subject: [Rd] Re: [R] constrOptim and function with additional parameters?
	(PR#7089)
Message-ID: <20040714143834.5893F108BC@slim.kubism.ku.dk>

Okay, looking at the docs, then it's not a bug, since the "..." 
argument is not actually documented as "other arguments passed to f or 
grad".  However, that *is* how it's document in `optim', so one can 
see how this might cause some confusion.

Now, it's not clear to me which other arguments need to be passed to 
`optim' except perhaps `hessian'.  Am I missing something?

-roger

Duncan Murdoch wrote:
> I've moved this from r-help to r-bugs.  If you reply, please be
> careful that replies go to the right place:  r-bugs if your comment is
> specifically about the bug (and it contains the PR# in the subject
> that will be added when this is cc'd to r-devel), r-devel if general
> discussion, not both.
> 
> On Wed, 14 Jul 2004 10:01:45 -0400, "Roger D. Peng" <rpeng@jhsph.edu>
> wrote :
> 
> 
>>Actually, I think this is a bug.  Take a look at this part of constrOptim:
> 
> 
> This is the problem all right, but it's a little tricky to fix.  The
> problem is that "..." is documented as being additional parameters to
> pass through to optim().  You don't want to pass all of those to f(),
> only the ones that don't match optim()'s arg list.  (And that has to
> be done carefully, because of partial argument matching.)
> 
> I don't know of other cases where we edit the "..." list before
> passing it onwards.  Are there any?
> 
> 
>>>constrOptim
>>
>>function (theta, f, grad, ui, ci, mu = 1e-04, control = list(),
>>    method = if (is.null(grad)) "Nelder-Mead" else "BFGS", 
>>outer.iterations = 10
>>0,
>>    outer.eps = 1e-05, ...)
>>{
>>    if (!is.null(control$fnscale) && control$fnscale < 0)
>>        mu <- -mu
>>    [...]
>>    obj <- f(theta)
>>    ^^^^^^^^^^^^^^^
>>    r <- R(theta, theta)
>>    for (i in 1:outer.iterations) {
>>        obj.old <- obj
>>        r.old <- r
>>    [...]
>>}
>>
>>So the object function `f' is called on the starting value `theta' but 
>>the `...' is not passed through.
>>
>>-roger
>>
>>Duncan Murdoch wrote:
>>
>>>On Wed, 14 Jul 2004 14:59:01 +0200 (MEST), "Marlene Mueller"
>>><Marlene.Mueller@gmx.de> wrote :
>>>
>>>
>>>
>>>>How can I use a function with some additional input parameters
>>>>in constrOptim? For example, something like
>>>>
>>>>fr <- function(x,a) {   ## Rosenbrock Banana function
>>>>x1 <- x[1]
>>>>x2 <- x[2]
>>>>a * (x2 - x1 * x1)^2 + (1 - x1)^2
>>>>}
>>>>
>>>>where the optimum is to be found w.r.t. x. Calling
>>>>optim(c(-1.2,1), fr, NULL, a=100) works as expected, but I fail 
>>>>to provide the a=100 in the constrained case:
>>>>
>>>>
>>>>
>>>>>constrOptim(c(-1.2,0.9), fr, NULL, ui=rbind(c(-1,0),c(0,-1)),
>>>>
>>>>ci=c(-1,-1),a=100)
>>>>Error in f(theta) : Argument "a" is missing, with no default
>>>>
>>>>Is this a bug or is there a different solution that I miss here?
>>>
>>>
>>>I can't spot why your use of constrOptim isn't working, but you should
>>>be able to workaround it by doing something  like this:
>>>
>>>applyDefaults <- function(fn, ...) {
>>>  function(x) fn(x, ...)
>>>}
>>>
>>>constrOptim(c(-1.2,0.9), applyDefaults(fr, a=100), NULL,
>>>ui=rbind(c(-1,0),c(0,-1)),ci=c(-1,-1))
>>>
>>>The applyDefaults function creates a new function which evaluates the
>>>old one with some of the parameters set to fixed values.
>>>
>>>Duncan Murdoch
>>>
>>>______________________________________________
>>>R-help@stat.math.ethz.ch mailing list
>>>https://www.stat.math.ethz.ch/mailman/listinfo/r-help
>>>PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
>>>
> 
> 
>


[Rd] Re: [R] constrOptim and function with additional parameters? (PR#7089)
rpeng@jhsph.edu