Shengqiao Li
2003-Aug-20 13:44 UTC
[R] Method of L-BFGS-B of optim evaluate function outside of box constraints
Hi, R guys: I'm using L-BFGS-B method of optim for minimization problem. My function called besselI function which need non-negative parameter and the besselI will overflow if the parameter is too large. So I set the constraint box which is reasonable for my problem. But the point outside the box was test, and I got error. My program and the error follows. This program depends on CircStats package. Anyone has any idea about this? Thanks in advance. Li #################### source code ################################### Dk2<- function(pars,theta) { kappa<- pars[1]; mu<- pars[2]; IoK<- besselI(kappa, nu=0); res<- besselI(2*kappa, nu=0)/2/IoK^2 - mean(exp(kappa*cos(theta-mu)))/IoK; if(is.na(res)||is.infinite(res)){ print(pars); # assign("Theta", theta, env=.GlobalEnv); } return(res); } mse.Dk2<- function(pars, s, n) { sum.est <- SSE <- numeric(2); j<- 0; while(j<=n){ theta<- rvm(s, pi, k=pars[1]) - pi; est<- optim(par=pars, fn=Dk2, lower=c(0.001, -pi), upper=c(10, pi), method="L-BFGS-B", theta=theta); i<- 0; while(est$convergence!=0 && i< 30){ est<- optim(par=est$par, fn=Dk2, lower=c(0.001, -pi), upper=c(10, pi), method="L-BFGS-B", theta=theta); i<- i+1; } if(est$convergence!=0) { #print(j); next; } else { j<- j+1; } #est<- nlm(p=pars, f=Dk2, theta=theta); mu.hat<- est$par[2]; while(mu.hat< -pi) mu.hat<- mu.hat + 2*pi; while(mu.hat > pi) mu.hat<- mu.hat -2*pi; est<- c(est$par[1], mu.hat); sum.est <- sum.est + est; SSE <- SSE + (est - pars)^2; } Est <- sum.est/n; Bias<- Est - pars; MSE<- SSE/n; res<- c(Kappa=pars[1], Kappa.hat= Est[1], Kappa.Bias=Bias[1], Kappa.MSE=MSE[1], Mu.hat=Est[2], Mu.MSE=MSE[2]) return(res); } kappas <- c(0.01, 0.05, 0.1, 0.20, 0.5, 1, 2, 5); N<- 10000; for ( s in c(5, 10, 20, 30, 50)){ cat("\nSample size = ", s); cat("\n=====================================\n"); res<- NULL; for(i in 1:8){ res<- rbind(res, mse.Dk2(c(kappas[i], 0), s, N)); } print(round(res,4)); } #Error message. -32.7 is far lower then the lower limit 0.001. Sample size = 5 ====================================[1] -32.736857 -3.141593 Error in optim(par = pars, fn = Dk2, lower = c(0.001, -pi), upper = c(10, : L-BFGS-B needs finite values of fn In addition: Warning messages: 1: NaNs produced in: besselI(x, nu, 1 + as.logical(expon.scaled)) 2: NaNs produced in: besselI(x, nu, 1 + as.logical(expon.scaled))
Spencer Graves
2003-Aug-20 16:25 UTC
[R] Method of L-BFGS-B of optim evaluate function outside of box constraints
I see two problems, which I handle differently: First, if arg must be nonnegative, I program fn in terms of log.arg, so it can never become nonpositive. Second, is besselI always positive? If yes, then program fn to compute log(besselI) and use that. Standard references such as Abramowitz and Stegun (1970) Handbook of Mathematical Functions (US Gov't printing office) give asymptotic expansions that give good answers for values of arguments near very large or very small. If you test the values of the arguments, you can develop good numbers to use. Then optim should work fine. hope this helps. spencer graves Shengqiao Li wrote:> Hi, R guys: > > I'm using L-BFGS-B method of optim for minimization problem. My function > called besselI function which need non-negative parameter and the besselI > will overflow if the parameter is too large. So I set the constraint box > which is reasonable for my problem. But the point outside the box was > test, and I got error. My program and the error follows. This program > depends on CircStats package. > > > Anyone has any idea about this? > > Thanks in advance. > > Li > > #################### source code ################################### > > Dk2<- function(pars,theta) > { > kappa<- pars[1]; mu<- pars[2]; > IoK<- besselI(kappa, nu=0); > res<- besselI(2*kappa, nu=0)/2/IoK^2 - > mean(exp(kappa*cos(theta-mu)))/IoK; > if(is.na(res)||is.infinite(res)){ > print(pars); > # assign("Theta", theta, env=.GlobalEnv); > } > return(res); > } > > > mse.Dk2<- function(pars, s, n) > { > sum.est <- SSE <- numeric(2); > j<- 0; > while(j<=n){ > theta<- rvm(s, pi, k=pars[1]) - pi; > est<- optim(par=pars, fn=Dk2, lower=c(0.001, -pi), upper=c(10, > pi), method="L-BFGS-B", theta=theta); > i<- 0; > while(est$convergence!=0 && i< 30){ > est<- optim(par=est$par, fn=Dk2, lower=c(0.001, -pi), > upper=c(10, pi), method="L-BFGS-B", theta=theta); > i<- i+1; > } > if(est$convergence!=0) { > #print(j); > next; > } > else { j<- j+1; } > > #est<- nlm(p=pars, f=Dk2, theta=theta); > mu.hat<- est$par[2]; > while(mu.hat< -pi) mu.hat<- mu.hat + 2*pi; > while(mu.hat > pi) mu.hat<- mu.hat -2*pi; > est<- c(est$par[1], mu.hat); > sum.est <- sum.est + est; > SSE <- SSE + (est - pars)^2; > > > } > Est <- sum.est/n; > Bias<- Est - pars; > MSE<- SSE/n; > > res<- c(Kappa=pars[1], Kappa.hat= Est[1], Kappa.Bias=Bias[1], > Kappa.MSE=MSE[1], Mu.hat=Est[2], Mu.MSE=MSE[2]) > > return(res); > } > kappas <- c(0.01, 0.05, 0.1, 0.20, 0.5, 1, 2, 5); > N<- 10000; > for ( s in c(5, 10, 20, 30, 50)){ > cat("\nSample size = ", s); > cat("\n=====================================\n"); > res<- NULL; > for(i in 1:8){ > res<- rbind(res, mse.Dk2(c(kappas[i], 0), s, N)); > > } > print(round(res,4)); > } > > #Error message. -32.7 is far lower then the lower limit 0.001. > Sample size = 5 > ====================================> [1] -32.736857 -3.141593 > Error in optim(par = pars, fn = Dk2, lower = c(0.001, -pi), upper = c(10, > : > L-BFGS-B needs finite values of fn > In addition: Warning messages: > 1: NaNs produced in: besselI(x, nu, 1 + as.logical(expon.scaled)) > 2: NaNs produced in: besselI(x, nu, 1 + as.logical(expon.scaled)) > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://www.stat.math.ethz.ch/mailman/listinfo/r-help
Adelchi Azzalini
2003-Aug-21 08:09 UTC
[R] Method of L-BFGS-B of optim evaluate function outside of box constraints
On Wednesday 20 August 2003 15:44, Shengqiao Li wrote:> Hi, R guys: > > I'm using L-BFGS-B method of optim for minimization problem. My function > called besselI function which need non-negative parameter and the besselI > will overflow if the parameter is too large. So I set the constraint box > which is reasonable for my problem. But the point outside the box was > test, and I got error. My program and the error follows. This program > depends on CircStats package. > > > Anyone has any idea about this? >No idea... I can only say that a similar behaviour of optim with method="L-BFGS-B" (i.e. evaluation of the function outside the lower/upper limits) has occurred to me too. It is a rare but possible behaviour. Last June, I have sent a full description of the problem to r-bugs at r-project.org Regards, Adelchi Azzalini -- Adelchi Azzalini <azzalini at stat.unipd.it> Dipart.Scienze Statistiche, Universit? di Padova, Italia http://azzalini.stat.unipd.it/ (please, no ms-word/ms-excel/alike attachments)