0

私は実際のデータをいくつか持っていますが、それはやや厄介です。

これは基本的に、正負の二項分布です (ゼロ カウントなし)。ただし、不適切な計算が発生する原因と思われる異常値がいくつかあります (おそらくアンダーフローまたは NaN でしょうか?) 最初の 8 つほどのエントリは妥当ですが、最後のいくつかはフィッティングに問題を引き起こしていると推測しています。

データは次のとおりです。

> df
   counts  t
1    1968  1
2     217  2
3      55  3
4      26  4
5      11  5
6       5  6
7       8  7
8       3  8
9       1 10
10      1 11
11      1 12
12      1 13
13      1 15
14      1 18
15      1 26
16      1 59

このコマンドはしばらく実行された後、エラー メッセージを吐き出します

> vglm(counts ~ t, data=df, family = posnegbinomial)
Error in if (take.half.step) { : missing value where TRUE/FALSE needed

しかし、外れ値を切り捨ててこれを再実行すると、posnegbinomial の解が得られます

> vglm(counts ~ t, data=df[1:9,], family = posnegbinomial)
Call:
vglm(formula = counts ~ t, family = posnegbinomial, data = df[1:9,])

Coefficients:
(Intercept):1 (Intercept):2             t 
    7.7487404     0.7983811    -0.9427189 

Degrees of Freedom: 18 Total; 15 Residual
Log-likelihood: -36.21064 

ファミリ pospoisson (Positive Poisson: ゼロ値なし) を試すと、「引数は論理として解釈できません」という同様のエラーが発生します。

TRUE/FALSE が必要な欠損値について Stackoverflow に同様の質問がいくつかあることに気付きましたが、他の R パッケージを使用しています。これは、おそらくパッケージ作成者は、計算が失敗する可能性があることをよりよく予測する必要があることを示しています。

4

1 に答える 1

1

あなたの近位の問題は、極端な値の負の二項式の予測平均がゼロに非常に近いため、パッケージの作成者によって予想/保護されていなかった方法で、ゼロにアンダーフローしていることだと思います。(非線形最適化/フィッティングについて理解しておくべきことの 1 つは、極端なデータを与えることでフィッティング方法を破ることが常に可能であるということです ...)

でこれを機能させることはできませんでしたがVGAM、他にもいくつか提案します。

plot(log(counts)~t,data=dd)

そして、データを観察してパラメータ値の初期推定値を取得します (少なくとも平均モデルの場合):

m0 <- lm(log(counts)~t,data=subset(dd,t<10))

開始値を設定することで作業を開始できるのではないかと考えましvglm()たが、他のプラットフォームからかなり良い値を取得した場合でも、実際にはうまくいきませんでした (以下を参照)。

glmmADMB

glmmADMBパッケージは、以下を介して正の NB を処理できfamily="truncnbinom"ます。

library(glmmADMB)
m1 <- glmmadmb(counts~t, data=dd, family="truncnbinom")

(警告メッセージがいくつかあります...)

bbmle::mle2()

これにはもう少し作業が必要です。標準モデルでは失敗しましたが、予測平均に下限を設定すると機能します...

library(VGAM)  ## for dposnegbin
library(bbmle)
m2 <- mle2(counts~dposnegbin(size=exp(logk),
                         munb=pmax(exp(logeta),1e-7)),
           parameters=list(logeta~t),
           data=dd,
           start=list(logk=0,logeta=0))

再び警告メッセージ。

glmmADMBmle2、単純な切り捨てられた適合を比較しlmます ...

cc <- cbind(coef(m2),
  c(log(m1$alpha),coef(m1)),
  c(NA,coef(m0)))
dimnames(cc) <- list(c("log_k","log_int","slope"),

                 c("mle2","glmmADMB","lm"))

##               mle2   glmmADMB         lm
## log_k    0.8094678  0.8094625         NA
## log_int  7.7670604  7.7670637  7.1747551
## slope   -0.9491796 -0.9491778 -0.8328487

これは原理的には可能ですが、 ...glmmTMBと同じ種類の問題に遭遇します。vglm()

于 2016-02-14T23:49:57.333 に答える