问题
I am trying to use constrOptim package. Here is my set up:
test_func <- function(x){
return((x%*%x)[1,1])
}
constrOptim(rep(1/3,3), f=test_func,grad = NULL,
ui = rbind(diag(3),rep(1, 3), rep(-1,3)),
ci = c(rep(0,3),1,-1), method = "Nelder-Mead")
it generates error:
Error in constrOptim(rep(1/3, 3), f = test_func, grad = NULL, ui = rbind(diag(3), : initial value is not in the interior of the feasible region
it is easy to check that my initial value is in the interior of the feasible region (which is from docs: ui %*% theta - ci >= 0)
constrOptim
ui %*% rep(1/3, 3) - ci
produces:
[,1]
[1,] 0.3333333
[2,] 0.3333333
[3,] 0.3333333
[4,] 0.0000000
[5,] 0.0000000
What am I missing?
回答1:
If you search Google you get an answer from @HongOoi in the comments of another question with a similar error message. Hong Ooi suggested subtracting a fuzz value from the ci argument:
fuzz = - 1e-6
constrOptim(rep(1/3,3), f=test_func,grad = NULL,
ui = rbind(diag(3),rep(1, 3), rep(-1,3)),
ci = c(rep(0,3),1,-1)- 1e-6, method = "Nelder-Mead")
#---------------------
$par
[1] 0.3333317 0.3333327 0.3333346
$value
[1] 0.3333327
$counts
[1] 0
$convergence
[1] 0
$message
NULL
$outer.iterations
[1] 1
$barrier.value
[1] 0.000209865
I think this is probably an issue that might warrant sending a request to the R-devel mailing list for documentation improvement, although arguable you are not actually in the interior of the feasible range since the constraint tes fails a strict inequality:
ui %*% rep(1/3,3) - ci > 0
[,1]
[1,] TRUE
[2,] TRUE
[3,] TRUE
[4,] FALSE
[5,] FALSE
Your first three constraints were satisfied by the inequality but not the last two which were on the boundary.
来源:https://stackoverflow.com/questions/50472525/constroptim-in-r-init-val-is-not-in-the-interior-of-the-feasible-region-error