问题描述
我正在编写代码以使用 stat::optim 函数估计零膨胀的 beta 二项式分布,并且我在小样本量时收到此错误 L-BFGS-B 需要 'fn' 的有限值 我想知道您是否可以帮助我应用 try catch 以便我的代码在出现错误时不会停止工作?它是如何工作的?我以前没有使用过这个技巧。 任何帮助表示赞赏。代码如下:
if (distr=="bb.zihmle")
{
N=length(x)
t=x[x>0]
m=length(t)
neg.log.lik<-function(y)
{
n1=y[1]
a1=y[2]
b1=y[3]
# ans=-sum(dbetabinom(t,n1,a1/(a1+b1),a1+b1,log=TRUE))+m*(1-dbetabinom(0,log=TRUE))
logA=lgamma(a1+n1+b1)+lgamma(b1)
logB=lgamma(a1+b1)+lgamma(n1+b1)
ans = -m *lgamma(n1 + 1) - sum(lgamma(t + a1)) - sum(lgamma(n1-t+b1)) -m * lgamma(a1 + b1) +sum(lgamma(n1 - t + 1))+
sum(lgamma(t + 1)) + m * lgamma(a1) +m*log(1-exp(logB-logA))+m*logA
return(ans)
}
gp<-function(y)
{
n1=y[1]
a1=y[2]
b1=y[3]
logA=lgamma(a1+n1+b1)+lgamma(b1)
logB=lgamma(a1+b1)+lgamma(n1+b1)
dn=-m * digamma(n1 + 1) - sum(digamma(n1-t+b1)) + sum(digamma(n1-t+1)) -
m*exp(logB-logA)*(digamma(n1+b1)-digamma(a1+n1+b1))/(1-exp(logB-logA))+m*digamma(a1+n1+b1)
da=-sum(digamma(t+a1))- m * digamma(a1 + b1)+ m * digamma(a1)-
m*exp(logB-logA)*(digamma(a1+b1)-digamma(a1+n1+b1))/(1-exp(logB-logA))+m*digamma(a1+n1+b1)
db=-sum(digamma(n1-t+b1)) - m* digamma(a1+b1) -
m*exp(logB-logA)*(digamma(a1+b1)+digamma(n1+b1)-digamma(a1+n1+b1)-digamma(b1))/(1-exp(logB-logA))+m*digamma(b1)+m*digamma(a1+n1+b1)
return(c(dn,da,db))
}
estimate=stats::optim(par=c(n,alpha1,alpha2),fn=neg.log.lik,gr=gp,method = "L-BFGS-B",lower = c(lowerbound,lowerbound,lowerbound),upper = c(upperbound,upperbound,upperbound))
此外,下限 = 0.01,上限 = 10000
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)