能否对glmer模型进行反向转换以用于emmeans事后检验?自定义链接函数场景下的问题求助
解决自定义链接函数下emmeans的反向转换问题
我明白你遇到的困扰了——用自定义的-1000/y链接函数拟合glmer模型后,emmeans没法自动识别对应的反向转换规则,导致报错。下面是两个实用的解决办法:
方法1:手动给emmeans指定反向转换函数
emmeans默认只识别内置的转换方式,对于自定义链接,我们可以直接把你的linkinv函数传给它,强制完成反向转换。步骤如下:
# 先获取线性预测尺度的emmeans结果 emm <- emmeans(model2, ~ X1 * X2) # 方式A:在emmeans调用时直接指定linkinv emm_response <- emmeans(model2, ~ X1 * X2, type = "response", linkinv = invfn()$linkinv) # 方式B:用regrid函数对已有的emmeans对象做转换 emm_response <- regrid(emm, transform = invfn()$linkinv)
这样就能把emmeans输出的线性预测值(eta)通过-1000/eta转换回原始响应变量Y的尺度,完全匹配你的自定义链接规则。
方法2:修改自定义链接函数,让emmeans自动识别
我们可以给自定义链接函数添加emmeans能识别的元信息,这样后续调用type="response"时就能自动完成转换。修改你的invfn函数:
invfn <- function() { ## link linkfun <- function(y) -1000/y ## inverse link linkinv <- function(eta) -1000/eta ## derivative of invlink wrt eta mu.eta <- function(eta) { 1000/(eta^2) } valideta <- function(eta) TRUE link <- "-1000/y" # 添加emmeans识别的转换属性 tran <- list( name = "inv1000", tran = function(y) -1000/y, inv = function(eta) -1000/eta, dir = "backward" ) structure( list(linkfun = linkfun, linkinv = linkinv, mu.eta = mu.eta, valideta = valideta, name = link, tran = tran), class = c("link-glm", "emmLink") # 添加emmLink类让emmeans识别 ) }
修改后重新拟合模型,之后直接用type="response"就能自动完成反向转换了:
model2 <- glmer(Y~X1 + X2 + X3 + X1*X2 + X1*X3 + (1 | Subject), data=dataset, family=inverse.gaussian(link=invfn()),glmerControl(optimizer="Nelder_Mead")) emm_response <- emmeans(model2, ~ X1 * X2, type = "response")
小提示
两种方法的核心都是让emmeans明确知道:线性预测值eta和原始响应Y的关系是Y = -1000/eta,只要传递这个规则就能解决转换问题。
内容的提问来源于stack exchange,提问作者Sybren VAN HOORNWEDER
相关产品推荐
相关产品推荐

