rma.glmm.Rd
Function to fit meta-analytic equal-, fixed-, and random-effects models and (mixed-effects) meta-regression models using a generalized linear (mixed-effects) model framework. See below and the introduction to the metafor-package for more details on these models.
rma.glmm(ai, bi, ci, di, n1i, n2i, x1i, x2i, t1i, t2i, xi, mi, ti, ni,
mods, measure, data, slab, subset,
add=1/2, to="only0", drop00=TRUE, intercept=TRUE,
model="UM.FS", method="ML", coding=1/2, cor=FALSE, test="z",
level=95, btt, nAGQ=7, verbose=FALSE, digits, control, ...)
These arguments pertain to data input:
see below and the documentation of the escalc
function for more details.
see below and the documentation of the escalc
function for more details.
see below and the documentation of the escalc
function for more details.
see below and the documentation of the escalc
function for more details.
see below and the documentation of the escalc
function for more details.
see below and the documentation of the escalc
function for more details.
see below and the documentation of the escalc
function for more details.
see below and the documentation of the escalc
function for more details.
see below and the documentation of the escalc
function for more details.
see below and the documentation of the escalc
function for more details.
see below and the documentation of the escalc
function for more details.
see below and the documentation of the escalc
function for more details.
see below and the documentation of the escalc
function for more details.
see below and the documentation of the escalc
function for more details.
optional argument to include one or more moderators in the model. A single moderator can be given as a vector of length \(k\) specifying the values of the moderator. Multiple moderators are specified by giving a matrix with \(k\) rows and as many columns as there are moderator variables. Alternatively, a model formula
can be used to specify the model. See ‘Details’.
character string to specify the outcome measure to use for the meta-analysis. Possible options are "OR"
for the (log transformed) odds ratio, "IRR"
for the (log transformed) incidence rate ratio, "PLO"
for the (logit transformed) proportion, or "IRLN"
for the (log transformed) incidence rate.
optional data frame containing the data supplied to the function.
optional vector with labels for the \(k\) studies.
optional (logical or numeric) vector to specify the subset of studies that should be used for the analysis.
These arguments pertain to handling of zero cells/counts/frequencies:
non-negative number to specify the amount to add to zero cells, counts, or frequencies when calculating the observed effect sizes or outcomes of the individual studies. See below and the documentation of the escalc
function for more details.
character string to specify when the values under add
should be added (either "only0"
, "all"
, "if0all"
, or "none"
). See below and the documentation of the escalc
function for more details.
logical to specify whether studies with no cases/events (or only cases) in both groups should be dropped. See the documentation of the escalc
function for more details.
These arguments pertain to the model / computations and output:
logical to specify whether an intercept should be added to the model (the default is TRUE
).
character string to specify the general model type for the analysis. Either "UM.FS"
(the default), "UM.RS"
, "CM.EL"
, or "CM.AL"
. See ‘Details’.
character string to specify whether an equal- or a random-effects model should be fitted. An equal-effects model is fitted when using method="EE"
. A random-effects model is fitted by setting method="ML"
(the default). See ‘Details’.
numeric scalar to specify how the group variable should be coded in the random effects structure for random/mixed-effects models (the default is 1/2
). See ‘Note’.
logical to specify whether the random study effects should be allowed to be correlated with the random group effects for random/mixed-effects models when model="UM.RS"
(the default is FALSE
). See ‘Note’.
character string to specify how test statistics and confidence intervals for the fixed effects should be computed. By default (test="z"
), Wald-type tests and CIs are obtained, which are based on a standard normal distribution. When test="t"
, a t-distribution is used instead. See ‘Details’ and also here for some recommended practices.
numeric value between 0 and 100 to specify the confidence interval level (the default is 95; see here for details).
optional vector of indices to specify which coefficients to include in the omnibus test of moderators. Can also be a string to grep
for. See ‘Details’.
positive integer to specify the number of points per axis for evaluating the adaptive Gauss-Hermite approximation to the log-likelihood. The default is 7. Setting this to 1 corresponds to the Laplacian approximation. See ‘Note’.
logical to specify whether output should be generated on the progress of the model fitting (the default is FALSE
). Can also be an integer. Values > 1 generate more verbose output. See ‘Note’.
optional integer to specify the number of decimal places to which the printed results should be rounded. If unspecified, the default is 4. See also here for further details on how to control the number of digits in the output.
optional list of control values for the estimation algorithms. If unspecified, default values are defined inside the function. See ‘Note’.
additional arguments.
The function can be used in combination with the following effect sizes or outcome measures:
measure="OR"
for (log transformed) odds ratios,
measure="IRR"
for (log transformed) incidence rate ratios,
measure="PLO"
for (logit transformed) proportions (i.e., log odds),
measure="IRLN"
for (log transformed) incidence rates.
The escalc
function describes the data/arguments that should be specified/used for these measures.
A variety of model types are available when analyzing \(2 \times 2\) table data (i.e., when measure="OR"
) or two-group event count data (i.e., when measure="IRR"
):
model="UM.FS"
for an unconditional generalized linear mixed-effects model with fixed study effects,
model="UM.RS"
for an unconditional generalized linear mixed-effects model with random study effects,
model="CM.AL"
for a conditional generalized linear mixed-effects model (approximate likelihood),
model="CM.EL"
for a conditional generalized linear mixed-effects model (exact likelihood).
For measure="OR"
, models "UM.FS"
and "UM.RS"
are essentially (mixed-effects) logistic regression models, while for measure="IRR"
, these models are (mixed-effects) Poisson regression models. The difference between "UM.FS"
and "UM.RS"
is how study level variability (i.e., differences in outcomes across studies irrespective of group membership) is modeled. One can choose between using fixed study effects (which means that \(k\) dummy variables are added to the model) or random study effects (which means that random effects corresponding to the levels of the study factor are added to the model).
The conditional model (model="CM.EL"
) avoids having to model study level variability by conditioning on the total numbers of cases/events in each study. For measure="OR"
, this leads to a non-central hypergeometric distribution for the data within each study and the corresponding model is then a (mixed-effects) conditional logistic model. Fitting this model can be difficult and computationally expensive. When the number of cases in each study is small relative to the group sizes, one can approximate the exact likelihood by a binomial distribution, which leads to a regular (mixed-effects) logistic regression model (model="CM.AL"
). For measure="IRR"
, the conditional model leads directly to a binomial distribution for the data within each study and the resulting model is again a (mixed-effects) logistic regression model (no approximate likelihood model is needed here).
When analyzing proportions (i.e., measure="PLO"
) or incidence rates (i.e., measure="IRLN"
) of individual groups, the model type is always a (mixed-effects) logistic or Poisson regression model, respectively (i.e., the model
argument is not relevant here).
Aside from choosing the general model type, one has to decide whether to fit an equal- or a random-effects model to the data. An equal-effects model is fitted by setting method="EE"
. A random-effects model is fitted by setting method="ML"
(the default). Note that random-effects models with dichotomous data are often referred to as ‘binomial-normal’ models in the meta-analytic literature. Analogously, for event count data, such models could be referred to as ‘Poisson-normal’ models.
One or more moderators can be included in a model via the mods
argument. A single moderator can be given as a (row or column) vector of length \(k\) specifying the values of the moderator. Multiple moderators are specified by giving an appropriate model matrix (i.e., \(X\)) with \(k\) rows and as many columns as there are moderator variables (e.g., mods = cbind(mod1, mod2, mod3)
, where mod1
, mod2
, and mod3
correspond to the names of the variables for three moderator variables). The intercept is added to the model matrix by default unless intercept=FALSE
.
Alternatively, one can use standard formula
syntax to specify the model. In this case, the mods
argument should be set equal to a one-sided formula of the form mods = ~ model
(e.g., mods = ~ mod1 + mod2 + mod3
). Interactions, polynomial/spline terms, and factors can be easily added to the model in this manner. When specifying a model formula via the mods
argument, the intercept
argument is ignored. Instead, the inclusion/exclusion of the intercept is controlled by the specified formula (e.g., mods = ~ 0 + mod1 + mod2 + mod3
or mods = ~ mod1 + mod2 + mod3 - 1
would lead to the removal of the intercept).
When fitting a particular model, actually up to three different models are fitted within the function:
the equal-effects model (i.e., where \(\tau^2\) is set to 0),
the saturated model (i.e., the model with a deviance of 0), and
the random/mixed-effects model (i.e., where \(\tau^2\) is estimated) (only if method="ML"
).
The saturated model is obtained by adding as many dummy variables to the model as needed so that the model deviance is equal to zero. Even when method="ML"
, the equal- and saturated models are also fitted, as they are used to compute the test statistics for the Wald-type and likelihood ratio tests for (residual) heterogeneity (see below).
For models including moderators, an omnibus test of all model coefficients is conducted that excludes the intercept (the first coefficient) if it is included in the model. If no intercept is included in the model, then the omnibus test includes all coefficients in the model including the first. Alternatively, one can manually specify the indices of the coefficients to test via the btt
(‘betas to test’) argument (i.e., to test \(\text{H}_0{:}\; \beta_{j \in \texttt{btt}} = 0\), where \(\beta_{j \in \texttt{btt}}\) is the set of coefficients to be tested). For example, with btt=c(3,4)
, only the third and fourth coefficients from the model are included in the test (if an intercept is included in the model, then it corresponds to the first coefficient in the model). Instead of specifying the coefficient numbers, one can specify a string for btt
. In that case, grep
will be used to search for all coefficient names that match the string. The omnibus test is called the \(Q_M\)-test and follows asymptotically a chi-square distribution with \(m\) degrees of freedom (with \(m\) denoting the number of coefficients tested) under the null hypothesis (that the true value of all coefficients tested is equal to 0).
Categorical moderator variables can be included in the model via the mods
argument in the same way that appropriately (dummy) coded categorical variables can be included in linear models. One can either do the dummy coding manually or use a model formula together with the factor
function to automate the coding (note that string/character variables in a model formula are automatically converted to factors).
By default, tests of individual coefficients in the model (and the corresponding confidence intervals) are based on a standard normal distribution, while the omnibus test is based on a chi-square distribution (see above). As an alternative, one can set test="t"
, in which case tests of individual coefficients and confidence intervals are based on a t-distribution with \(k-p\) degrees of freedom, while the omnibus test then uses an F-distribution with \(m\) and \(k-p\) degrees of freedom (with \(k\) denoting the total number of estimates included in the analysis and \(p\) the total number of model coefficients including the intercept if it is present). Note that test="t"
is not the same as test="knha"
in rma.uni
, as no adjustment to the standard errors of the estimated coefficients is made.
Two different tests for (residual) heterogeneity are automatically carried out by the function. The first is a Wald-type test, which tests the coefficients corresponding to the dummy variables added in the saturated model for significance. The second is a likelihood ratio test, which tests the same set of coefficients, but does so by computing \(-2\) times the difference in the log-likelihoods of the equal-effects and the saturated models. These two tests are not identical for the types of models fitted by the rma.glmm
function and may even lead to conflicting conclusions.
The various models do not require the calculation of the observed effect sizes or outcomes of the individual studies (e.g., the observed log odds ratios of the \(k\) studies) and directly make use of the cell/event counts. Zero cells/events are not a problem (except in extreme cases, such as when one of the two outcomes never occurs or when there are no events in any of the studies). Therefore, it is unnecessary to add some constant to the cell/event counts when there are zero cells/events.
However, for plotting and various other functions, it is necessary to calculate the observed effect sizes or outcomes for the \(k\) studies. Here, zero cells/events can be problematic, so adding a constant value to the cell/event counts ensures that all \(k\) values can be calculated. The add
and to
arguments are used to specify what value should be added to the cell/event counts and under what circumstances when calculating the observed effect sizes or outcomes. The documentation of the escalc
function explains how the add
and to
arguments work. Note that drop00
is set to TRUE
by default, since studies where ai=ci=0
or bi=di=0
or studies where x1i=x2i=0
are uninformative about the size of the effect.
An object of class c("rma.glmm","rma")
. The object is a list containing the following components:
estimated coefficients of the model.
standard errors of the coefficients.
test statistics of the coefficients.
corresponding p-values.
lower bound of the confidence intervals for the coefficients.
upper bound of the confidence intervals for the coefficients.
variance-covariance matrix of the estimated coefficients.
estimated amount of (residual) heterogeneity. Always 0
when method="EE"
.
estimated amount of study level variability (only for model="UM.RS"
).
number of studies included in the analysis.
number of coefficients in the model (including the intercept).
number of coefficients included in the omnibus test of moderators.
Wald-type test statistic of the test for (residual) heterogeneity.
corresponding p-value.
likelihood ratio test statistic of the test for (residual) heterogeneity.
corresponding p-value.
test statistic of the omnibus test of moderators.
corresponding p-value.
value of \(I^2\).
value of \(H^2\).
logical that indicates whether the model is an intercept-only model.
the vector of outcomes, the corresponding sampling variances, and the model matrix.
a list with the log-likelihood, deviance, AIC, BIC, and AICc values.
some additional elements/values.
The results of the fitted model are formatted and printed with the print
function. If fit statistics should also be given, use summary
(or use the fitstats
function to extract them).
When measure="OR"
or measure="IRR"
, model="UM.FS"
or model="UM.RS"
, and method="ML"
, one has to choose a coding scheme for the group variable in the random effects structure. When coding=1/2
(the default), the two groups are coded with +1/2
and -1/2
(i.e., contrast coding), which is invariant under group label switching.
When coding=1
, the first group is coded with 1
and the second group with 0
. Finally, when coding=0
, the first group is coded with 0
and the second group with 1
. Note that these coding schemes are not invariant under group label switching.
When model="UM.RS"
and method="ML"
, one has to decide whether the random study effects are allowed to be correlated with the random group effects. By default (i.e., when cor=FALSE
), no such correlation is allowed (which is typically an appropriate assumption when coding=1/2
). When using a different coding scheme for the group variable (i.e., coding=1
or coding=0
), allowing the random study and group effects to be correlated (i.e., using cor=TRUE
) is usually recommended.
Fitting the various types of models requires several different iterative algorithms:
For model="UM.FS"
and model="CM.AL"
, iteratively reweighted least squares (IWLS) as implemented in the glm
function is used for fitting the equal-effects and the saturated models. For method="ML"
, adaptive Gauss-Hermite quadrature as implemented in the glmer
function is used. The same applies when model="CM.EL"
is used in combination with measure="IRR"
or when measure="PLO"
or measure="IRLN"
(regardless of the model type).
For model="UM.RS"
, adaptive Gauss-Hermite quadrature as implemented in the glmer
function is used to fit all of the models.
For model="CM.EL"
and measure="OR"
, the quasi-Newton method optimizer as implemented in the nlminb
function is used by default for fitting the equal-effects and the saturated models. For method="ML"
, the same algorithm is used, together with adaptive quadrature as implemented in the integrate
function (for the integration over the density of the non-central hypergeometric distribution). Standard errors of the parameter estimates are obtained by inverting the Hessian, which is numerically approximated using the hessian
function from the numDeriv
package. One can also set control=list(hesspack="pracma")
or control=list(hesspack="calculus")
in which case the pracma::hessian
or calculus::hessian
functions from the respective packages are used instead for approximating the Hessian. When \(\tau^2\) is estimated to be smaller than \(10^{-4}\), then \(\tau^2\) is effectively treated as zero for computing the standard errors (which helps to avoid numerical problems in approximating the Hessian). This cutoff can be adjusted via the tau2tol
control argument (e.g., control=list(tau2tol=0)
to switch off this behavior).
One can also chose a different optimizer from optim
via the control
argument (e.g., control=list(optimizer="BFGS")
or control=list(optimizer="Nelder-Mead")
). Besides nlminb
and one of the methods from optim
, one can also choose one of the optimizers from the minqa
package (i.e., uobyqa
, newuoa
, or bobyqa
), one of the (derivative-free) algorithms from the nloptr
package, the Newton-type algorithm implemented in nlm
, the various algorithms implemented in the dfoptim
package (hjk
for the Hooke-Jeeves, nmk
for the Nelder-Mead, and mads
for the Mesh Adaptive Direct Searches algorithm), the quasi-Newton type optimizers ucminf
and lbfgsb3c
and the subspace-searching simplex algorithm subplex
from the packages of the same name, the Barzilai-Borwein gradient decent method implemented in BBoptim
, the Rcgmin
and Rvmmin
optimizers, or the parallelized version of the L-BFGS-B algorithm implemented in optimParallel
from the package of the same name.
The optimizer name must be given as a character string (i.e., in quotes). Additional control parameters can be specified via the optCtrl
elements of the control
argument (e.g., control=list(optCtrl=list(iter.max=1000, rel.tol=1e-8))
). For nloptr
, the default is to use the BOBYQA implementation from that package with a relative convergence criterion of 1e-8
on the function value (i.e., log-likelihood), but this can be changed via the algorithm
and ftop_rel
arguments (e.g., control=list(optimizer="nloptr", optCtrl=list(algorithm="NLOPT_LN_SBPLX", ftol_rel=1e-6))
). For optimParallel
, the control argument ncpus
can be used to specify the number of cores to use for the parallelization (e.g., control=list(optimizer="optimParallel", ncpus=2)
). With parallel::detectCores()
, one can check on the number of available cores on the local machine.
When model="CM.EL"
and measure="OR"
, actually model="CM.AL"
is used first to obtain starting values for optim
, so either 4 (if method="EE"
) or 6 (if method="ML"
) models need to be fitted in total.
Various additional control parameters can be adjusted via the control
argument:
glmCtrl
is a list of named arguments to be passed on to the control
argument of the glm
function,
glmerCtrl
is a list of named arguments to be passed on to the control
argument of the glmer
function,
intCtrl
is a list of named arguments (i.e., rel.tol
and subdivisions
) to be passed on to the integrate
function, and
hessianCtrl
is a list of named arguments to be passed on to the method.args
argument of the hessian
function. Most important is the r
argument, which is set to 16 by default (i.e., control=list(hessianCtrl=list(r=16))
). If the Hessian cannot be inverted, it may be necessary to adjust the r
argument to a different number (e.g., try r=4
, r=6
, or r=8
).
Also, for glmer
, the nAGQ
argument is used to specify the number of quadrature points. The default value is 7, which should provide sufficient accuracy in the evaluation of the log-likelihood in most cases, but at the expense of speed. Setting this to 1 corresponds to the Laplacian approximation (which is faster, but less accurate). Note that glmer
does not allow values of nAGQ > 1
when model="UM.RS"
and method="ML"
, so this value is automatically set to 1 for this model.
Instead of glmer
, one can also choose to use mixed_model
from the GLMMadaptive
package or glmmTMB
from the glmmTMB
package for the model fitting. This is done by setting control=list(package="GLMMadaptive")
or control=list(package="glmmTMB")
, respectively.
Information on the progress of the various algorithms can be obtained by setting verbose=TRUE
. Since fitting the various models can be computationally expensive, this option is useful to determine how the model fitting is progressing. One can also set verbose
to an integer (verbose=2
yields even more information and verbose=3
also sets option(warn=1)
temporarily).
For model="CM.EL"
and measure="OR"
, optimization involves repeated calculation of the density of the non-central hypergeometric distribution. When method="ML"
, this also requires integration over the same density. This is currently implemented in a rather brute-force manner and may not be numerically stable, especially when models with moderators are fitted. Stability can be improved by scaling the moderators in a similar manner (i.e., don't use a moderator that is coded 0 and 1, while another uses values in the 1000s). For models with an intercept and moderators, the function actually rescales (non-dummy) variables to z-scores during the model fitting (results are given after back-scaling, so this should be transparent to the user). For models without an intercept, this is not done, so sensitivity analyses are highly recommended here (to ensure that the results do not depend on the scaling of the moderators). Also, if a warning is issued that the standard errors of the fixed effects are unusually small, one should try sensitivity analyses with different optimizers and/or adjusted settings for the hessianCtrl
and tau2tol
control arguments.
Finally, there is also (experimental!) support for the following measures:
measure="RR"
for log transformed risk ratios,
measure="RD"
for raw risk differences,
measure="PLN"
for log transformed proportions,
measure="PR"
for raw proportions,
(the first two only for models "UM.FS"
and "UM.RS"
) by using log and identity links for the binomial models. However, model fitting with these measures will often lead to numerical problems.
Via the (undocumented) link
argument, one can also directly adjust the link function that is used (by default, measures "OR"
and "PLO"
use a "logit"
link, measures "RR"
and "PLN"
use a "log"
link, measures "RD"
and "PR"
use an "identity"
link, and measures "IRR"
and "IRLN"
use a "log"
link). See family
for alternative options. Changing these defaults is only recommended for users familiar with the consequences and the interpretation of the resulting estimates (when misused, the results could be meaningless).
Agresti, A. (2002). Categorical data analysis (2nd. ed). Hoboken, NJ: Wiley.
Bagos, P. G., & Nikolopoulos, G. K. (2009). Mixed-effects Poisson regression models for meta-analysis of follow-up studies with constant or varying durations. The International Journal of Biostatistics, 5(1). https://doi.org/10.2202/1557-4679.1168
van Houwelingen, H. C., Zwinderman, K. H., & Stijnen, T. (1993). A bivariate approach to meta-analysis. Statistics in Medicine, 12(24), 2273–2284. https://doi.org/10.1002/sim.4780122405
Jackson, D., Law, M., Stijnen, T., Viechtbauer, W., & White, I. R. (2018). A comparison of seven random-effects models for meta-analyses that estimate the summary odds ratio. Statistics in Medicine, 37(7), 1059–1085. https://doi.org/10.1002/sim.7588
Liao, J. G., & Rosen, O. (2001). Fast and stable algorithms for computing and sampling from the noncentral hypergeometric distribution. American Statistician, 55(4), 366–369. https://doi.org/10.1198/000313001753272547
Simmonds, M. C., & Higgins, J. P. T. (2016). A general framework for the use of logistic regression models in meta-analysis. Statistical Methods in Medical Research, 25(6), 2858–2877. https://doi.org/10.1177/0962280214534409
Stijnen, T., Hamza, T. H., & Ozdemir, P. (2010). Random effects meta-analysis of event outcome in the framework of the generalized linear mixed model with applications in sparse data. Statistics in Medicine, 29(29), 3046–3067. https://doi.org/10.1002/sim.4040
Turner, R. M., Omar, R. Z., Yang, M., Goldstein, H., & Thompson, S. G. (2000). A multilevel model framework for meta-analysis of clinical trials with binary outcomes. Statistics in Medicine, 19(24), 3417–3432. https://doi.org/10.1002/1097-0258(20001230)19:24<3417::aid-sim614>3.0.co;2-l
Viechtbauer, W. (2010). Conducting meta-analyses in R with the metafor package. Journal of Statistical Software, 36(3), 1–48. https://doi.org/10.18637/jss.v036.i03
rma.uni
, rma.mh
, rma.peto
, and rma.mv
for other model fitting functions.
dat.nielweise2007
, dat.nielweise2008
, dat.collins1985a
, and dat.pritz1997
for further examples of the use of the rma.glmm
function.
For rare event data, see also the rema package for a version of the conditional logistic model that uses a permutation approach for making inferences.
############################################################################
### random-effects model using rma.uni() (standard RE model analysis)
rma(measure="OR", ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg, method="ML")
#>
#> Random-Effects Model (k = 13; tau^2 estimator: ML)
#>
#> tau^2 (estimated amount of total heterogeneity): 0.3025 (SE = 0.1549)
#> tau (square root of estimated tau^2 value): 0.5500
#> I^2 (total heterogeneity / total variability): 91.23%
#> H^2 (total variability / sampling variability): 11.40
#>
#> Test for Heterogeneity:
#> Q(df = 12) = 163.1649, p-val < .0001
#>
#> Model Results:
#>
#> estimate se zval pval ci.lb ci.ub
#> -0.7420 0.1780 -4.1694 <.0001 -1.0907 -0.3932 ***
#>
#> ---
#> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#>
### random-effects models using rma.glmm() (requires 'lme4' package)
### unconditional model with fixed study effects (the default)
rma.glmm(measure="OR", ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg, model="UM.FS")
#>
#> Random-Effects Model (k = 13; tau^2 estimator: ML)
#> Model Type: Unconditional Model with Fixed Study Effects
#>
#> tau^2 (estimated amount of total heterogeneity): 0.2949
#> tau (square root of estimated tau^2 value): 0.5430
#> I^2 (total heterogeneity / total variability): 91.02%
#> H^2 (total variability / sampling variability): 11.14
#>
#> Tests for Heterogeneity:
#> Wld(df = 12) = 163.1649, p-val < .0001
#> LRT(df = 12) = 176.9544, p-val < .0001
#>
#> Model Results:
#>
#> estimate se zval pval ci.lb ci.ub
#> -0.7450 0.1756 -4.2434 <.0001 -1.0891 -0.4009 ***
#>
#> ---
#> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#>
### unconditional model with random study effects
rma.glmm(measure="OR", ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg, model="UM.RS")
#> Warning: Not possible to fit RE/ME model='UM.RS' with nAGQ > 1 with glmer(). nAGQ automatically set to 1.
#>
#> Random-Effects Model (k = 13; tau^2 estimator: ML)
#> Model Type: Unconditional Model with Random Study Effects
#>
#> tau^2 (estimated amount of total heterogeneity): 0.3198
#> tau (square root of estimated tau^2 value): 0.5655
#> I^2 (total heterogeneity / total variability): 91.67%
#> H^2 (total variability / sampling variability): 12.00
#>
#> sigma^2 (estimated amount of study level variability): 1.8616
#> sigma (square root of estimated sigma^2 value): 1.3644
#>
#> Tests for Heterogeneity:
#> Wld(df = 12) = 161.1955, p-val < .0001
#> LRT(df = 12) = 174.1317, p-val < .0001
#>
#> Model Results:
#>
#> estimate se zval pval ci.lb ci.ub
#> -0.7616 0.1815 -4.1969 <.0001 -1.1172 -0.4059 ***
#>
#> ---
#> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#>
### conditional model with approximate likelihood
rma.glmm(measure="OR", ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg, model="CM.AL")
#>
#> Random-Effects Model (k = 13; tau^2 estimator: ML)
#> Model Type: Conditional Model with Approximate Likelihood
#>
#> tau^2 (estimated amount of total heterogeneity): 0.2887
#> tau (square root of estimated tau^2 value): 0.5373
#> I^2 (total heterogeneity / total variability): 90.85%
#> H^2 (total variability / sampling variability): 10.93
#>
#> Tests for Heterogeneity:
#> Wld(df = 12) = 147.9061, p-val < .0001
#> LRT(df = 12) = 161.8210, p-val < .0001
#>
#> Model Results:
#>
#> estimate se zval pval ci.lb ci.ub
#> -0.7221 0.1744 -4.1405 <.0001 -1.0639 -0.3803 ***
#>
#> ---
#> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#>
### conditional model with exact likelihood
### note: fitting this model may take a bit of time, so be patient
rma.glmm(measure="OR", ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg, model="CM.EL")
#>
#> Random-Effects Model (k = 13; tau^2 estimator: ML)
#> Model Type: Conditional Model with Exact Likelihood
#>
#> tau^2 (estimated amount of total heterogeneity): 0.3116 (SE = 0.1612)
#> tau (square root of estimated tau^2 value): 0.5582
#> I^2 (total heterogeneity / total variability): 91.46%
#> H^2 (total variability / sampling variability): 11.72
#>
#> Tests for Heterogeneity:
#> Wld(df = 12) = 268.4283, p-val < .0001
#> LRT(df = 12) = 176.8738, p-val < .0001
#>
#> Model Results:
#>
#> estimate se zval pval ci.lb ci.ub
#> -0.7538 0.1801 -4.1860 <.0001 -1.1068 -0.4009 ***
#>
#> ---
#> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#>
############################################################################
### try some alternative measures
rma.glmm(measure="RR", ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg)
#> Warning: The use of this 'measure' is experimental - treat results with caution.
#> Warning: Model failed to converge with max|grad| = 0.00461401 (tol = 0.002, component 1)
#>
#> Random-Effects Model (k = 13; tau^2 estimator: ML)
#>
#> tau^2 (estimated amount of total heterogeneity): 0.2711
#> tau (square root of estimated tau^2 value): 0.5207
#> I^2 (total heterogeneity / total variability): 91.12%
#> H^2 (total variability / sampling variability): 11.26
#>
#> Tests for Heterogeneity:
#> Wld(df = 12) = 152.2330, p-val < .0001
#> LRT(df = 12) = 166.3203, p-val < .0001
#>
#> Model Results:
#>
#> estimate se zval pval ci.lb ci.ub
#> -0.7139 0.1691 -4.2224 <.0001 -1.0453 -0.3825 ***
#>
#> ---
#> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#>
rma.glmm(measure="RD", ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg)
#> Warning: The use of this 'measure' is experimental - treat results with caution.
#> Warning: variance-covariance matrix computed from finite-difference Hessian is
#> not positive definite or contains NA values: falling back to var-cov estimated from RX
#>
#> Random-Effects Model (k = 13; tau^2 estimator: ML)
#>
#> tau^2 (estimated amount of total heterogeneity): 0.0013
#> tau (square root of estimated tau^2 value): 0.0355
#> I^2 (total heterogeneity / total variability): 99.93%
#> H^2 (total variability / sampling variability): 1482.28
#>
#> Tests for Heterogeneity:
#> Wld(df = 12) = 276.4737, p-val < .0001
#> LRT(df = 12) = 294.2395, p-val < .0001
#>
#> Model Results:
#>
#> estimate se zval pval ci.lb ci.ub
#> -0.0249 0.0102 -2.4401 0.0147 -0.0450 -0.0049 *
#>
#> ---
#> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#>
############################################################################
### meta-analysis of proportions
dat <- dat.debruin2009
### binomial-normal model (with logit link) = mixed-effects logistic model
res <- rma.glmm(measure="PLO", xi=xi, ni=ni, data=dat)
predict(res, transf=transf.ilogit)
#>
#> pred ci.lb ci.ub pi.lb pi.ub
#> 0.4721 0.3822 0.5638 0.2021 0.7594
#>
### binomial-normal model with measure="PLN" (uses a log link)
res <- rma.glmm(measure="PLN", xi=xi, ni=ni, data=dat)
#> Warning: The use of this 'measure' is experimental - treat results with caution.
#> Warning: variance-covariance matrix computed from finite-difference Hessian is
#> not positive definite or contains NA values: falling back to var-cov estimated from RX
predict(res, transf=exp)
#>
#> pred ci.lb ci.ub pi.lb pi.ub
#> 0.4606 0.3806 0.5575 0.2381 0.8911
#>
### binomial-normal model with measure="PR" (uses an identity link)
res <- rma.glmm(measure="PR", xi=xi, ni=ni, data=dat)
#> Warning: The use of this 'measure' is experimental - treat results with caution.
predict(res)
#>
#> pred se ci.lb ci.ub pi.lb pi.ub
#> 0.4741 0.0427 0.3904 0.5578 0.1880 0.7602
#>
### binomial-normal model (with probit link) = mixed-effects probit model
res <- rma.glmm(measure="PLO", xi=xi, ni=ni, data=dat, link="probit")
predict(res, transf=pnorm)
#>
#> pred ci.lb ci.ub pi.lb pi.ub
#> 0.4725 0.3839 0.5625 0.1996 0.7597
#>
### further link functions that one could consider here
res <- rma.glmm(measure="PLO", xi=xi, ni=ni, data=dat, link="cauchit")
predict(res, transf=pcauchy)
#>
#> pred ci.lb ci.ub pi.lb pi.ub
#> 0.4688 0.3706 0.5731 0.2167 0.7559
#>
res <- rma.glmm(measure="PLO", xi=xi, ni=ni, data=dat, link="cloglog")
predict(res, transf=\(x) 1-exp(-exp(x)))
#>
#> pred ci.lb ci.ub pi.lb pi.ub
#> 0.4625 0.3775 0.5566 0.2174 0.7924
#>
############################################################################