[Rd] Re: [R] constrOptim and function with additional parameters? (PR#7088)

dmurdoch at pair.com dmurdoch at pair.com
Wed Jul 14 16:25:16 CEST 2004


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 at 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 at 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 at 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
>>



More information about the R-devel mailing list