我不想在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
和x
都为零,这可以解决,但这在数学中并不总是显而易见的。特别是,如果您查看poisson()$validmu
,它是glm
用于确定一组计算的 Poisson 均值是否正常的函数,您会看到它的定义是function (mu) { all(mu > 0) }
。(可以修改它以允许零值mu
,但是你需要一个很好的理由来这样做就够麻烦了——我试过了,还有另一个问题,因为方差随后被计算为零。简而言之,通过自定义的最大似然估计器(例如bbmle::mle2()
)比破解glm
来做到这一点更容易......)
然而,泊松均值没有零估计的起点效果很好,尽管有很多警告:
glm(bar ~ foo, family = poisson(link = "identity"), start=c(1,0))
但是:我想指出您误解了链接功能的目的。即使使用标准对数链接,泊松回归的响应变量也可以为零。泊松回归的 GLM 模型是y ~ Poisson(exp(a+b*x))
,不是log(y) = a + b*x
。后者是不好的 if y=0
,但前者完全没问题。glm(bar ~ foo, family = poisson())
工作得很好。
一般来说,非规范链接函数有点痛苦:它们有时正是你所需要的(尽管从你所说的我不相信这在你的情况下是真的),但它们往往是比规范链接更麻烦,更难适应。
最后一点:我可能会将您想要的称为“非规范”或“非标准”链接;对我而言,自定义链接函数将是family()
R 中的命令未提供的函数,因此您必须自己编写链接函数(例如,参见http://rpubs.com/bbolker/4082)