【问题标题】:glm starting values not accepted log-linkglm 起始值不接受日志链接
【发布时间】:2019-10-09 21:30:14
【问题描述】:

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

y <- c(1,1,0,0)
t <- c(5,3,2,4)

没问题:

exp(coef(glm(y~1 +  offset(log(t)), family=poisson)))

使用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, enclos) 中的错误:找不到有效的起始值:请指定一些”

有没有人看到有什么问题(希望只是在我的编码中)?

【问题讨论】:

  • "does not work" 不如实际的错误消息有用,实际错误消息是 "Error in eval(expr, envir, enclos) : 找不到有效的起始值:请指定一些" 我玩过 w/一些简单的glm(y~1+offset(junk)),一切正常。我认为你有一个非常小的数据集和一些不太可能的偏移量,所以 glm 根本找不到合适的。
  • 我的“非常小的数据集”就是人们所说的最小示例让你
  • 是不是因为你想取log of 0?
  • 不,起始值应该在线性预测尺度上,这意味着它从 beta_zero=0 开始。其他起始值相同的错误。想知道为什么 R 在实际指定初始值时会要求它们...
  • @Andi 我的意思是在 y 值中记录 0。尝试使用非零正数y,它会起作用,并且不需要start

标签: r offset glm


【解决方案1】:

以下是一些考古学的结果,这些结果解释了在 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.fitmethod 的默认值),但没有起始值,因为这些对于仅拦截模型通常是不必要的。

现在在 glm.fit 内部调试,看看会发生什么:我们得到(在对 family 函数的调用中,gaussian())到:

  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 值等于 0,所以拟合失败。因此,如果(且仅当?)同时指定了偏移量和截距,使用了日志链接并且响应中的值为零,则应该发生这种情况。

如果你dump("glm",file="glmtemp.R");添加行

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

到适合空偏差的调用(即上面显示的那个);和source("glmtemp.R"),它似乎工作正常......我认为这应该是一个合理的通用解决方案。如果有人想将此问题列入 R 开发列表,请随意。

【讨论】:

  • 随着您的加入,技术问题就解决了。谢谢!您能否也给我一个提示,为什么估计的参数与 poisson-glm 不同? (相同的偏移量,相同的日志链接)如果没有偏移量,两个估计值都是相同的。
  • 我没有时间深入研究这个,但你为什么期望它们是一样的呢?我认为非偏移模型相同是一种特殊情况......我将逐步完成模型的定义(即在链接尺度上找到最小预期方差加权平方和,有或没有偏移量)
  • 不错的挖掘! :) 我认为有一个更好的解决方法:只需添加mustart = fit$fitted.values。我已经在bugs.r-project.org/bugzilla/show_bug.cgi?id=16877 提交了一个补丁。
【解决方案2】:

offset 存在时,我似乎无法识别start。您正在尝试在 y 值(即 -Inf)中记录 0。在没有start 的帮助的情况下,glm 在寻找解决方案时显然无法处理这个问题。您的 y 值中的小扰动将允许解决方案。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    相关资源
    最近更新 更多