In many meta-analyses, multiple effect size estimates or outcomes can be extracted from the same study. Ideally, such structures should be analyzed using an appropriate multilevel/multivariate model as can be fitted with the
rma.mv() function. However, there may occasionally be reasons for aggregating multiple effect sizes or outcomes belonging to the same study (or to the same level of some other clustering variable) into a single combined effect size or outcome. I've added an
aggregate() function (or to be precise, an
aggregate.escalc() method function) to the package for this purpose. You can read the documentation for this function (and see some examples illustrating its use) here.
I've added the possibility to fit so-called 'selection models' with the metafor package. In case you are not familiar with such models: Selection models attempt to model and therefore account for the process by which the studies included in a meta-analysis may have been influenced by some form of publication bias. In other words, some kind of selection process may have happened that made it more likely that certain types of studies will be published and hence are more easily found and therefore can be included in a meta-analysis (yes, one should always search the 'gray literature' for unpublished studies to be included in a meta-analysis, but uncovering those studies lingering in some file drawers out there can be exceedingly difficult).
The classical example of such a selection process is the fact that statistically significant findings are more likely to be submitted/accepted for publication. As a result, the findings from a meta-analysis can be biased, sometimes quite severely (because especially the smaller studies can only achieve statistical significance if they just happen to have obtained a large effect). Selection models attempt to correct for this (or can be used for sensitivity analyses by varying the degree of severity of such a selection process).
To make this possible directly within the metafor package, I've added the selmodel() function, which provides a wide variety of selection model types (there are lots of proposals out there for how to model the selection process), including the 'beta selection model' by Citkowicz and Vevea (2017), a bunch of selection models suggested by Preston et al. (2004), an extension thereof that I call the 'negative exponential power selection model' (sounds fancy, huh?), and so-called 'step function models' as described by Iyengar and Greenhouse (1988), Hedges (1992), Vevea and Hedges (1995), and Vevea and Woods (2005). I wrote the code so that it would be relatively easy to add further selection models to the function in case further models end up being suggested in the statistical literature.
The R code for two more books has been added to the GitHub repo: The Handbook of Research Synthesis and Meta-Analysis by Cooper et al. (2019) and Publication Bias in Meta-Analysis by Rothstein et al. (2005).
I've started a repo on GitHub to provide R code for various books on meta-analysis. It now contains Introduction to Meta-Analysis by Borenstein et al. (2009) and Practical Meta-Analysis by Lipsey and Wilson (2001). More to be added. The items in the repo will also be listed under the Analysis Examples section.
And another entry to the 'Tips and Notes' section, this time discussing how weighting works in more complex models, such as those that can be fitted with the
rma.mv() function. You can read the tutorial here.
I've added an entry to the 'Tips and Notes' section, discussing how to compute 'adjusted effects' based on meta-regression models. You can read the tutorial here.
I've added an entry to the 'Tips and Notes' section, illustrating how to model non-linear associations in meta-regression using polynomial and restricted cubic spline models. You can read the little tutorial here.
Based on a question I received, I wrote up a little tutorial on how to interpret the coefficients in meta-regression models when using the log risk ratio as the outcome measure. When exponentiating coefficients, this leads to values that represent ratios of risk ratios, which may not be entirely obvious. You can read the tutorial here.
As a follow-up to yesterday's note, it is maybe worth mentioning that I also added two functions that are especially useful for those conducting network meta-analyses with the metafor package. With the
to.wide() function, one can rearrange a dataset that is in an arm-based 'long' format to a contrast-based 'wide' format. Two examples illustrating the use of this function can be found under help(to.wide) (the link takes you to the corresponding help file, which is nicely formatted and shows the output of the examples). Once the dataset is in such a wide format, an important next step is the construction of variables that reflect which two groups are being compared with each other in each row (through +1, 0, -1 coding). Such a contrast matrix can be easily created with the
contrmat() function. See help(contrmat) for the help file and two examples illustrating its use. The analysis of these two datasets (using arm- and contrast-based models) are illustrated under help(dat.hasselblad1998) and help(dat.hasselblad1998).
Just submitted a new version (2.4-0) to CRAN. This update was prompted by the upcoming change in R where the new default will be
stringsAsFactors=FALSE (at long last!). As a result, some tests were failing on R-devel, so these needed fixing. Along the way, I made various minor internal updates and added some convenience functionality to several functions. The full changelog can be found here.