gpt4 book ai didi

r - glm 起始值不被接受日志链接

转载 作者:行者123 更新时间:2023-12-02 08:45:03 26 4
gpt4 key购买 nike

我想运行带有日志链接和偏移量的高斯 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)))

Error in eval(expr, envir, enclos) : cannot find valid starting values: please specify some"

有人看出问题出在哪里吗(希望只是在我的编码中)?

最佳答案

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

现在在 glm.fit 内部进行调试,看看会发生什么:我们(在对系列函数 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 值等于零,因此拟合失败。因此,如果(且仅当?)同时指定了偏移量和截距、使用了日志链接并且响应中存在零值,则应该发生这种情况。

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

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

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

关于r - glm 起始值不被接受日志链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8212063/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com