我正在尝试使用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")
运行得很好。
这是一个错误,还是我可以做些什么来让它运行?
答案 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)
交叉检查以查看像MuMIn
和AICcmodavg
这些包(我记得允许基于准AIC的模型平均和选择)这样的包可能是有意义的...