这个问题在过去已经在本网站上得到了解决,但所提供的答案对我来说并不完全有用。以下是我的问题的细节,这些细节实际上与此处讨论的内容有些不同:
在努力工作之后,我仍然无法理解如何在R中为glm
定义我自己的用户指定链接函数。我对此有几个问题。
首先,我知道我必须编写自己的函数(可能会修改已存在的函数),并且 - 在其中 - 我需要定义以下元素:
linkfun
:链接功能。linkinv
:链接函数的反转,作为" eta"的函数。mu.eta
:invlink的第一个衍生物,关于eta。valideta
:如果eta的值在正确的时间间隔内,则必须返回TRUE 并在列表元素中返回所有这些。
到目前为止,非常好。
以下是我的第一组问题:
链接功能有时被定义为" y"有时作为" mu"的功能。在这方面必须做些什么?
让我们举一个例子,然后输入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向量的一阶导数的最大值)。为什么?我仍然无法理解这一点。
仅仅因为我的好奇心,为什么算法需要invlink的第一个派生对eta?这对我来说并不完全清楚。
在我的具体案例中,我需要对二项式数据进行准逻辑回归。我没有标准的logit函数log(p/(1-p))
,而是需要稍加修改的链接函数(如果p被定义为Y / N):log((Y+0.5)/(N-Y+0.5))
。
在这种情况下我的另一个问题是:
我仍然无法建立这个......有人可以给我一些提示吗?
我在哪里可以找到所有这些的详细说明?我看过好老钱伯斯& Hastie书(1992),但解释是不够的。网上有没有详细的课程等?
答案 0 :(得分:1)
不确定我是否可以回答您的所有问题,但我试一试:
您是否可以指定linkfun
mu
和 y
?根据我的知识,链接函数应该只有mu
作为GLM(而不是LM)模型的函数expcetd值mu
(又名链接函数)而不是excetd值本身。因此,应该只有mu
作为参数。
这与vectorization
有关。 pmax
返回并行最大值,我们希望确保不会报告小于Machine$double.eps
的值。因此linkfun不会返回所有exp(eta)
的最大值(即max(exp(eta), .Machine$double.eps)
)。现在想象一下,eta
现在是您要计算的所有eta
的向量,然后是linkinv
,pmax(.)
确保仅返回exp(eta)
在这些情况下确实大于.Machine$double.eps
。所以你还返回vector
的最大值。 (尝试pmax(1:6, 4)
您将获得[1] 4 4 4 4 5 6
)
您需要一阶导数才能计算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]
的估计值,你需要链接函数的导数因此,在您的情况下,您需要定义:
eta
我看到你链接函数的问题也需要y
作为参数,但是,我不确定glm
是否可以处理它,因为在它的拟合机制中它会在某个时刻调用linkfun
并查看预定义的linkfuns,所有这些只需要一个参数。如果你扭曲了glm
的代码,你就可以解决这个问题,但这将是一项相当大的工作要做(所有事情都未经过测试,只是作为思想的食物而不保证它会起作用):
function(mu, y) [whatever you want to have here]
glm.fit
(glm.fit2
说)linkfun(mu)
,linkinv(eta)
等的来电更改为linkfun(mu, y)
,linkinv(eta, y)
等等glm
时method = "glm.fit2"
告诉glm
它应该使用您自己的验配程序。推荐书是McCullagh,Nelder:广义线性模型。在哪里可以找到关于指数分布族,分数函数等的所有解释。
您可以查看包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]