[R] constrOptim converging not to the optimal values
Carlo Fezzi
c.fezzi at uea.ac.uk
Mon May 19 18:22:48 CEST 2008
Dear helpers,
I am using constrOptim to minimize a function subject to inequality
constraint. It works well when the number of parameters to optimize is low
(e.g. 4) but when they are more (e.g. 10) it does not produce the expected
results.
The function is minus the determinant of a binomial logit model with one
explanatory variable.
Calling xeta the vector of explanatory variables the function to be
optimized is:
negdet<-function(xeta)
{
pi <- exp(a + b* xeta)/(1+exp(a + b* xeta))
-( sum(pi*(1-pi))*sum(pi*(1-pi)*xeta^2) - sum(pi*(1-pi)*xeta)^2 )
}
With a intercept and b parameter of xeta in a standard binomial logit,
i.e. p(i) = exp(a + b * xeta(i)) / (1 + exp(a + b*xeta(i) ) . I assume
each element of xeta bounded between 0 and 10 and, in order to obtain an
unique solution, I give an order to the elements of xeta (i.e. xeta(1) <
xeta(2) < ... xeta(N)).
The solution should be to fix half of the elements of xeta to the values
that make the probability pi = 0.18 and half of them to the values that make
pi = 0.82. This maximizes the determinant. For xeta constituted by only few
elements (e.g. 2 or 4) constrOptim works well, but when the number of
elements increases (e.g. 10) the procedure does not converge to the optimal
values.
Here is the code, with sample size = 4 and a = 5 and b= -2 the results are
correct:
$par
[1] 3.272623 3.270943 1.727875 1.727867
$convergence
[1] 0
But with sample size = 10, the optimization have problems:
$par
[1] 9.999999 9.999998 7.396835 3.281640 3.278376 3.277607 3.276871 1.737043
[9] 1.736261 1.732932
$convergence
[1] 0
I would be extremely grateful if anybody could point out a reason for this
and in particular if you could suggest any other procedure I could use to
solve this optimization problem.
Thanks a lot for your kindness,
Carlo
The code is below.
#### SAMPLE SIZE
N <- 4
####
a<- 5
b<- -2
negdet<-function(xeta)
{
pi <- exp(a + b* xeta)/(1+exp(a + b* xeta))
-( sum(pi*(1-pi))*sum(pi*(1-pi)*xeta^2) - sum(pi*(1-pi)*xeta)^2 )
}
### BOUNDS
low <- 0
high <- 10
###
### MATRIX REPRESENTAION OF THE CONSTRAINTS
order<-c(rep(c(1,-1,rep(0,times=N-1)),N-2),1,-1)
u1 <- matrix(order,ncol=N, nrow=N-1, byrow=TRUE)
bounds <- c(rep(c(1,-1,rep(0,times=N*2)),N-1),1,-1)
u2 <- matrix(bounds, ncol=N,nrow=N*2)
u.s <-rbind(u1,u2)
c.s <-c(rep(0,N-1),rep(c(low,-high),N))
####
#### OPTIMIZATION
a<-constrOptim(outer.iteration = 500, control = list(maxit=10000),
theta=(high-low)/(N+1)* N:1, f=negdet, ui = u.s, ci=c.s,
method="Nelder-Mead")
####
**************************************************
Carlo Fezzi
Senior Research Associate
Centre for Social Research on the Global Environment (CSERGE)
Department of Environmental Sciences
University of East Anglia
Norwich (UK) NR2 7TJ
Telephone: +44(0)1603 591408
Fax: +44(0)1603 593739
More information about the R-help
mailing list