【问题标题】:dredge doesn't work when specifying glmer optimizer指定 glmer 优化器时疏通不起作用
【发布时间】:2018-12-19 17:26:22
【问题描述】:

我正在尝试将 R 包 MuMIn 中的 dredge 与全局二项式 glmer 模型一起使用。我发现我需要用control = glmerControl(optimizer="bobyqa") 指定优化器以进行收敛。但是,当我使用dredge 时,我得到一个错误。如果我减少模型中的预测变量数量,我可以删除bobyqa 规范,获得收敛,并使用疏通。有什么方法可以让dredge 与glmerControl(optimizer="bobyqa") 一起使用?

test.glob=glmer(exploitpark~X + as.factor(Y) + Z + A + B + (1|ID), 
                family=binomial(), 
                glmerControl(optimizer="bobyqa"), data=df)
options(na.action = "na.fail")   #  prevent fitting models to different datasets
test.Set = dredge(test.glob, beta=c("partial.sd"), extra = c("R^2"))

Fixed term is "(Intercept)"

glm.control(optimizer = c("bobyqa", "bobyqa"), calc.derivs = TRUE, 中的错误: 未使用的参数(优化器 = c(“bobyqa”,“bobyqa”),calc.derivs = TRUE,use.last.params = FALSE,restart_edge = FALSE,boundary.tol = 1e-05,tolPwrss = 1e-07,compDev = TRUE,nAGQ0initStep = TRUE,checkControl = list(check.nobs.vs.rankZ = “忽略”,check.nobs.vs.nlev = “停止”,check.nlev.gtreq.5 = “忽略”,check.nlev。 gtr.1 =“停止”,check.nobs.vs.nRE =“停止”,check.rankX =“消息+drop.cols”,check.scaleX =“警告”,check.formula.LHS =“停止”, check.response.not.const = "stop"), checkConv = list(check.conv.grad = list( 动作 = “警告”,tol = 0.001,relTol = NULL),check.conv.singular = list(action = "message",tol = 1e-04),check.conv.hess = list(action = "warning", tol = 1e-06)), optCtrl = list())

【问题讨论】:

    标签: r lme4 mumin


    【解决方案1】:

    tl;dr 可能是 MuMIn::dredge() 中的一个错误 - 我仍在挖掘 - 但如果您忽略 extra="R^2" 规范,它似乎可以正常工作。

    可重现的例子

    set.seed(101)
    dd <- data.frame(x1=rnorm(200),x2=rnorm(200),x3=rnorm(200),
                     f=factor(rep(1:10,each=20)),
                     n=50)
    library(lme4)
    dd$y <- simulate(~x1+x2+x3+(1|f),
                     family=binomial,
                     weights=dd$n,
                     newdata=dd,
                     newparams=list(beta=c(1,1,1,1),
                                    theta=1))[[1]] 
    ## fit model
    m0 <- glmer(y~x1+x2+x3+(1|f),
                family=binomial,
                weights=n,
                data=dd,
                na.action="na.fail")
    

    现在试试 glmer()+dredge(),有和没有优化器规范

    library(MuMIn)
    d0 <- dredge(m0)
    m1 <- update(m0, control=glmerControl(optimizer="bobyqa"))
    d1 <- dredge(m1)
    

    这些都有效 - 所以问题一定出在一些可选参数上。测试:

    d0B <- dredge(m0, beta=c("partial.sd"), extra = c("R^2")) ## works
    d1B <- try(dredge(m1, beta=c("partial.sd"), extra = c("R^2"))) ## fails
    

    哪些额外的参数是罪魁祸首?

    d1C <- dredge(m1, beta=c("partial.sd"))  ## works
    d1D <- try(dredge(m1, extra=c("R^2")))   ## fails
    

    如果您真的非常想要您的 R^2 值,您可以将源代码下载/解压到包中,如下所示编辑 R/r.squaredLR.R 的第 101 行(将 cl$control 添加到设置为的元素列表中NULL,然后重新安装包...

    ===================================================================
    --- R/r.squaredLR.R (revision 443)
    +++ R/r.squaredLR.R (working copy)
    @@ -98,7 +98,7 @@
            if(formulaArgName != "formula")
                names(cl)[names(cl) == formulaArgName] <- "formula"
            cl$formula <- update(as.formula(cl$formula), . ~ 1)
    -       cl$method <- cl$start <- cl$offset <- contrasts <- NULL
    +       cl$method <- cl$start <- cl$offset <- cl$control <- contrasts <- NULL
        }
        cl <- cl[c(TRUE, names(cl)[-1L] %in% names(call2arg(cl)))]
        if(evaluate) eval(cl, envir = envir) else cl
    

    【讨论】:

    • 啊哈。实际上,删除 extra = c("R^2")) 就可以了。谢谢。
    【解决方案2】:

    问题在于r.squaredLR(由extra = "R^2" 暗示),它试图用glmer 的参数control = glmerControl(optimizer="bobyqa") 拟合glm 空模型。 (我会尝试在即将发布的 MuMIn 版本中实现这个 bug 的解决方案。)

    如果是glmer(或一般的混合模型),使用r.squaredGLMM 而不是r.squaredLR 可能会更好。因此,您需要为dredge 提供一个函数,该函数从r.squaredGLMM(返回matrix)的结果中提取R^2 向量。例如:

    # (following Ben Bolker's example above))
    # Fit a null model with RE (use a non-exported function .nullFitRE or specify it by hand:
    nullmodel <- MuMIn:::.nullFitRE(m1)
    # the above step is not necessary, but avoids repeated re-fitting of the null model.
    
    dredge(m1, beta="partial.sd", extra =list(R2 = function(x) {
        r.squaredGLMM(x, null = nullmodel)["delta", ]
    }))
    

    【讨论】:

      猜你喜欢
      • 2017-07-16
      • 2014-04-20
      • 1970-01-01
      • 2011-09-29
      • 2012-06-26
      • 1970-01-01
      • 2017-11-27
      • 1970-01-01
      • 2017-02-07
      相关资源
      最近更新 更多