使用泊松回归的bestglm R包错误

时间:2014-10-16 18:56:54

标签: r regression

我正在尝试使用R中的bestglm包来拟合泊松回归模型。这是我的代码:

bestmodel <- bestglm(Xy, family = poisson, IC ="BIC")

,输出

Morgan-Tatar search since family is non-gaussian. Error in dimnames(Bestq) <- list(c("BICq1", "BICq2"), c("q1", "q2", "selected k")) : length of 'dimnames' [2] not equal to array extent In addition: There were 50 or more warnings (use warnings() to see the first 50)

没有什么特别的数据框Xy,除了它不严格包含整数,这导致最后的警告集合。值得注意的是,代码

bestmodel <- bestglm(Xy, IC ="BIC")

运行得很好。

这是一个错误,还是我可以做些什么来让它运行?

1 个答案:

答案 0 :(得分:2)

tl; dr 由于技术原因,对于使用非整数数据的Poisson GLM进行基于似然性或基于IC的模型选择将会遇到困难(可能性不大-defined)。通过准可能性解决问题是可能的:我对下面的解决方案有一个黑客攻击,但是如果你重视你的结论,你一定要仔细检查准AIC公式是否正确!

我认为非整数值确实是问题所在。我可以按如下方式重现它:

library("bestglm")

set.seed(101)
## y must be **LAST** column (not documented clearly!)
Xy <- data.frame(
    x1=rnorm(100),x2=rnorm(100),
    y=rpois(100,2))

使响应变量为非整数:

Xy2 <- transform(Xy,y=y+0.5)

这些都有效:

bestglm(Xy)
bestglm(Xy,IC="BIC")
bestglm(Xy,IC="BIC", family=poisson)

这失败了:

bestglm(Xy2,IC="BIC", family=poisson)
##  Error in dimnames(Bestq) <- 
## list(c("BICq1", "BICq2"), c("q1", "q2", "selected k")) : 
##    length of 'dimnames' [2] not equal to array extent

我不确定这是否应该算作一个错误,因为Poisson GLM并不是真正意图处理非整数数据(但我可以理解,有时候 理由这样做)。我认为近端问题可能是BIC(以及基于对数似然的其他信息标准)是无限的,因为在Poisson模型下技术上不可能是非整数值,所以可能性是零...

BIC(glm(y~1,data=Xy2,family=poisson))
## Inf

原则上你可以通过计算准似然/准AIC来解决这个问题,但是R的内置quasipoisson家族是由纯粹主义者写的,他们不相信这样的事情是有意义的:

BIC(glm(y~1,data=Xy2,family=quasipoisson))
## NA

我认为最好的解决方案是编写自己的my_quasipoisson系列替换

quasipoisson()$aic
function (y, n, mu, wt, dev) 
NA

具有明显的准可能性。

更新:这是一种解决方法。这是一个明智的准AIC表达式(我认为BIC()也使用它)。它的保修期比平常少。

my_QP <- function(link="log") {
    QP <- quasipoisson(link=link)
    QP$aic <- function (y, n, mu, wt, dev) {
        nobs <- length(y)
        disp <- dev/n
        dev0 <- -2*sum((-mu + y*log(mu) -lfactorial(y))*wt/disp)
        dev0 + 2  ## extra penalty parameter
    }
    QP
}

bestglm(Xy2,family=my_QP)

交叉检查以查看像MuMInAICcmodavg这些包(我记得允许基于准AIC的模型平均和选择)这样的包可能是有意义的...