2013-02-17 68 views
4

我不想使用glm中的标准日志链接进行泊松回归,因为我有零。请看下面的代码:如何在glm中使用自定义链接功能?

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

我得到的错误:

Error: no valid set of coefficients has been found: please supply starting values

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

回答

7

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

但是,这并不是一个完整的解释,因为即使对于起始负对数似然性是有限的(0,2)的某些起始点(-sum(dpois(bar,0+2*foo,log=TRUE))约为20),也会出现相同的错误 - 一个必须深入挖掘才能看出问题所在,但我可以想象,例如代码中根本不允许泊松均值为零。泊松的对数似然是(一个常数加上)x*log(lambda)-lambda:尽管如果lambdax都为零,那么这个结果仍然可以,但这在数学中并不总是显而易见的。特别是,如果您查看poisson()$validmu,这是glm用于确定Poisson的一组计算方法是否正常的函数,您会看到它的定义是function (mu) { all(mu > 0) }。 (可以修改这个以允许mu为零值,但这样做会有足够的麻烦,因为您需要一个很好的理由来这么做 - 我试过了,还有另一个问题,因为差异计算为零。简而言之,通过自定义最大似然估计器(例如bbmle::mle2())来做到这一点要比破解glm做到这一点更容易......)

但是,没有零泊松估计的起点意思是精品了,虽然有很多的警告:

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

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

一般来说,非规范链接函数有点痛苦:它们有时正是你所需要的(虽然从你所说的我不相信这是你的情况),但是他们往往比规范链接更加困难和困难。

最后一个注意事项:我可能会将您想要的作为一个“非规范”或“非标准”链接;一个定制链接功能,对我来说,将是一个不被R中的family()命令提供的,所以你必须自己编写链接功能(例如,见http://rpubs.com/bbolker/4082

+1

好吧,我想我的问题是,在误解链接功能甚至意味着什么。我会研究更多,也许会问一个不同的问题。 – Xodarap 2013-02-17 16:49:25