如果您从默认 (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 )