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

7

我不想在glm中使用标准的对数链接函数进行泊松回归,因为我的数据存在零值。考虑以下代码:

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

我遇到了以下错误:

错误:没有找到有效的系数集合,请提供起始值。

我不确定这意味着什么。 "identity" 链接函数是否是我认为的那样(即它不会转换数据)?这个错误是什么意思,如何解决?

1个回答

10
如果你从非默认的起点开始,可以得到一个答案。参数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用来确定泊松分布计算出的均值是否正确的函数,你会发现它的定义是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。如果y=0,后者是错误的,但前者完全没问题。使用glm(bar ~ foo, family = poisson())就可以正常工作。
通常来说,非规范链接函数会有一点麻烦:它们有时恰好是所需的(尽管根据你说的,我不确定这在你的情况下是否正确),但它们往往比规范链接更加复杂和难以拟合。
最后需要注意的是:我可能会把你想要的称为“非规范”或“非标准”链接;对于我来说,一个自定义链接函数是指R命令family()没有提供的链接函数,因此您必须自己编写链接函数(例如,请参见http://rpubs.com/bbolker/4082)。

1
好的,我想我的问题在于不理解链接函数的含义。我会进行更多研究,或许提出另一个问题。 - Xodarap

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接