Paul Cuckoo Paul Cuckoo - 1 month ago 15
R Question

Struggling with simple constraints in constrOptim

I have a function in R that I wish to maximise subject to some simple constraints in

optim
or
constrOptim
, but I'm struggling to get my head around
ci
and
ui
to fit my constraints.

My function is:

negexpKPI <- function(alpha,beta,spend){

-sum(alpha*(1-exp(-spend/beta)))

}


where
alpha
and
beta
are fixed vectors, and
spend
is a vector of spends
c(sp1,sp2,...,sp6)
which I want to vary in order to maximise the output of
negexpKPI
. I want to constrain
spend
in three different ways:

1) Min and max for each
sp1,sp2,...,sp6
, i.e

0 < sp1 < 1000000

5000 < sp2 < 1000000

...

2) A total sum:

sum(spend)=90000000


3) A sum for some individual components:

sum(sp1,sp2)=5000000


Any help please? Open to any other methods that would work but would prefer base R if possible.

Answer

According to ?constrOptim:

The feasible region is defined by ‘ui %*% theta - ci >= 0’. The
starting value must be in the interior of the feasible region, but
the minimum may be on the boundary.

So it is just a matter of rewriting your constraints in matrix format. Note, an identity constraint is just two inequality constraints.

enter image description here

Now we can define in R:

## define by column
ui = matrix(c(1,-1,0,0,1,-1,1,-1,
              0,0,1,-1,1,-1,1,-1,
              0,0,0,0,0,0,1,-1,
              0,0,0,0,0,0,1,-1,
              0,0,0,0,0,0,1,-1,
              0,0,0,0,0,0,1,-1), ncol = 6)

ci = c(0, -1000000, 5000, -1000000, 5000000, 90000000, -90000000)
Comments