用户指定的链接函数在R中为glm。如何? (没有找到文档,使用的参数是什么,等等)

时间:2015-08-10 10:50:11

标签: r glm

这个问题在过去已经在本网站上得到了解决,但所提供的答案对我来说并不完全有用。以下是我的问题的细节,这些细节实际上与此处讨论的内容有些不同:

在努力工作之后,我仍然无法理解如何在R中为glm定义我自己的用户指定链接函数。我对此有几个问题。

首先,我知道我必须编写自己的函数(可能会修改已存在的函数),并且 - 在其中 - 我需要定义以下元素:

  • linkfun:链接功能。
  • linkinv:链接函数的反转,作为" eta"的函数。
  • mu.eta:invlink的第一个衍生物,关于eta。
  • valideta:如果eta的值在正确的时间间隔内,则必须返回TRUE

并在列表元素中返回所有这些。

到目前为止,非常好。

以下是我的第一组问题:

  1. 链接功能有时被定义为" y"有时作为" mu"的功能。在这方面必须做些什么?

  2. 让我们举一个例子,然后输入make.link("sqrt")。然后我们确实发现linkfun是sqrt(mu),linkinv是eta^2,mu.eta是2*eta。到现在为止还挺好。但是,如果你看make.link("log"),mu.eta不仅仅是exp(eta),而是pmax(exp(eta), .Machine$double.eps)(即所有eta向量的一阶导数的最大值)。为什么?我仍然无法理解这一点。

  3. 仅仅因为我的好奇心,为什么算法需要invlink的第一个派生对eta?这对我来说并不完全清楚。

    在我的具体案例中,我需要对二项式数据进行准逻辑回归。我没有标准的logit函数log(p/(1-p)),而是需要稍加修改的链接函数(如果p被定义为Y / N):log((Y+0.5)/(N-Y+0.5))

    在这种情况下我的另一个问题是:

  4. 我仍然无法建立这个......有人可以给我一些提示吗?

  5. 我在哪里可以找到所有这些的详细说明?我看过好老钱伯斯& Hastie书(1992),但解释是不够的。网上有没有详细的课程等?

1 个答案:

答案 0 :(得分:1)

不确定我是否可以回答您的所有问题,但我试一试:

  1. 您是否可以指定linkfun mu y?根据我的知识,链接函数应该只有mu作为GLM(而不是LM)模型的函数expcetd值mu(又名链接函数)而不是excetd值本身。因此,应该只有mu作为参数。

  2. 这与vectorization有关。 pmax返回并行最大值,我们希望确保不会报告小于Machine$double.eps的值。因此linkfun不会返回所有exp(eta)的最大值(即max(exp(eta), .Machine$double.eps))。现在想象一下,eta现在是您要计算的所有eta的向量,然后是linkinvpmax(.)确保仅返回exp(eta)在这些情况下确实大于.Machine$double.eps。所以你还返回vector的最大值。 (尝试pmax(1:6, 4)您将获得[1] 4 4 4 4 5 6

  3. 您需要一阶导数才能计算dL / dbeta[j] = sum_i^n((y[i] - mu[i])/(a(phi[i] * V(mu[i])x[ij]/g'(mu[i]) = 0得分函数的估算值。这是似然函数w.r.t的导数。至beta[j](即dL/dbeta[j])取决于:

    • a(phi[i])是来自相应分布的分散参数的(已知)函数(例如,正常分布的a(phi) = phi = sigma^2
    • V(mu[i])对于指数族的分布(为其设计了GLM),您可以推导var(Y)可以写为a(phi) * V(mu),表明方差确实是的意思。
    • g'(mu[i])最终是链接函数的衍生物。所以为了解决得分函数(从而得到beta[j]的估计值,你需要链接函数的导数
  4. 因此,在您的情况下,您需要定义:

    • linkfun
    • 反向
    • 衍生物
    • 验证eta
    • 的功能

    我看到你链接函数的问题也需要y作为参数,但是,我不确定glm是否可以处理它,因为在它的拟合机制中它会在某个时刻调用linkfun并查看预定义的linkfuns,所有这些只需要一个参数。如果你扭曲了glm的代码,你就可以解决这个问题,但这将是一项相当大的工作要做(所有事情都未经过测试,只是作为思想的食物而不保证它会起作用):

    • 将您的linkfun / linkinvers等提供为function(mu, y) [whatever you want to have here]
    • 之类的内容
    • 创建glm.fitglm.fit2说)
    • 的副本
    • 将来自linkfun(mu)linkinv(eta)等的来电更改为linkfun(mu, y)linkinv(eta, y)等等
    • 当您致电glmmethod = "glm.fit2"告诉glm它应该使用您自己的验配程序。
  5. 推荐书是McCullagh,Nelder:广义线性模型。在哪里可以找到关于指数分布族,分数函数等的所有解释。

  6. 您可以查看包powerVarianceFamily的函数EQL,它还使用参数化族来扩展准似然可能性。

    更新

    刚刚从上一篇文章中的优秀答案中了解到,只要您在linkfun中使用glm.fit,就无需重新定义y,就像调用linkfun时y一样应该在封装功能中知道。所以你应该像这样定义linkfun

    function(mu) [a function which uses mu and y - 
       as y is known within the context where this function is called]