生态学中的常见情况是具有二元结果的生存模型(0 =死亡,1 =存活),其中个体(对于该示例,认为鸟类的个体嵌套尝试)在暴露于风险的天数方面不同死亡率为了解释这一点,我们使用修改后的逻辑回归,其中将曝光天数包含在链接函数中 如Shaffer(2004)所述:
“通过选择适当的预测函数,每日生存率以x为模型,在我们的例子中,它应该产生0到1之间的值。与逻辑回归一样,我们使用S形逻辑函数:
我们的广义线性模型的系统分量是[s(x)] t。接下来,我们考虑函数:
上述函数相对于θ是单调且可微分的,并且可以示出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)。< / p>
在我们的案例中,我们希望将网站包含为随机效果。模型的制定方式与之前的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)' UNKN 另外:警告信息: 在if(!(lTyp&lt; - match(family $ link,linkNms,nomatch = 0)))stop(gettextf(“unknown link:%s”,: 条件的长度> 1,只使用第一个元素
错误消息列出了每行数据的未知链接,其数字对应于该嵌套访问(或数据行)的曝光天数。
例如:第一个'logexp(3)'对应于有3个曝光日的第一行数据。
是否有其他人能够在GLMER模型中使用此自定义链接功能?或者如果没有,是否有人知道导致错误的原因是什么?
UPDATE非常感谢Ben Bolker解决这个问题。我更新到3.0.2和最新版本的lme4并使用了链接函数Ben的R相关帖子(http://rpubs.com/bbolker/4082),这是这个:
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")
}
答案 0 :(得分:3)
您需要使用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")
}
您在上面指定的链接http://rpubs.com/bbolker/4082确实有这样一个模型的示例(但它确实需要最新版本的lme4
)。