glm.nb在某些输入上引发异常错误。虽然有多种值会导致此错误,但即使是非常轻微地更改输入也可以防止错误发生。
一个可重现的例子:
set.seed(11)
pop <- rnbinom(n=1000,size=1,mu=0.05)
glm.nb(pop~1,maxit=1000)
运行此代码会引发错误:
Error in while ((it <- it + 1) < limit && abs(del) > eps) { :
missing value where TRUE/FALSE needed
起初我认为这与算法不收敛有关。然而,我惊讶地发现即使是非常轻微地改变输入也可以防止错误。例如:
pop[1000] <- pop[1000] + 1
glm.nb(pop~1,maxit=1000)
我发现它会在 1 到 500 之间的 19.4% 的种子上引发此错误:
fit.with.seed = function(s) {
set.seed(s)
pop <- rnbinom(n=1000, size=1, mu=0.05)
m = glm.nb(pop~1, maxit=1000)
}
errors = sapply(1:500, function(s) {
is.null(tryCatch(fit.with.seed(s), error=function(e) NULL))
})
mean(errors)
我发现在任何地方都只提到了这个错误,在一个没有响应的线程上。
什么可能导致此错误,以及如何修复它(除了每次glm.nb
引发错误时随机排列输入?)
ETA:设置control=glm.control(maxit=200,trace = 3)
发现theta.ml
算法通过变得非常大而中断,然后变为-Inf
,然后变为NaN
:
theta.ml: iter67 theta =5.77203e+15
theta.ml: iter68 theta =5.28327e+15
theta.ml: iter69 theta =1.41103e+16
theta.ml: iter70 theta =-Inf
theta.ml: iter71 theta =NaN