2016-10-22 7 views
1

私はこの問題は、私は16回の警告を得たことである対数尤度関数を書き込むためdnbinom()を使用し、次いでR.のNaN()

mle2() {bbmle}を使用してパラメータを推定してい

1:私の負の二項モデルは、それらのすべてのNaNは、このように製造さ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を試行することを制限しているわけではありません。このおそらくはあなたの最終的な答えを台無しにしませんが、できる限り、この種の警告を避けるのが最善です。 2つの単純な戦略は:

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))))) 

ところで:

  • は、次のよう
  • は、対数スケールでkパラメータをフィット(method=L-BFGS-Bへの切り替え)k上下限を置きますこのような単純な問題の場合は、次のように数式ベースのショートカットを使用できます。

    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)) (= Inf、γ= Inf、k = Inf)) –

+0

このように、メソッド= L-BFGS-Bを使用する場合、係数の標準誤差はglm.nb関数を使用して得られたものとはかなり異なるという点のみです。あなたは正しかった、私はglm.nbを使用するつもりはないので、私はログのような関数に用語を追加するつもりですが、私はこの最も単純な場合の分散について同様の結果を期待していました。 –

+0

「まったく違う」とはどういう意味ですか? 'mle2'と' L-BFGS-B'と 'glm.nb'を比較すると、私は傍受で0.445対0.460、勾配で0.266対0.249の標準誤差を得ます...あなたが犯した誤差の大きさですを懸念?彼らは "似ている"ように見えます... –