【问题标题】:How do I use a custom link function in glm?如何在 glm 中使用自定义链接功能?
【发布时间】:2013-02-18 00:06:41
【问题描述】:

我不想使用glm 中的标准日志链接进行泊松回归,因为我有零。考虑以下代码:

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

我得到错误:

错误:未找到有效的系数集:请提供起始值

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

【问题讨论】:

    标签: r glm


    【解决方案1】:

    如果您从默认 (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 用来确定一组泊松计算均值是否正常的函数,您会看到它的定义是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()) 工作正常。

    一般来说,非规范链接函数有点让人头疼:它们有时正是您所需要的(尽管从您所说的情况来看,我不相信这在您的情况下是正确的),但它们往往比规范链接更麻烦,更难适应。

    最后一点:我可能会将您想要的链接称为“非规范”或“非标准”链接; custom 链接函数,对我来说,将是 R 中的 family() 命令未提供的函数,因此您必须自己编写链接函数(例如,参见 http://rpubs.com/bbolker/4082

    【讨论】:

    • 好的,我想我的问题是误解了链接函数的含义。我会进行更多研究,也许会问一个不同的问题。
    猜你喜欢
    • 2017-02-09
    • 2016-12-31
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 2018-02-28
    相关资源
    最近更新 更多