以下是一些考古学的结果,解释了地球深处正在发生的事情glm
功能:
调试(用debug("glm")
)并单步执行该函数表明它在以下调用时失败:
if (length(offset) && attr(mt, "intercept") > 0L) {
fit$null.deviance <- eval(call(if (is.function(method)) "method" else method,
x = X[, "(Intercept)", drop = FALSE], y = Y, weights = weights,
offset = offset, family = family, control = control,
intercept = TRUE))$deviance
}
这是计算模型零偏差的尝试。仅当存在截距项和偏移项时才对其进行评估(我不确定为什么;可能是之前调用计算出的默认零偏差glm
在这种情况下是错误的,必须重新计算?)。它调用glm.fit
(默认值method
), but without起始值,因为这些对于仅截距模型通常是不必要的。
现在正在内部调试glm.fit
看看会发生什么:我们得到(在对 family 函数的调用中,gaussian()
) to:
if (is.null(etastart) && is.null(start) && is.null(mustart) &&
((family$link == "inverse" && any(y == 0)) || (family$link ==
"log" && any(y <= 0))))
stop("cannot find valid starting values: please specify some")
我们看到,因为起始值没有被传递,因为使用了日志链接,并且因为一些y
值等于零,拟合失败。因此,如果(且仅当?)同时指定了偏移量和截距、使用了日志链接并且响应中存在零值,则应该发生这种情况。
If you dump("glm",file="glmtemp.R")
;添加行
start = start[1], etastart = etastart[1], mustart = mustart[1],
适合零偏差的调用(即上面所示的调用);和source("glmtemp.R")
,似乎工作正常...我think这应该是一个合理的通用解决方案。如果有人想在 R 开发列表中提出这个问题,请随意。