R glm起始值不接受日志链接

R glm起始值不接受日志链接,r,offset,glm,R,Offset,Glm,我想运行一个带有日志链接和偏移量的高斯GLM。 出现以下问题: y <- c(1,1,0,0) t <- c(5,3,2,4) 使用family=gaussian,需要指定起始值,它在这里工作: exp(coef(glm(y~1, family=gaussian(link=log), start=0))) 但在这里不起作用: exp(coef(glm(y~1 + offset(log(t)), family=gaussian(link=log), start=0))) eva

我想运行一个带有日志链接和偏移量的高斯GLM。 出现以下问题:

y <- c(1,1,0,0)
t <- c(5,3,2,4)
使用
family=gaussian
,需要指定起始值,它在这里工作:

exp(coef(glm(y~1, family=gaussian(link=log), start=0)))
但在这里不起作用:

exp(coef(glm(y~1 +  offset(log(t)), family=gaussian(link=log), start=0)))
eval(expr、envir、enclose)中出错:找不到有效的起始值:请指定一些“


是否有人看到了错误(希望只是在我的编码中)?

当出现
偏移量时,
start
似乎没有被识别。您试图在
y
值中获取0的日志,该值为
-Inf
glm
显然无法在未得到
start
的帮助的情况下处理此问题。y中的一个小扰动我们的
y
值将允许解决方案

exp(coef(glm(I(y+.Machine$double.eps)~1 + offset(log(t)), family=gaussian(link=log))))
(Intercept) 
  0.1481481

以下是一些考古学的结果,解释了
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
}
我们看到,由于没有传递起始值,因为使用了日志链接,并且由于一些
y
值等于零,拟合失败。因此,如果(且仅当?)同时指定了偏移量和截距,使用了日志链接,并且响应中有零值,则应该发生这种情况

如果您
转储(“glm”,file=“glmtemp.R”)
;请添加该行

    start = start[1], etastart = etastart[1], mustart = mustart[1],

对于符合空偏差的调用(即上面所示的调用)和
源代码(“glmtemp.R”)
,它似乎工作正常……我认为这应该是一个合理的通用解决方案。如果有人想在R开发列表中提出这个问题,请放心。

“不工作”不如实际的错误消息有用,即eval(expr、envir、enclose)中出错:找不到有效的起始值:请指定一些“我玩了一些简单的
glm(y~1+offset(junk))
,所有这些都很好。我认为您的数据集非常小,偏移量也不太可能,因此glm根本找不到合适的。我的“非常小的数据集”“人们所说的最小示例是否让你明白了,这不是因为你试图取0的对数吗?不,起始值应该在线性预测量表上,这意味着它从beta_zero=0开始。其他起始值也有相同的错误。不知道为什么R在实际指定的时候要求起始值…@Andi我的意思是在
y
值中取0的日志。使用非零正
y
进行尝试,它将工作,并且不需要
启动
。通过您的加入,技术问题得到解决。非常感谢。你能不能给我一个提示,为什么估计参数与泊松glm不同?(相同的偏移量,相同的日志链接)没有偏移量项,两个估计值都是相同的。我没有时间深入研究这一点,但为什么你会期望它们是相同的呢?我认为这是一种特殊情况,非偏移模型是相同的。。。我将一步一步地完成模型的定义(即,在链接比例上找到最小的期望方差加权平方和,有或没有偏移量)很好地挖掘!)不过,我认为有一个更好的解决方案:只需添加
mustart=fit$fitted.values
。我已经在提交了一个补丁。
  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")
    start = start[1], etastart = etastart[1], mustart = mustart[1],