Gene Leynes
2009-Mar-25 16:26 UTC
[R] constrOptim workaround for "L-BFGS-B" or Box Constraints
This is not so much a question as a contribution, but comments are welcome.
Comments:
1) thank you very much to Paul Smith in the post
https://stat.ethz.ch/pipermail/r-help/2008-March/157249.html
This is intended to build on that example with something more complex
than
a 2x2 set of constraints
2) "L-BFGS-B" does not appear to work in optimConst
Problem:
let's say you have a function
y= a + b1*x1 + b2*x2 + b3*x3 + b4*x4
and you want to minimize (where b and x are the matrices of the b's and
x's)
error = (a + b %*% x - y) ^ 2
subject to the constraints
sum(b) = 1
0<b<1
The code:
# rm(list=ls())
# FULL ON EXAMPLE
# MASTER FORMULA: ui %*% theta >= ci
# STEP 1: CREATE DATA
x=matrix(rnorm(45),nrow=9)/100
y=matrix(rnorm(9),nrow=9)/100
thetas=matrix(1/5,nrow=5)
# STEP 2: DEFINE ERROR FUNCTION
fn=function(ws){
t(x) %*% y
sum((x %*% ws-y)^2)
}
# STEP 3: DEFINE CONSTRAINTS
a=rbind(c(0, 1, 1, 1, 1),c(0,-1,-1,-1,-1))
temp=cbind(0,rbind(diag(4),-diag(4)))
adj=c(1.0000001,.9999999)
a=rbind(a*adj,temp)
b=c(1,-1,rep(0,4),rep(-1,4))
# STEP 3: DEFINE INITIAL STARTING POINT
thetas=matrix(c(1/5,1/4,1/4,1/4,1/4),nrow=5)
# STEP 3 (ALT): DEFINE INITIAL STARTING POINT
#thetas=matrix(runif(5),nrow=5)
#thetas[2:5]=thetas[2:5]/sum(thetas[2:5])
# ((TESTING, make sure at<b))
list('ci'=a,'ui'=b,data.frame('t'=thetas,'at'=a%*%thetas,'atb'=a%*%thetas-b))
# STEP 4: OPTIMIZATION
o=constrOptim(thetas,fn,grad=NULL,ui=a,ci=b)
o
o$par
sum(o$par)-o$par[1]
[[alternative HTML version deleted]]
Reasonably Related Threads
- constrOptim with method = "L-BFGS-B"
- choosing constraints for function optim method="L-BFGS-B" whenthey are in terms of other parameter values
- choosing constraints for function optim method="L-BFGS-B" when they are in terms of other parameter values
- Method of L-BFGS-B of optim evaluate function outside of box constraints
- EQUALITY constraints in 'constrOptim'
