r - 为什么 glm.nb 仅在非常特定的输入上抛出 "missing value"错误

标签 r statistics

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)

我只找到one mention在没有响应的线程上的任何地方都会出现此错误。

什么可能导致此错误,以及如何修复它(除了每次 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

最佳答案

这有点粗糙,但在过去,我已经能够通过直接最大似然估计来解决 glm.nb 的问题(即没有使用 中使用的聪明的迭代估计算法>glm.nb)

一些探索/分析表明 theta 参数的 MLE 实际上是无限的。我决定将其拟合为反比例,这样我就可以将边界设置为 0(更高级的版本会设置一个对数似然函数,该函数将在 theta=0 处恢复为泊松函数,但这会撤销尝试想出一个快速的、固定的解决方案)。

对于上面给出的两个不好的例子,这个方法工作得相当好,尽管它确实警告参数拟合在边界上......

library(bbmle)
m1 <- mle2(Y~dnbinom(mu=exp(logmu),size=1/invk),
           data=d1,
           parameters=list(logmu~X1+X2+offset(X3)),
           start=list(logmu=0,invk=1),
           method="L-BFGS-B",
           lower=c(rep(-Inf,12),1e-8))

第二个例子实际上更有趣,因为它从数字上证明了 theta 的 MLE 本质上是无限的,即使我们有一个大小合适的数据集,该数据集完全是由负二项式偏差生成的(否则我对某些事情感到困惑。 ..)

set.seed(11);pop <- rnbinom(n=1000,size=1,mu=0.05);glm.nb(pop~1,maxit=1000)
m2 <- mle2(pop~dnbinom(mu=exp(logmu),size=1/invk),
           data=data.frame(pop),
           start=list(logmu=0,invk=1),
           method="L-BFGS-B",
           lower=c(-Inf,1e-8))

关于r - 为什么 glm.nb 仅在非常特定的输入上抛出 "missing value"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11749977/

相关文章:

python - Python 中的评分者间协议(protocol)(Cohen 的 Kappa)

php - 使用 Symfony2 处理统计数据

facebook - 在后台下载 Facebook 广告统计数据(无网络浏览器)

linux - 在 Linux CentOS 6.5 版上安装 R3.1.1 时出现问题(检查 LDFLAGS 以获取 Fortran 库的路径)

rbind 两个 data.frame 保留行顺序和行名称

重复序列R

随机打乱句子中单词中的字母

r - 如何在 tidygraph 中标记中心节点

python - 如何构建隐含概率。 python中泊松分布的矩阵

r - 在 R 中使用 mapply 时将 t.test 的输出保存到数据帧