2016-10-22 46 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 ...是那些你錯誤的大小關注?他們似乎「相似」... –