2016-10-22 49 views
1

我使用dnbinom()用于写入数似然函数,然后估算使用mle2() {bbmle}参数R.的NaN()

的问题是,我得到16个为警告我的负二项模型,所有这些的NaN产生像这样的:

1:在dnbinom(Y,亩=亩,大小= k时,登录= TRUE):NaN的产生

我的代码:

# data 
x <- c(0.35,0.45,0.90,0.05,1.00,0.50,0.45,0.25,0.15,0.40,0.26,0.37,0.43,0.34,0.00,0.11,0.00,0.00,0.00,0.41,0.14,0.80,0.60,0.23,0.17,0.31,0.30,0.00,0.23,0.33,0.30,0.00,0.00) 
y <- c(1,10,0,0,67,0,9,5,0,0,0,82,36,0,32,7,7,132,14,33,0,67,11,39,41,67,9,1,44,62,111,52,0) 

# log-likelihood function 
negbinglmLL = function(beta,gamma,k) { 
    mu= exp(beta+gamma*x) 
    -sum(dnbinom(y,mu=mu, size=k, log=TRUE)) 
} 

# maximum likelihood estimator 
model <- mle2(negbinglmLL, start=list(beta=mean(y), gamma= 0, k=mean(y)^2/(var(y)-mean(y)))) 

这些警告是什么意思,如果这是一个严重的问题,我该如何避免它?

回答

0

您不限制尝试负值k的负对数似然函数。这可能不会弄乱你的最终答案,但如果可以的话,最好避免这些警告。两个简单的策略:

  • 投入下界k(切换到method=L-BFGS-B
  • 适合对数刻度k参数,如下所示:
negbinglmLL = function(beta,gamma,logk) { 
    mu= exp(beta+gamma*x) 
    -sum(dnbinom(y,mu=mu, size=exp(logk), log=TRUE)) 
} 

model <- mle2(negbinglmLL, 
       start=list(beta=mean(y), 
         gamma= 0, 
         logk=log(mean(y)^2/(var(y)-mean(y))))) 

顺便说一句,对于这样的简单问题,您可以使用基于公式的快捷方式,如下所示:

mle2(y~dnbinom(mu=exp(logmu),size=exp(logk)), 
    parameters=list(logmu~x), 
    start=list(logmu=0,logk=0), 
    data=data.frame(x,y)) 

对于这种简单的情况MASS::glm.nb也应该很好地工作(但也许这是最简单的版本,会变得更复杂/超出glm.nb的范围)。

+0

感谢您的回答。我决定使用你的第一个选择:model < - mle2(negbinglmLL,start = list(beta = mean(y),gamma = 0,k = mean(y)^ 2 /(var(y)-mean(y)) ),method =“L-BFGS-B”,lower = c(beta = -Inf,gamma = -Inf,k = 0),upper = c(beta = Inf,gamma = Inf,k = Inf)) –

+0

唯一的问题是当使用方法= L-BFGS-B时,系数的标准误差与通过使用glm.nb函数获得的误差相当不同。你是对的,我打算给类似日志的函数添加条件,所以我不打算使用glm.nb,但是我期望在这个最简单的情况下得到相似的结果。 –

+0

嗯,你说的“完全不同”是什么意思?将'mle2'与'L-BFGS-B'和'glm.nb'相比较,我得到的std错误为0.445,对于截距为0.460,对于斜率为0.266对0.249 ...是那些你错误的大小关注?他们似乎“相似”... –