gpt4 book ai didi

r - 用于已知命运生存建模的 glmer 的用户定义链接函数

转载 作者:行者123 更新时间:2023-12-04 04:40:06 26 4
gpt4 key购买 nike

生态学中的一种常见情况是具有二元结果(0 = 死亡,1 = 存活)的生存模型,其中个体(在此示例中考虑鸟类的个体嵌套尝试)在面临死亡风险的天数方面存在差异。为了解决这个问题,我们使用修改后的逻辑回归,将暴露天数纳入链接函数。
正如 Shaffer (2004) 所描述的:
“通过选择合适的预测函数,每日存活率是根据 x 建模的,在我们的例子中,它应该产生介于 0 和 1 之间的值。正如在逻辑回归中所做的那样,我们使用 S 形逻辑函数:
enter image description here
我们广义线性模型的系统组成部分是 [s(x)]t。接下来,我们考虑函数:
enter image description here
上述函数相对于 θ 是单调可微的,可以证明 g(θ) = β0 + β1x,满足广义线性模型中链接函数的标准。这三个组件:二项式响应分布、表达式 1 中给出的预测函数和表达式 2 中给出的链接函数,完全指定了我们的广义线性模型。该模型(以下称为“逻辑暴露模型”)类似于逻辑回归模型,但不同之处在于链接函数的形式。逻辑暴露链接函数在分子和分母中包含一个指数 (1/t),该指数在逻辑回归链接函数中不存在。指数是必要的,以说明在区间存活的概率取决于区间长度这一事实。”
这个链接函数的代码可以在网上找到,如果你输入“help(family)”,它也是 R 中描述的示例链接函数之一:

logexp <- function(days = 1)
{
linkfun <- function(mu) qlogis(mu^(1/days))
linkinv <- function(eta) plogis(eta)^days
mu.eta <- function(eta) days * plogis(eta)^(days-1) *
.Call("logit_mu_eta", eta, PACKAGE = "stats")
valideta <- function(eta) TRUE
link <- paste("logexp(", days, ")", sep="")
structure(list(linkfun = linkfun, linkinv = linkinv,
mu.eta = mu.eta, valideta = valideta, name = link),
class = "link-glm")
}
它在这样的模型中工作得很好:
glm(survive ~ date, family=binomial(link=logexp(days=dat$Days)),data=dat)
我遇到的问题是尝试在 GLMER 模型中使用此自定义链接函数并添加随机效果时(我在此处找到了此方法的一个在线示例: http://rstudio-pubs-static.s3.amazonaws.com/4082_51aa699bd9f041c7b3f7cf7b9252f60c.html)。
在我们的例子中,我们希望包含站点作为随机效果。模型的制定方式与之前的 GLM 相同:
glmer(survive ~ date + (1|site), family=binomial(link=logexp(days=dat$Days)),data=dat)
但是,现在我收到一条错误消息:
famType(glmFit$family) 中的错误:
未知链接:'logexp(3)'未知链接:'logexp(4)'未知链接:'logexp(3)'未知链接:'logexp(2)'未知链接:'logexp(3)'未知链接:'logexp (3)'未知链接:'logexp(4)'未知链接:'logexp(3)'未知链接:'logexp(2)'未知链接:'logexp(1)'未知链接:'logexp(4)'未知链接:'logexp(5)'未知链接:'logexp(4)'未知链接:'logexp(3)'未知链接:'logexp(4)'未知链接:'logexp(5)'未知链接:'logexp( 3)'未知链接:'logexp(4)'未知链接:'logexp(3)'未知链接:'logexp(3)'未知链接:'logexp(3)'未知链接:'logexp(3)'未知链接:'logexp(3)'未知链接:'logexp(3)'未知链接:'logexp(3)'未知链接:'logexp(3)'未知链接:'logexp(3)'未知链接:'logexp(2) )'未知链接:'logexp(1)'未知链接:'logexp(3)'未知链接:'logexp(1)'未知链接:'logexp(1)'未知链接:'logexp(1)'未知链接: 'logexp(1)'不知道
另外: 警告信息:
在 if (!(lTyp <- match(family$link, linkNms, nomatch = 0))) stop(gettextf("unknown link: %s", :
条件的长度 > 1 并且只使用第一个元素
错误消息为每一行数据列出了一个未知链接,并带有与该巢访问(或数据行)的暴露天数相对应的数字。
例如:第一个 'logexp(3)' 对应于具有 3 个曝光天数的第一行数据。
有没有其他人能够在 GLMER 模型中使用这个自定义链接函数?或者,如果没有,有人知道导致错误的原因吗?
######更新######
非常感谢 Ben Bolker 解决了这个问题。我更新到 3.0.2 和最新版本的 lme4 并使用了 Ben 的 R 相关帖子( https://www.rpubs.com/bbolker/logregexp )的链接功能,这是这个:
library(MASS)
logexp <- function(exposure = 1)
{
linkfun <- function(mu) qlogis(mu^(1/exposure))
## FIXME: is there some trick we can play here to allow
## evaluation in the context of the 'data' argument?
linkinv <- function(eta) plogis(eta)^exposure
mu.eta <- function(eta) exposure * plogis(eta)^(exposure-1) *
.Call(stats:::C_logit_mu_eta, eta, PACKAGE = "stats")
valideta <- function(eta) TRUE
link <- paste("logexp(", deparse(substitute(exposure)), ")",
sep="")
structure(list(linkfun = linkfun, linkinv = linkinv,
mu.eta = mu.eta, valideta = valideta,
name = link),
class = "link-glm")
}

最佳答案

您需要使用更新版本的 lme4包,例如刚刚在 CRAN 上发布的 1.0-4 版本。早期版本不允许用户指定的链接功能。
另外,请注意,您在上面发布的代码不是最近版本的 ?family 中出现的代码。 ,其中(已过时).Call("logit_mu_eta", eta, PACKAGE = "stats")被纯 R 实现取代:

logexp <- function(days = 1)
{
linkfun <- function(mu) qlogis(mu^(1/days))
linkinv <- function(eta) plogis(eta)^days
mu.eta <- function(eta) days * plogis(eta)^(days-1) * binomial()$mu_eta
valideta <- function(eta) TRUE
link <- paste0("logexp(", days, ")")
structure(list(linkfun = linkfun, linkinv = linkinv,
mu.eta = mu.eta, valideta = valideta, name = link),
class = "link-glm")
}
link you specified above事实上确实有这样一个模型的例子(但它确实需要最新版本的 lme4 )。

关于r - 用于已知命运生存建模的 glmer 的用户定义链接函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19012128/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com