Re: [R] optim, constrOptim: setting some parameters equal to each other

From: Katharine Mullen <kate_at_few.vu.nl>
Date: Sun, 08 Jun 2008 23:24:38 +0200 (CEST)

the example I just mailed had an error; it should have been:

## objective function that depends on all parameters, here a, b, c obfun <- function(a,b,c,dd)

    sum((dd - (exp(a * 1:100) + exp(b * 1:50) + exp(c * 1:25) ))^2)

fr <- function(x, eqspec, dd, obfun) {
  ## assign variables for parameter values given in x   for(i in 1:length(x))
    assign(names(x)[i], x[[i]])
  ## use eqspec to assign parameter values determined w/equality constr.   for(i in 1:length(eqspec))
    assign( names(eqspec)[i], x[[ eqspec[[i]] ]])   ## now have all parameter values, call objective function   obfun(a,b,c,dd)
}

dd <- exp(-.05 * 1:100) + exp(-.05 * 1:50) + exp(.005 * 1:25)

## let par contain all parameters that are not constrained and ## all parameters on right side of constraints of form a=b

## let eqspec give all dependent parameters on left side of
## the constraints of form a=b
## e.g.
## for constraint a=b
xx <- optim(par=list(b=-4, c=-.1), fn=fr, eqspec=list(a="b"),
            dd=dd, obfun=obfun)

## for constraint b=a
x1 <- optim(par=list(a=-3, c=-.1), fn=fr, eqspec=list(b="a"),

            dd=dd, obfun=obfun)

On Sun, 8 Jun 2008, Katharine Mullen wrote:

> Here is an example w/optim where you have an objective function
> F(x) where you have (possibly a few) constraints of form x_i=x_j, and you
> can specify the constraints flexibly, which is what I _think_ you want.
> An example from you would have been nice.
>
> ## objective function that depends on all parameters, here a, b, c
> obfun <- function(a,b,c,dd)
> sum((dd - (exp(a * 1:100) + exp(b * 1:50) + exp(c * 1:25) ))^2)
>
> ## fn for optim
> fr <- function(x, eqspec, dd, obfun) {
> ## assign variables for parameter values given in x
> for(i in 1:length(x))
> assign(names(x)[i], x[[i]])
> ## use eqspec to assign parameter values determined w/equ. constr.
> for(i in 1:length(eqspec))
> assign( names(eqspec)[i], x[[ eqspec[[i]] ]])
> ## now have all parameter values, call objective function
> obfun(a,b,c,d, dd)
> }
>
> dd <- exp(-.05 * 1:100) + exp(-.05 * 1:50) + exp(.005 * 1:25)
>
> ## let par contain all parameters that are not eq. constrained and
> ## all parameters on right side of constraints of form a=b
>
> ## let eqspec give all dependent parameters on left side of
> ## the constraints of form a=b
>
> ## e.g.
> ## for constraint a=b
> xx <- optim(par=list(b=-4, c=-.1), fn=fr, eqspec=list(a="b"),
> dd=dd, obfun=obfun)
>
> ## for constraint b=a
> x1 <- optim(par=list(a=-4, c=-.1), fn=fr, eqspec=list(b="a"),
> dd=dd, obfun=obfun)
>
> On Sun, 8 Jun 2008, Alex F. Bokov wrote:
>
> > Hello, and apologies for the upcoming naive questions. I am a biologist
> > who is trying to teach himself the appropriate areas of math and stats.
> > I welcome pointers to suggested background reading just as much as I do
> > direct answers to my question.
> >
> > Let's say I have a function F() that takes variables (a,b,c,a1,b1,c1)
> > and returns x, and I want to find the values of these variables that
> > result in a minimum value of x. That's a straightforward application of
> > optim(). However, for the same function I also need to obtain values
> > that return the minimum value of x subject to the following constraints:
> > a=a1, b=b1, c=c1, a=a1 && b=b1, a=a1 && c=c1, ... and so on, for any
> > combination of these constraints including a=a1, b=b1, c=c1. The brute
> > force way to do this with optim() would be to write into F() an immense
> > switch statement anticipating every possible combination of constrained
> > variables. Obviously this is inefficient and unmaintainable. Therefore,
> > my question is:
> >
> > Is the purpose of constrOptim() this exact type of problem? If so, how
> > does one express the constraint I described above in terms of the ui,
> > ci, and theta parameters? Are there any introductory texts I should have
> > read for this to be obvious to me from constrOptim's documentation?
> >
> > If constrOptim() is not the answer to this problem, can anybody suggest
> > any more elegant alterntives to the switch-statement-from-hell approach?
> >
> > Thank you very, very much in advance. I thought I understood R
> > reasonably well until I started banging my head against this problem!
> >
> > ______________________________________________
> > 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.
> >
>
> ______________________________________________
> 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.
>



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. Received on Sun 08 Jun 2008 - 21:36:52 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Sun 08 Jun 2008 - 23:30:47 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.

list of date sections of archive