Skip to content

Commit

Permalink
Optimizers 'Rcgmin' and 'Rvmmin' available again.
Browse files Browse the repository at this point in the history
  • Loading branch information
wviechtb committed Apr 15, 2024
1 parent 1d9345b commit 0014f62
Show file tree
Hide file tree
Showing 130 changed files with 198 additions and 176 deletions.
6 changes: 3 additions & 3 deletions DESCRIPTION
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
Package: metafor
Version: 4.7-3
Date: 2024-04-12
Version: 4.7-4
Date: 2024-04-15
Title: Meta-Analysis Package for R
Authors@R: person(given = "Wolfgang", family = "Viechtbauer", role = c("aut","cre"), email = "[email protected]", comment = c(ORCID = "0000-0003-3463-4063"))
Depends: R (>= 4.0.0), methods, Matrix, metadat, numDeriv
Imports: stats, utils, graphics, grDevices, nlme, mathjaxr, pbapply
Suggests: lme4, pracma, minqa, nloptr, dfoptim, ucminf, lbfgsb3c, subplex, BB, Rsolnp, alabama, optimParallel, CompQuadForm, mvtnorm, BiasedUrn, Epi, survival, GLMMadaptive, glmmTMB, multcomp, gsl, sp, ape, boot, clubSandwich, crayon, R.rsp, testthat, rmarkdown, wildmeta, emmeans, estmeansd, metaBLUE, rstudioapi
Suggests: lme4, pracma, minqa, nloptr, dfoptim, ucminf, lbfgsb3c, subplex, BB, Rsolnp, alabama, optimParallel, optimx, CompQuadForm, mvtnorm, BiasedUrn, Epi, survival, GLMMadaptive, glmmTMB, multcomp, gsl, sp, ape, boot, clubSandwich, crayon, R.rsp, testthat, rmarkdown, wildmeta, emmeans, estmeansd, metaBLUE, rstudioapi
Description: A comprehensive collection of functions for conducting meta-analyses in R. The package includes functions to calculate various effect sizes or outcome measures, fit equal-, fixed-, random-, and mixed-effects models to such data, carry out moderator and meta-regression analyses, and create various types of meta-analytical plots (e.g., forest, funnel, radial, L'Abbe, Baujat, bubble, and GOSH plots). For meta-analyses of binomial and person-time data, the package also provides functions that implement specialized methods, including the Mantel-Haenszel method, Peto's method, and a variety of suitable generalized linear (mixed-effects) models (i.e., mixed-effects logistic and Poisson regression models). Finally, the package provides functionality for fitting meta-analytic multivariate/multilevel models that account for non-independent sampling errors and/or true effects (e.g., due to the inclusion of multiple treatment studies, multiple endpoints, or other forms of clustering). Network meta-analyses and meta-analyses accounting for known correlation structures (e.g., due to phylogenetic relatedness) can also be conducted. An introduction to the package can be found in Viechtbauer (2010) <doi:10.18637/jss.v036.i03>.
License: GPL (>=2)
ByteCompile: TRUE
Expand Down
4 changes: 3 additions & 1 deletion NEWS.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
# metafor 4.7-3 (2024-04-12)
# metafor 4.7-4 (2024-04-15)

- made optimizers `Rcgmin` and `Rvmmin` available again via the `optimx` package

- argument `shade` in `funnel()` now automatically uses a color gradient for the regions when multiple `level` values are specified

Expand Down
27 changes: 11 additions & 16 deletions R/misc.func.hidden.r
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@
if (as.list) {
return(list(x=x.flip, y=y.flip))
} else {
return(cbind(x.flip, y.flip))
return(unname(cbind(x.flip, y.flip)))
}

}
Expand Down Expand Up @@ -1659,14 +1659,9 @@
stop(mstyle$stop("Please install the 'alabama' package to use this optimizer."), call.=FALSE)
}

if (optimizer == "Rcgmin") {
if (!requireNamespace(optimizer, quietly=TRUE))
stop(mstyle$stop(paste0("Please install the '", optimizer, "' package to use this optimizer.")), call.=FALSE)
}

if (optimizer == "Rvmmin") {
if (!requireNamespace(optimizer, quietly=TRUE))
stop(mstyle$stop(paste0("Please install the '", optimizer, "' package to use this optimizer.")), call.=FALSE)
if (is.element(optimizer, c("Rcgmin","Rvmmin"))) {
if (!requireNamespace("optimx", quietly=TRUE))
stop(mstyle$stop(paste0("Please install the 'optimx' package to use this optimizer.")), call.=FALSE)
}

#########################################################################
Expand Down Expand Up @@ -1741,16 +1736,16 @@

if (optimizer == "Rcgmin") {
par.arg <- "par"
optimizer <- "Rcgmin::Rcgmin"
#ctrl.arg <- ", gr='grnd', control=optcontrol"
ctrl.arg <- ", control=optcontrol"
optimizer <- "optimx::Rcgmin"
ctrl.arg <- ", gr='grnd', control=optcontrol"
#ctrl.arg <- ", control=optcontrol"
}

if (optimizer == "Rvmmin") {
par.arg <- "par"
optimizer <- "Rvmmin::Rvmmin"
#ctrl.arg <- ", gr='grnd', control=optcontrol"
ctrl.arg <- ", control=optcontrol"
optimizer <- "optimx::Rvmmin"
ctrl.arg <- ", gr='grnd', control=optcontrol"
#ctrl.arg <- ", control=optcontrol"
}

if (optimizer == "optimParallel") {
Expand Down Expand Up @@ -1780,7 +1775,7 @@
if (optimizer == "lbfgsb3c::lbfgsb3c" && is.null(opt.res$convergence)) # special provision for lbfgsb3c in case 'convergence' is missing
opt.res$convergence <- -99

if (is.element(optimizer, c("optim","constrOptim","nlminb","dfoptim::hjk","dfoptim::nmk","lbfgsb3c::lbfgsb3c","subplex::subplex","BB::BBoptim","Rsolnp::solnp","alabama::constrOptim.nl","Rcgmin::Rcgmin","Rvmmin:Rvmmin","optimParallel::optimParallel")) && opt.res$convergence != 0)
if (is.element(optimizer, c("optim","constrOptim","nlminb","dfoptim::hjk","dfoptim::nmk","lbfgsb3c::lbfgsb3c","subplex::subplex","BB::BBoptim","Rsolnp::solnp","alabama::constrOptim.nl","optimx::Rcgmin","optimx:Rvmmin","optimParallel::optimParallel")) && opt.res$convergence != 0)
stop(mstyle$stop(paste0("Optimizer (", optimizer, ") did not achieve convergence (convergence = ", opt.res$convergence, ").")), call.=FALSE)

if (is.element(optimizer, c("dfoptim::mads")) && opt.res$convergence > optcontrol$tol)
Expand Down
31 changes: 18 additions & 13 deletions R/rma.glmm.r
Original file line number Diff line number Diff line change
Expand Up @@ -833,10 +833,15 @@ test="z", level=95, btt, nAGQ=7, verbose=FALSE, digits, control, ...) {
stop(mstyle$stop("Please install the 'BB' package to use this optimizer."))
}

if (is.element(optimizer, c("Rcgmin","Rvmmin"))) {
if (!requireNamespace("optimx", quietly=TRUE))
stop(mstyle$stop(paste0("Please install the 'optimx' package to use this optimizer.")))
}

if (is.element(optimizer, c("optim","nlminb","uobyqa","newuoa","bobyqa","nloptr","nlm","hjk","nmk","mads","ucminf","lbfgsb3c","subplex","BBoptim","optimParallel","Rcgmin","Rvmmin"))) {
con$hesspack <- match.arg(con$hesspack, c("numDeriv","pracma"))
if (!requireNamespace(con$hesspack, quietly=TRUE))
stop(mstyle$stop(paste0("Please install the '", con$hesspack, "' package to fit this model.")))
stop(mstyle$stop(paste0("Please install the '", con$hesspack, "' package to fit this model.")))
if (con$dnchgcalc == "dFNCHypergeo") {
if (!requireNamespace("BiasedUrn", quietly=TRUE))
stop(mstyle$stop("Please install the 'BiasedUrn' package to fit this model."))
Expand Down Expand Up @@ -1643,16 +1648,16 @@ test="z", level=95, btt, nAGQ=7, verbose=FALSE, digits, control, ...) {

if (optimizer == "Rcgmin") {
par.arg <- "par"
optimizer <- "Rcgmin::Rcgmin"
#ctrl.arg <- ", gr='grnd', control=optCtrl"
ctrl.arg <- ", control=optCtrl"
optimizer <- "optimx::Rcgmin"
ctrl.arg <- ", gr='grnd', control=optCtrl"
#ctrl.arg <- ", control=optCtrl"
}

if (optimizer == "Rvmmin") {
par.arg <- "par"
optimizer <- "Rvmmin::Rvmmin"
#ctrl.arg <- ", gr='grnd', control=optCtrl"
ctrl.arg <- ", control=optCtrl"
optimizer <- "optimx::Rvmmin"
ctrl.arg <- ", gr='grnd', control=optCtrl"
#ctrl.arg <- ", control=optCtrl"
}

if (optimizer == "optimParallel") {
Expand Down Expand Up @@ -1727,7 +1732,7 @@ test="z", level=95, btt, nAGQ=7, verbose=FALSE, digits, control, ...) {

### convergence checks

if (is.element(optimizer, c("optim","nlminb","dfoptim::hjk","dfoptim::nmk","lbfgsb3c::lbfgsb3c","subplex::subplex","BB::BBoptim","Rcgmin::Rcgmin","Rvmmin:Rvmmin","optimParallel::optimParallel")) && res.FE$convergence != 0)
if (is.element(optimizer, c("optim","nlminb","dfoptim::hjk","dfoptim::nmk","lbfgsb3c::lbfgsb3c","subplex::subplex","BB::BBoptim","optimx::Rcgmin","optimx::Rvmmin","optimParallel::optimParallel")) && res.FE$convergence != 0)
stop(mstyle$stop(paste0("Cannot fit FE model. Optimizer (", optimizer, ") did not achieve convergence (convergence = ", res.FE$convergence, ").")))

if (is.element(optimizer, c("dfoptim::mads")) && res.FE$convergence > optCtrl$tol)
Expand Down Expand Up @@ -1766,7 +1771,7 @@ test="z", level=95, btt, nAGQ=7, verbose=FALSE, digits, control, ...) {

### log-likelihood

if (is.element(optimizer, c("optim","dfoptim::hjk","dfoptim::nmk","dfoptim::mads","ucminf::ucminf","lbfgsb3c::lbfgsb3c","subplex::subplex","BB::BBoptim","Rcgmin::Rcgmin","Rvmmin:Rvmmin","optimParallel::optimParallel")))
if (is.element(optimizer, c("optim","dfoptim::hjk","dfoptim::nmk","dfoptim::mads","ucminf::ucminf","lbfgsb3c::lbfgsb3c","subplex::subplex","BB::BBoptim","optimx::Rcgmin","optimx::Rvmmin","optimParallel::optimParallel")))
ll.FE <- -1 * res.FE$value
if (is.element(optimizer, c("nlminb","nloptr::nloptr")))
ll.FE <- -1 * res.FE$objective
Expand Down Expand Up @@ -1822,7 +1827,7 @@ test="z", level=95, btt, nAGQ=7, verbose=FALSE, digits, control, ...) {

### convergence checks

if (QEconv && is.element(optimizer, c("optim","nlminb","dfoptim::hjk","dfoptim::nmk","lbfgsb3c::lbfgsb3c","subplex::subplex","BB::BBoptim","Rcgmin::Rcgmin","Rvmmin:Rvmmin","optimParallel::optimParallel")) && res.QE$convergence != 0) {
if (QEconv && is.element(optimizer, c("optim","nlminb","dfoptim::hjk","dfoptim::nmk","lbfgsb3c::lbfgsb3c","subplex::subplex","BB::BBoptim","optimx::Rcgmin","optimx:Rvmmin","optimParallel::optimParallel")) && res.QE$convergence != 0) {
warning(mstyle$warning(paste0("Cannot fit saturated model. Optimizer (", optimizer, ") did not achieve convergence (convergence = ", res.QE$convergence, ").")), call.=FALSE)
QEconv <- FALSE
ll.QE <- NA_real_
Expand Down Expand Up @@ -1887,7 +1892,7 @@ test="z", level=95, btt, nAGQ=7, verbose=FALSE, digits, control, ...) {

### log-likelihood

if (is.element(optimizer, c("optim","dfoptim::hjk","dfoptim::nmk","dfoptim::mads","ucminf::ucminf","lbfgsb3c::lbfgsb3c","subplex::subplex","BB::BBoptim","Rcgmin::Rcgmin","Rvmmin:Rvmmin","optimParallel::optimParallel")))
if (is.element(optimizer, c("optim","dfoptim::hjk","dfoptim::nmk","dfoptim::mads","ucminf::ucminf","lbfgsb3c::lbfgsb3c","subplex::subplex","BB::BBoptim","optimx::Rcgmin","optimx::Rvmmin","optimParallel::optimParallel")))
ll.QE <- -1 * res.QE$value
if (is.element(optimizer, c("nlminb","nloptr::nloptr")))
ll.QE <- -1 * res.QE$objective
Expand Down Expand Up @@ -2067,7 +2072,7 @@ test="z", level=95, btt, nAGQ=7, verbose=FALSE, digits, control, ...) {

### convergence checks

if (is.element(optimizer, c("optim","nlminb","dfoptim::hjk","dfoptim::nmk","lbfgsb3c::lbfgsb3c","subplex::subplex","BB::BBoptim","Rcgmin::Rcgmin","Rvmmin:Rvmmin","optimParallel::optimParallel")) && res.ML$convergence != 0)
if (is.element(optimizer, c("optim","nlminb","dfoptim::hjk","dfoptim::nmk","lbfgsb3c::lbfgsb3c","subplex::subplex","BB::BBoptim","optimx::Rcgmin","optimx::Rvmmin","optimParallel::optimParallel")) && res.ML$convergence != 0)
stop(mstyle$stop(paste0("Cannot fit ML model. Optimizer (", optimizer, ") did not achieve convergence (convergence = ", res.ML$convergence, ").")))

if (is.element(optimizer, c("dfoptim::mads")) && res.ML$convergence > optCtrl$tol)
Expand Down Expand Up @@ -2111,7 +2116,7 @@ test="z", level=95, btt, nAGQ=7, verbose=FALSE, digits, control, ...) {

### log-likelihood

if (is.element(optimizer, c("optim","dfoptim::hjk","dfoptim::nmk","dfoptim::mads","ucminf::ucminf","lbfgsb3c::lbfgsb3c","subplex::subplex","BB::BBoptim","Rcgmin::Rcgmin","Rvmmin:Rvmmin","optimParallel::optimParallel")))
if (is.element(optimizer, c("optim","dfoptim::hjk","dfoptim::nmk","dfoptim::mads","ucminf::ucminf","lbfgsb3c::lbfgsb3c","subplex::subplex","BB::BBoptim","optimx::Rcgmin","optimx:Rvmmin","optimParallel::optimParallel")))
ll.ML <- -1 * res.ML$value
if (is.element(optimizer, c("nlminb","nloptr::nloptr")))
ll.ML <- -1 * res.ML$objective
Expand Down
2 changes: 1 addition & 1 deletion R/selmodel.rma.uni.r
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ selmodel.rma.uni <- function(x, type, alternative="greater", prec, delta, steps,
tau2tol = min(vi/10, 1e-04), # threshold for treating tau^2 as effectively equal to 0 in the Hessian computation
deltatol = 1e-04, # threshold for treating deltas as effectively equal to 0 in the Hessian computation (only for stepfun)
pval.min = NULL, # minimum p-value to intergrate over (for selection models where this matters)
optimizer = "optim", # optimizer to use ("optim","nlminb","uobyqa","newuoa","bobyqa","nloptr","nlm","hjk","nmk","mads","ucminf","lbfgsb3c","subplex","BBoptim","optimParallel","solnp","alabama"/"constrOptim.nl")
optimizer = "optim", # optimizer to use ("optim","nlminb","uobyqa","newuoa","bobyqa","nloptr","nlm","hjk","nmk","mads","ucminf","lbfgsb3c","subplex","BBoptim","optimParallel","solnp","alabama"/"constrOptim.nl","Rcgmin","Rvmmin")
optmethod = "BFGS", # argument 'method' for optim() ("Nelder-Mead" and "BFGS" are sensible options)
parallel = list(), # parallel argument for optimParallel() (note: 'cl' argument in parallel is not passed; this is directly specified via 'cl')
cl = NULL, # arguments for optimParallel()
Expand Down
2 changes: 1 addition & 1 deletion R/zzz.r
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
.onAttach <- function(libname, pkgname) {

ver <- "4.7-3"
ver <- "4.7-4"

loadmsg <- paste0("\nLoading the 'metafor' package (version ", ver, "). For an\nintroduction to the package please type: help(metafor)\n")

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ metafor: A Meta-Analysis Package for R
[![R build status](https://github.com/wviechtb/metafor/workflows/R-CMD-check/badge.svg)](https://github.com/wviechtb/metafor/actions)
[![Code Coverage](https://codecov.io/gh/wviechtb/metafor/branch/master/graph/badge.svg)](https://app.codecov.io/gh/wviechtb/metafor)
[![CRAN Version](https://www.r-pkg.org/badges/version/metafor)](https://cran.r-project.org/package=metafor)
[![devel Version](https://img.shields.io/badge/devel-4.7--3-brightgreen.svg)](https://www.metafor-project.org/doku.php/installation#development_version)
[![devel Version](https://img.shields.io/badge/devel-4.7--4-brightgreen.svg)](https://www.metafor-project.org/doku.php/installation#development_version)
[![Monthly Downloads](https://cranlogs.r-pkg.org/badges/metafor)](https://cranlogs.r-pkg.org/badges/metafor)
[![Total Downloads](https://cranlogs.r-pkg.org/badges/grand-total/metafor)](https://cranlogs.r-pkg.org/badges/grand-total/metafor)

Expand Down
2 changes: 1 addition & 1 deletion docs/404.html

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion docs/ISSUE_TEMPLATE.html

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion docs/articles/index.html

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion docs/articles/pkgdown/diagram.html

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion docs/authors.html

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions docs/index.html

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 0014f62

Please sign in to comment.