Dredge не работает при указании оптимизатора glmer - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь использовать dredge из пакета R MuMIn с глобальной биномиальной моделью 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, border.tol = 1e-05, tolPwrss = 1e-07, compDev = TRUE, nAGQ0initStep = TRUE, checkControl = list (check.nobs.vs.rankZ = "игнорировать", check.nobs.vs.nlev = "стоп", check.nlev.gtreq.5 = "игнорировать", проверить.nlev.gtr.1 = "стоп", check.nobs.vs.nRE = "стоп", check.rankX = "message + drop.cols", check.scaleX = "предупреждение", check.formula.LHS = "stop ", check.response.not.const =" stop "), checkConv = список (check.conv.grad = список (action =" warning ", tol = 0.001, relTol = NULL), check.conv.singular = список(action = "message", tol = 1e-04), check.conv.hess = list (action = "warning", tol = 1e-06)), optCtrl = list ())

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Проблема в r.squaredLR (подразумевается extra = "R^2"), который пытается согласовать нулевую модель glm с аргументом glmer control = glmerControl(optimizer="bobyqa").(Я постараюсь реализовать решение для этой ошибки в следующей версии MuMIn.)

В случае glmer (или смешанных моделей в целом) может быть лучше использовать r.squaredGLMM, а не r.squaredLR.Поэтому вам нужно предоставить dredge функцию, которая извлекает вектор R ^ 2 из результата r.squaredGLMM (который возвращает matrix).Например:

# (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", ]
}))
0 голосов
/ 19 декабря 2018

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, вы можете загрузить / распаковатьИсходный код пакета, отредактируйте строку 101 из R/r.squaredLR.R, как указано ниже (добавьте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...