[R] constrOptim and problem with derivative

Berend Hasselman bhh at xs4all.nl
Tue Dec 20 16:22:52 CET 2011


Berend Hasselman wrote
> 
> 
> Michael Griffiths wrote
>> 
>> Dear List,
>> 
>> I am using constrOptim to solve the following
>> 
>> fr1 <- function(x) {
>>     b0 <- x[1]
>>     b1 <- x[2]
>>     ((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
> 
> gradr <- function(x) {
>     b0 <- x[1]
>     b1 <- x[2]
>     grr(b0,b1)
> }
> 
> 

This is  incorrect.
The gradient function should return a vector. It was returning a scalar with
attributes.
The gradient function should be

# Correct
gradr <- function(x) {
    b0 <- x[1]
    b1 <- x[2]
    g <- grr(b0,b1)
    attr(g,"gradient")
}

and this looks better

gradr(c(-0.1,0.2))
str(gradr(c(-0.1,0.2)))
constrOptim(c(-0.1,0.2), fr1, gradr, ui=rbind(c(1,0),c(0,1)),
ci=c(-0.2,0.1)) 

I'm puzzled why constrOptim or optim didn't issue an error message in the
original case.

Berend




--
View this message in context: http://r.789695.n4.nabble.com/constrOptim-and-problem-with-derivative-tp4217531p4218207.html
Sent from the R help mailing list archive at Nabble.com.



More information about the R-help mailing list