# [R] constrOptim and problem with derivative

Berend Hasselman bhh at xs4all.nl
Tue Dec 20 14:26:45 CET 2011

```Michael Griffiths wrote
>
> Dear List,
>
> I am using constrOptim to solve the following
>
> fr1 <- function(x) {
>     b0 <- x
>     b1 <- x
>     ((1/(1+exp(-b0+b1))+(1/(1+exp(-b0)))+(1/(1+exp(-b0-b1)))))/3
> }
>
> As you can see, my objective function is
> ((1/(1+exp(-b0+b1))+(1/(1+exp(-b0)))+(1/(1+exp(-b0-b1)))))/3 and I would
> like to solve for both b0 and b1.
>
> If I were to use optim then I would derive the gradient of the function
> (grr) as follows:
>
> fr2 <-
> expression(((1/(1+exp(-b0+b1))+(1/(1+exp(-b0)))+(1/(1+exp(-b0-b1)))))/3)
> grr <- deriv(fr2,c("b0","b1"), func=TRUE)
>
> and then simply use optim via
>
> optim(c(-5.2,0.22), fr1, grr)
>
> My problem is that I wish to place constraints (b0>=-0.2 and b1>= 0.1)
> upon
> the values of b0 and b1. I can set the constraints matrix and boundary
> values to
>
> ui=rbind(c(1,0),c(0,1)) and ci=c(-0.2,0.1), however, when I come to run
> constrOptim function via
>
>
> constrOptim(c(-0.1,0.2), fr1, grr, ui=rbind(c(1,0),c(0,1)),
> ci=c(-0.2,0.1))
>
> I get the following error message:
>
> "Error in .expr1 + b1 : 'b1' is missing"
>
> So, it seems to me that I am doing something incorrectly in my
> specification of grr in constrOptim.
>

grr is a function with two arguments. Do this

grr

and then you will see.
But the gradient function passed to constrOptim wants a function with a
vector argument.

So if you do

b0 <- x
b1 <- x
grr(b0,b1)
}

and after testing with

this should work