Optim:L-BFGS-B中的非有限有限差分值

时间:2017-07-26 22:06:19

标签: r nonlinear-optimization

我正试图通过R'优化来最大化可能性。我得到错误“非有限的有限差分值。”

我正在使用L-BFGS-B,因为我必须将第11个参数(伯努利“p”)约束为0 <= p <= 1。由于我需要这个约束,我不能使用像“Nelder-Mead”这样的非广义方法。有关如何解决此问题的任何想法?它可以很好地处理模拟数据!

请注意,我在这里使用了一个floor函数,因为“Trials”参数需要离散值(第1到第10段)。

library(rmutil)
Nhat<-c(14335,15891,2700,1218,2213,10985,4985,8738,13878)
sdNhat<-
sqrt(c(26915344,6574096,175561,51529,71824,12166144,145924,2808976,3319684))
C<-c(313,410,38,30,69,175,132,193,240)
LL1<-vector()
LL2<-vector()
NLL<-function(data,par){
for (i in 1:length(Nhat)){
LL1[i]<-dnorm(Nhat[i],par[i],sdNhat[i],log=TRUE)
LL2[i]<-dbetabinom(C[i],floor(par[i]),par[length(Nhat)+1],par[length(Nhat)+2],log=TRUE)
}
-1*(sum(LL1)+sum(LL2))
}
out<-optim(par=c(floor(Nhat*runif(length(Nhat),0.9,1.1)),0.02,3),
       fn=NLL,data=list(Nhat=Nhat,sdNhat=sdNhat,C=C),
       method='L-BFGS-B',
       lower=c(rep(min(Nhat),length(Nhat)),0.0001,1),
       upper=c(rep(min(Nhat),length(Nhat)),0.9999,2))

1 个答案:

答案 0 :(得分:2)

您收到错误,因为您为参数1到9设置的边界是相同的。因此,您必须将upper=c(rep(min(Nhat),length(Nhat)),0.9999,2))(或lower)调整为间隔。

你说只有第10个(你实际写了第11个,但我猜这是一个错字)必须在0和1之间限制,所以这样可以工作:

set.seed(1)
out<-optim(par=c(floor(Nhat*runif(length(Nhat),0.9,1.1)),0.02,3),
           fn=NLL,data=list(Nhat=Nhat,sdNhat=sdNhat,C=C),
           method='L-BFGS-B',
           lower=c(rep(-Inf,length(Nhat)),0,-Inf),
           upper=c(rep(Inf,length(Nhat)),1,Inf))
out
# $par
# [1] 13660.61522882 15482.96819195  2730.66273051  1310.04511624  2077.45269032 11857.94955470
# [7]  5417.09464008  9016.57472573 14234.22972586     0.02165253   826.21691430
# 
# $value
# [1] 116.2657