我不想在glm
中使用标准的对数链接函数进行泊松回归,因为我的数据存在零值。考虑以下代码:
foo = 0:10
bar = 2 * foo
glm(bar ~ foo, family = poisson(link = "identity"))
我遇到了以下错误:
错误:没有找到有效的系数集合,请提供起始值。
我不确定这意味着什么。 "identity" 链接函数是否是我认为的那样(即它不会转换数据)?这个错误是什么意思,如何解决?
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
:虽然如果lambda
和x
都是零,这个式子也能顺利工作,但在数学上并不总是显然的。特别是,如果你看一下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())
就可以正常工作。family()
没有提供的链接函数,因此您必须自己编写链接函数(例如,请参见http://rpubs.com/bbolker/4082)。