如何在 glm 中使用自定义链接函数?

2024-01-10

我不想使用标准日志链接glm对于泊松回归,因为我有零。考虑以下代码:

foo = 0:10
bar = 2 * foo
glm(bar ~ foo, family = poisson(link = "identity"))

我收到错误:

错误:未找到有效的系数集:请提供起始值

我不确定这意味着什么。 “身份”链接功能是我认为的那样吗(即它根本不转换数据)?此错误是什么意思以及如何解决它?


如果您从默认 (0,0) 起点以外的位置开始,您可以获得答案。这start参数是包含响应的截距和斜率的向量,在链接函数的尺度上。 R 报告的问题通常是计算的(负)对数似然对于起始值而言变得无穷大。您可以自己检查一下:-sum(dpois(bar,0+0*foo,log=TRUE)) is Inf(因为我们正在设置均值为零的泊松,但得到非零响应)。

然而,这并不是一个完整的解释,因为即使对于像 (0,2) 这样的起始点,起始负对数似然也是有限的(-sum(dpois(bar,0+2*foo,log=TRUE))大约是 20),会发生同样的错误 - 人们必须更深入地挖掘才能看到问题所在,但我可以想象,例如,代码中根本不允许泊松均值为零。泊松的对数似然是(常数加)x*log(lambda)-lambda:即使这可行如果lambda and x都为零,这在数学中并不总是显而易见的。特别是,如果你看poisson()$validmu,这是函数glm用于确定泊松的一组计算平均值是否正确,您会看到它的定义是function (mu) { all(mu > 0) }。 (可以修改它以允许零值mu,但这已经够麻烦了,你需要一个充分的理由来这样做——我尝试过,但还有另一个问题,因为方差随后被计算为零。简而言之,通过自定义最大似然估计器(例如bbmle::mle2())而不是破解glm去做吧 ...)

然而,尽管有很多警告,但泊松均值不为零估计的起点效果很好:

glm(bar ~ foo, family = poisson(link = "identity"), start=c(1,0))

However:我想指出您误解了链接功能的目的。即使使用标准日志链接,泊松回归的响应变量也可以为零。泊松回归的 GLM 模型是y ~ Poisson(exp(a+b*x)), not log(y) = a + b*x。后者是不好的,如果y=0,但前者完全没问题。glm(bar ~ foo, family = poisson())工作得很好。

一般来说,非规范链接函数有点麻烦:它们有时正是您所需要的(尽管根据您所说的,我不相信您的情况是这样),但它们往往是比规范链接更复杂、更难安装。

最后一点:我可能会将您想要的链接称为“非规范”或“非标准”链接; Acustom链接功能,对我来说,将是一个不提供的功能family()R 中的命令,因此您必须自己编写链接函数(例如,参见http://rpubs.com/bbolker/4082 http://rpubs.com/bbolker/4082 )

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 glm 中使用自定义链接函数? 的相关文章

随机推荐