我正试图通过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))
答案 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