rma.mv(yi, V, W, mods, random, struct="CS", intercept=TRUE,
data, slab, subset, method="REML", tdist=FALSE,
level=95, digits=4, btt, R, Rscale="cor",
sigma2, tau2, rho, sparse=FALSE, verbose=FALSE, control)
~ inner | outer
formula in the random
argument. Either "CS"
for compound symmetry, "HCS"
for heteroscedastic compound symmetry, "UN"
TRUE
)."ML"
) or via restricted maximum-likelihood ("REML"
) estimation. Default is "REML"
.FALSE
, the default) or the t-distribution (when TRUE
). See random
argument. See R
argument should be scaled. See random
argument) to fix the corresponding struct="CS"
or struct="AR"
) or vector (for struct="HCS"
, struct="UN"
, or struct="HAR"
) to fix the amount of (residual) heterogeneity in the levels of the inner struct="CS"
, struct="HCS"
, struct="AR"
, or struct="HAR"
) or vector (for struct="UN"
) to fix the correlation between levels of the inner factor corresponding to FALSE
). Can also be an integer. Values > 1 generate more verbose output. See c("rma.mv","rma")
. The object is a list containing the following components:print.rma.mv
function. If fit statistics should also be given, use summary.rma
(or use the fitstats.rma
function to extract them).
Predicted/fitted values can be obtained with predict.rma
and fitted.rma
.
The residuals.rma
and rstandard.rma.mv
functions extract raw and standardized residuals.
For random/mixed-effects models, the profile.rma.mv
function can be used to obtain a plot of the (restricted) log-likelihood as a function of a specific variance component or correlation parameter of the model.
Other extractor functions include coef.rma
, vcov.rma
, logLik.rma
, deviance.rma
, AIC.rma
, BIC.rma
, hatvalues.rma.mv
, and weights.rma.mv
.yi
argument and the corresponding sampling variances via the V
argument. In case the sampling errors are correlated, then one can specify the entire variance-covariance matrix of the sampling errors via the V
argument.
The escalc
function can be used to compute a wide variety of effect size and outcome measures (and the corresponding sampling variances) based on summary statistics. Equations for computing the covariance between sampling errors for a variety of different effect size or outcome measures can be found, for example, in Gleser and Olkin (2009). For raw and Fisher's r-to-z transformed correlations, one can find suitable equations, for example, in Steiger (1980).
Specifying Fixed Effects
With rma.mv(yi, V)
, a fixed-effects model is fitted to the data (note: arguments struct
, sigma2
, tau2
, rho
, R
, and Rscale
are not relevant then and are ignored). The model is then simply given by V
argument, then $\mathbf{V}$ is assumed to be diagonal).
One or more moderators can be included in the 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., $\mathbf{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 the three moderator variables). The intercept is added to the model matrix by default unless intercept=FALSE
.
Alternatively, one can use the 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 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 term is controlled by the specified formula (e.g., mods = ~ mod1 + mod2 + mod3 - 1
would lead to the removal of the intercept term). One can also directly specify moderators via the yi
argument (e.g., rma.mv(yi ~ mod1 + mod2 + mod3, V)
). In that case, the mods
argument is ignored and the inclusion/exclusion of the intercept term again is controlled by the specified formula.
With moderators included, the model is then given by $\mathbf{y} \sim N(\mathbf{X} \mathbf{\beta}, \mathbf{V})$, where $\mathbf{X}$ denotes the model matrix containing the moderator values (and possibly the intercept) and $\mathbf{\beta}$ is a column vector containing the corresponding model coefficients. The model coefficients (i.e., $\mathbf{\beta}$) are then estimated with W
argument, one can also specify user-defined weights (or a weight matrix).
Specifying Random Effects
One can fit random/mixed-effects models to the data by specifying the desired random effects structure via the random
argument. The random
argument is either a single one-sided formula or a list of one-sided formulas. A formula specified via this argument can be of the form random = ~ 1 | id
. Such a formula adds random effects corresponding to the grouping variable/factor id
to the model. Effects or outcomes with the same value/level of the id
variable/factor receive the same random effect, while effects or outcomes with different values/levels of the id
variable/factor are assumed to be independent. The variance component corresponding to such a formula is denoted by random = list(~ 1 | id1, ~ 1 | id2)
), with variance components dat.konstantopoulos2011
for an example analysis with multilevel meta-analytic data.
In addition or alternatively to specifying one or multiple ~ 1 | id
terms, the random
argument can also contain one (and only one!) formula of the form ~ inner | outer
. Effects or outcomes with different values/levels of the outer
grouping variable/factor are assumed to be independent, while effects or outcomes with the same value/level of the outer
grouping variable/factor receive correlated random effects corresponding to the levels of the inner
grouping variable/factor. The struct
argument is used to specify the variance structure corresponding to the inner
variable/factor. With struct="CS"
, a compound symmetric structure is assumed (i.e., a single variance component inner
variable/factor and a single correlation coefficient $\rho$ for the correlation between different values/levels). With struct="HCS"
, a heteroscedastic compound symmetric structure is assumed (with variance components inner
variable/factor and a single correlation coefficient $\rho$ for the correlation between different values/levels). With struct="UN"
, an unstructured variance-covariance matrix is assumed (with variance components inner
variable/factor and correlation coefficients inner
variable/factor). inner
grouping variable/factor with four levels, the three structures correspond to variance-covariance matrices of the form:}
outer
factor corresponding to a study id variable and the inner
factor corresponding to a variable indicating the treatment type or study arm, such a random effects component could be used to estimate how strongly different true effects or outcomes within the same study are correlated and/or whether the amount of heterogeneity differs across different treatment types/arms. Network meta-analyses (also called mixed treatment comparison meta-analyses) will typically require such a random effects component (e.g., Salanti et al., 2008). The meta-analytic bivariate model (e.g., van Houwelingen, Arends, & Stijnen, 2002) can also be fitted in this manner (see the examples below). The inner
factor could also correspond to a variable indicating the outcome variable, which allows for fitting multivariate models when there are multiple correlated effects per study (e.g., Berkey et al., 1998; Kalaian & Raudenbush, 1996).
See dat.berkey1998
for an example of a multivariate meta-analysis with multiple outcomes. See dat.hasselblad1998
for an example of a network meta-analysis.
For meta-analyses of studies reporting outcomes at multiple time points, it may also be reasonable to assume that the true effects are correlated according to an autoregressive structure over time (Ishak et al., 2007; Trikalinos & Olkin, 2012). For this purpose, one can also choose struct="AR"
, corresponding to a structure with a single variance component inner
variable/factor should then reflect the various time points, with increasing values reflecting later time points. Finally, struct="HAR"
allows for fitting a heteroscedastic AR(1) structure (with variance components inner
grouping variable/factor with four levels (i.e., time points), these structures correspond to variance-covariance matrices of the form:}
dat.fine1993
and dat.ishak2007
for examples involving such structures.
When the random
argument contains a formula of the form ~ 1 | id
, one can use the (optional) argument R
to specify a corresponding known correlation matrix of the random effects (i.e., R = list(id = Cor)
, where Cor
is the correlation matrix). In that case, effects or outcomes with the same value/level of the id
variable/factor receive the same random effect, while effects or outcomes with different values/levels of the id
variable/factor receive random effects that are correlated as specified in the corresponding correlation matrix given via the R
argument. The column/row names of the correlation matrix given via the R
argument must therefore contain all of the values/levels of the id
variable/factor. When the random
argument contains multiple formulas of the form ~ 1 | id
, one can specify known correlation matrices for none, some, or all of those terms (e.g., with random = list(~ 1 | id1, ~ 1 | id2)
, one could specify R = list(id1 = Cor1)
or R = list(id1 = Cor1, id2 = Cor2)
, where Cor1
and Cor2
are the correlation matrices corresponding to the grouping variables/factors id1
and id2
, respectively).
Random effects with a known (or at least approximately known) correlation structure are useful in a variety of contexts. For example, such components can be used to account for the correlations induced by a shared phylogenetic history among organisms (e.g., plants, fungi, animals). In that case, ~ 1 | species
is used to specify the species and argument R
is used to specify the phylogenetic correlation matrix of the species studied in the meta-analysis. The corresponding variance component then indicates how much variance/heterogeneity is attributable to the specified phylogeny. See Nakagawa and Santos (2012) for more details. As another example, in a genetic meta-analysis studying disease association for several single nucleotide polymorphisms (SNPs), linkage disequilibrium (LD) among the SNPs can induce an approximately known degree of correlation among the effects. In that case, ~ 1 | snp
could be used to specify the SNP and R
the corresponding LD correlation map for the SNPs included in the meta-analysis.
The Rscale
argument controls how matrices specified via the R
argument are scaled. With Rscale="none"
(or Rscale=0
or Rscale=FALSE
), no scaling is used. With Rscale="cor"
(or Rscale=1
or Rscale=TRUE
), the cov2cor
function is used to ensure that the matrices are correlation matrices (assuming they were covariance matrices to begin with). With Rscale="cor0"
(or Rscale=2
), first cov2cor
is used and then the elements of each correlation matrix are scaled with $(R - min(R)) / (1 - min(R))$ (this ensures that a correlation of zero in a phylogenetic correlation matrix corresponds to the split at the root node of the tree comprising the species that are actually analyzed). Finally, Rscale="cov0"
(or Rscale=3
) only rescales with $(R - min(R))$ (which ensures that a phylogenetic covariance matrix is rooted at the lowest split).
Together with the variance-covariance matrix of the sampling errors (i.e., $\mathbf{V}$), the random effects structure of the model implies a marginal variance-covariance matrix of the observed outcomes. Once estimates of the variance components (i.e., W
argument, one can again specify user-defined weights (or a weight matrix).
Fixing Variance Components and/or Correlations
Arguments sigma2
, tau2
, and rho
can be used to fix particular variance components and/or correlations at a given value. This is useful for sensitivity analyses (e.g., for plotting the regular/restricted log-likelihood as a function of a particular variance component or correlation) or for imposing a desired variance-covariance structure on the data.
For example, if random = list(~ 1 | id1, ~ 1 | id2)
, then sigma2
must be of length 2 (corresponding to NA
means that the component will be estimated by the function.
Argument tau2
is only relevant when the random
argument contains an ~ inner | outer
formula. In that case, if the tau2
argument is used, it must be either of length 1 (for struct="CS"
and struct="AR"
) or of the same length as the number of levels of the inner factor (for struct="HCS"
, struct="UN"
, or struct="HAR"
). A numeric value in the tau2
argument then fixes the corresponding variance component to that value, while NA
means that the component will be estimated. Similarly, if argument rho
is used, it must be either of length 1 (for struct="CS"
, struct="HCS"
, struct="AR"
, or struct="HAR"
) or of length $lvls(lvls-1)/2$ (for struct="UN"
), where $lvls$ denotes the number of levels of the inner factor. Again, a numeric value fixes the corresponding correlation, while NA
means that the correlation will be estimated. For example, with struct="CS"
and rho=0
, the variance-covariance matrix of the inner factor will be diagonal with struct="UN"
, the values specified under rho
should be given in column-wise order (e.g., for an inner
grouping variable/factor with four levels, the order would be btt
argument. For example, with btt=c(3,4)
, only the third and fourth coefficient from the model would be included in the test (if an intercept is included in the model, then it corresponds to the first coefficient in the model).
Categorical Moderators
Categorical moderator variables can be included in the model via the mods
argument in the same way that appropriately (dummy) coded categorical independent 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 let Rhandle the coding automatically.
Tests and Confidence Intervals
By default, the test statistics of the individual coefficients in the model (and the corresponding confidence intervals) are based on the normal distribution, while the omnibus test is based on a chi-square distribution with $m$ degrees of freedom ($m$ being the number of coefficients tested). As an alternative, one can set tdist=TRUE
, which slightly mimics the Knapp and Hartung (2003) method by using a t-distribution with $k-p$ degrees of freedom for tests of individual coefficients and confidence intervals and an F-distribution with $m$ and $k-p$ degrees of freedom ($p$ being the total number of model coefficients including the intercept if it is present) for the omnibus test statistic.
Test for (Residual) Heterogeneity
A test for (residual) heterogeneity is automatically carried out by the function. Without moderators in the model, this test is the generalized/weighted least squares extension of Cochran's $Q$-test, which tests whether the variability in the observed effect sizes or outcomes is larger than one would expect based on sampling variability (and the given covariances among the sampling errors) alone. A significant test suggests that the true effects or outcomes are heterogeneous. When moderators are included in the model, this is the $Q_E$-test for residual heterogeneity, which tests whether the variability in the observed effect sizes or outcomes that is not accounted for by the moderators included in the model is larger than one would expect based on sampling variability (and the given covariances among the sampling errors) alone.rma.uni
, rma.mh
, rma.peto
, and rma.glmm
for other model fitting functions.
dat.konstantopoulos2011
, dat.hasselblad1998
, dat.begg1989
, dat.berkey1998
, dat.fine1993
, and dat.ishak2007
for further examples of the use of the rma.mv
function.### load BCG vaccine data
data(dat.bcg)
### calculate log odds ratios and corresponding sampling variances
dat <- escalc(measure="OR", ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg)
### random-effects model using rma.uni()
rma(yi, vi, data=dat)
### random-effects model using rma.mv()
rma.mv(yi, vi, random = ~ 1 | trial, data=dat)
### another way of fitting the same model with rma.mv()
dat$const <- 1
rma.mv(yi, vi, random = ~ const | trial, rho=0, data=dat)
### change data into long format
dat.long <- to.long(measure="OR", ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg)
### set levels of group variable ("exp" = experimental/vaccinated; "con" = control/non-vaccinated)
levels(dat.long$group) <- c("exp", "con")
### set "con" to reference level
dat.long$group <- relevel(dat.long$group, ref="con")
### calculate log odds and corresponding sampling variances
dat.long <- escalc(measure="PLO", xi=out1, mi=out2, data=dat.long)
### bivariate random-effects model using rma.mv()
res <- rma.mv(yi, vi, mods = ~ group, random = ~ group | study, struct="UN", data=dat.long)
res
Run the code above in your browser using DataLab