我有一些实际的数据,恐怕有点讨厌。
它本质上是一个正负二项分布(没有任何零计数)。然而,有一些异常值似乎会导致一些糟糕的计算(可能是下溢或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(正泊松:没有零值),我得到一个类似的错误“论证不能解释为逻辑”。
我注意到Stackoverflow中存在许多类似的问题,其中缺少需要TRUE / FALSE的缺失值,但是使用其他R包。这向我表明,包编写者可能需要更好地预测计算可能会失败。
答案 0 :(得分:1)
我认为你的近端问题是,对于你的极端值的负二项式的预测均值是如此接近零以至于它们正以低于零的方式下降,这是一种未被包裹作者预期/保护的方式。 (关于非线性优化/拟合的一件事是,总是可能通过给出极端数据来破坏拟合方法......)
我无法在VGAM
中使用此功能,但我还会提供其他一些建议。
plot(log(counts)~t,data=dd)
并注视数据以获得参数值的初始估计值(至少对于平均模型):
m0 <- lm(log(counts)~t,data=subset(dd,t<10))
我以为我可以通过设置起始值来让vglm()
工作,但即使我从其他平台获得了相当不错的值(见下文),这实际上并没有实现。 / p>
glmmADMB
包可以通过family="truncnbinom"
:
library(glmmADMB)
m1 <- glmmadmb(counts~t, data=dd, family="truncnbinom")
(有一些警告信息......)
这需要更多的工作:它在标准模型中失败了,但是如果我在预测的平均值上设置一个底线就可以工作......
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))
再次发出警告信息。
比较glmmADMB
,mle2
,简单截断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()
相同类型的问题......