Changes in Version 1.9-2 (2013-10-07)
=====================================
o added function rma.mv() to fit multivariate/multilevel meta-analytic
models via appropriate linear (mixed-effects) models; this function
allows for modeling of non-independent sampling errors and/or true
effects and can be used for network meta-analyses, meta-analyses
accounting for phylogenetic relatedness, and other complicated
meta-analytic data structures
o added the AICc to the information criteria computed by the various
model fitting functions
o if the value of tau2 is fixed by the user via the corresponding
argument in rma.uni(), then tau2 is no longer counted as an additional
parameter for the computation of the information criteria (i.e., AIC,
BIC, and AICc)
o rma.uni(), rma.glmm(), and rma.mv() now use a more stringent check
whether the model matrix is of full rank
o added profile() method functions for objects of class 'rma.uni' and
'rma.mv' (can be used to obtain a plot of the profiled log-likelihood
as a function of a specific variance component or correlation parameter
of the model)
o predict.rma() function now has an 'intercept' argument that allows the
user to decide whether the intercept term should be included when
calculating the predicted values (rare that this should be changed from
the default)
o for rma.uni(), rma.glmm(), and rma.mv(), the 'control' argument can now
also accept an integer value; values > 1 generate more verbose output
about the progress inside of the function
o rma.glmm() has been updated to work with lme4 1.0.x for fitting various
models; as a result, model="UM.RS" can only use nAGQ=1 at the moment
(hopefully this will change in the future)
o the 'control' argument of rma.glmm() can now be used to pass all
desired control arguments to the various functions and optimizers used
for the model fitting (admittedly the use of lists within this argument
is a bit unwieldy, but much more flexible)
o rma.mh() and rma.peto() arguments also now have a 'verbose' argument
(not really needed, but added for sake of consistency across functions)
o a bit of code reorganization (should be user transparent)
o vignettes ("metafor" and "metafor_diagram") are now just 'other files'
in the doc directory (as these were not true vignettes to begin with)
o some improvements to the documentation (as always)
Changes in Version 1.9-1 (2013-07-20)
=====================================
o rma.mh() now also implements the Mantel-Haenszel method for incidence
rate differences (measure="IRD")
o when analyzing incidence rate ratios (measure="IRR") with the rma.mh()
function, the Mantel-Haenszel test for person-time data is now also
provided
o rma.mh() has a new argument 'correct' (default is TRUE) to indicate
whether the continuity correction should be applied when computing the
(Cochran-)Mantel-Haenszel test statistic
o renamed elements 'CMH' and 'CMHp' (for the Cochran-Mantel-Haenszel test
statistic and corresponding p-value) to 'MH' and 'MHp'
o added function baujat() to create Baujat plots
o added a new dataset (dat.pignon2000) to illustrate the use of the
baujat() function
o added function to.table() to convert data from vector format into the
corresponding table format
o added function to.long() to convert data from vector format into the
corresponding long format
o rma.glmm() now even runs when k=1 (yielding trivial results)
o for models with an intercept and moderators, rma.glmm() now internally
rescales (non-dummy) variables to z-scores during the model fitting
(this improves the stability of the model fitting, especially when
model="CM.EL"); results are given after back-scaling, so this should
be transparent to the user
o in rma.glmm(), default number of quadrature points (nAGQ) is now 7
(setting this to 100 was a bit overkill)
o a few more error checks here and there for misspecified arguments
o some improvements to the documentation
Changes in Version 1.9-0 (2013-06-21)
=====================================
o vignette renamed to 'metafor' so vignette("metafor") works now
o added a diagram to the documentation, showing the various functions in
the metafor package (and how they relate to each other); can be loaded
with vignette("metafor_diagram")
o anova.rma.uni() function can now also be used to test (sub)sets of
model coefficients with a Wald-type test when a single model is passed
to the function
o the pseudo R^2 statistic is now automatically calculated by the
rma.uni() function and supplied in the output (only for mixed-effects
models and when the model includes an intercept, so that the random-
effects model is clearly nested within the mixed-effects model)
o component 'VAF' is now called 'R2' in anova.rma.uni() function
o added function hc() that carries out a random-effects model analysis
using the method by Henmi and Copas (2010); thanks to Michael Dewey for
the suggestion and providing the code
o added new dataset (dat.lee2004), which was used in the article by Henmi
and Copas (2010) to illustrate their method
o fixed missing x-axis labels in the forest() functions
o rma.glmm() now computes Hessian matrices via the 'numDeriv' package
when model="CM.EL" and measure="OR" (i.e., for the conditional logistic
model with exact likelihood); so 'numDeriv' is now a suggested package
and is loaded within rma.glmm() when required
o trimfill.rma.uni() now also implements the "Q0" estimator (although the
"L0" and "R0" estimators are generally to be preferred)
o trimfill.rma.uni() now also calculates the SE of the estimated number
of missing studies and, for estimator "R0", provides a formal test of
the null hypothesis that the number of missing studies on a given side
is zero
o added new dataset (dat.bangertdrowns2004)
o the 'level' argument in various functions now either accepts a value
representing a percentage or a proportion (values greater than 1 are
assumed to be a percentage)
o summary.escalc() now computes confidence intervals correctly when using
the 'transf' argument
o computation of Cochran-Mantel-Haenszel statistic in rma.mh() changed
slightly to avoid integer overflow with very big counts
o some internal improvements with respect to object attributes that were
getting discarded when subsetting
o some general code cleanup
o some improvements to the documentation
Changes in Version 1.8-0 (2013-04-11)
=====================================
o added additional clarifications about the change score outcome measures
("MC", "SMCC", and "SMCR") to the help file for the escalc() function
and changed the code so that "SMCR" no longer expects argument 'sd2i'
to be specified (which is not needed anyways) (thanks to Markus Kösters
for bringing this to my attention)
o sampling variance for the biserial correlation coefficient ("RBIS") is
now calculated in a slightly more accurate way
o llplot() now properly scales the log-likelihoods
o argument 'which' in the plot.infl.rma.uni() function has been replaced
with argument 'plotinf' which can now also be set to FALSE to suppress
plotting of the various case diagnostics altogether
o labeling of the axes in labbe() plots is now correct for odds ratios
(and transformations thereof)
o added two new datasets (dat.nielweise2007 and dat.nielweise2008) to
illustrate some methods/models from the rma.glmm() function
o added a new dataset (dat.yusuf1985) to illustrate the use of rma.peto()
o test for heterogeneity is now conducted by the rma.peto() function
exactly as described by Yusuf et al. (1985)
o in rma.glmm(), default number of quadrature points (nAGQ) is now 100
(which is quite a bit slower, but should provide more than sufficient
accuracy in most cases)
o the standard error of the HS and DL estimators of tau^2 are now
correctly computed when tau^2 is prespecified by the user in the rma()
function; in addition, the standard error of the SJ estimator is also
now provided when tau^2 is prespecified
o rma.uni() and rma.glmm() now use a better method to check whether the
model matrix is of full rank
o I^2 and H^2 statistics are now also calculated for mixed-effects models
by the rma.uni() and rma.glmm() function; confint.rma.uni() provides
the corresponding confidence intervals for rma.uni() models
o various print() methods now have a new argument called 'signif.stars',
which defaults to getOption("show.signif.stars") (which by default is
TRUE) to determine whether the infamous 'significance stars' should be
printed
o slight changes in wording in the output produced by the print.rma.uni()
and print.rma.glmm() functions
o some improvements to the documentation
Changes in Version 1.7-0 (2013-02-05)
=====================================
o added rma.glmm() function for fitting of appropriate generalized linear
(mixed-effects) models when analyzing odds ratios, incidence rate
ratios, proportions, or rates; the function makes use of the 'lme4' and
'BiasedUrn' packages; these are now suggested packages and loaded
within rma.glmm() only when required (this makes for faster loading of
the 'metafor' package)
o addded several methods functions for objects of class 'rma.glmm' (not
all methods yet implemented; to be completed in the future)
o rma.uni() now allows the user to specify a formula for the 'yi'
argument, so instead of rma(yi, vi, mods=~mod1+mod2), one can specify
the same model with rma(yi~mod1+mod2, vi)
o rma.uni() now has a 'weights' argument to specify the inverse of the
sampling variances (instead of using the 'vi' or 'sei' arguments); for
now, this is all this argument should be used for (in the future, this
argument may potentially be used to allow the user to define
alternative weights)
o rma.uni() now checks whether the model matrix is not of full rank and
issues an error accordingly (instead of the rather cryptic error that
was issued before)
o rma.uni() now has a 'verbose' argument
o coef.rma() now returns only the model coefficients (this change was
necessary to make the package compatible with the 'multcomp' package;
see help(rma) for an example); use coef(summary()) to obtain the full
table of results
o the escalc() function now does some more extensive error checking for
misspecified data and some unusual cases
o 'append' argument is now TRUE by default in the escalc() function
o objects generated by the escalc() function now have their own class
o added print() and summary() methods for objects of class 'escalc'
o added `[` and cbind() methods for objects of class 'escalc'
o added a few additional arguments to the escalc() function (i.e., slab,
subset, var.names, replace, digits)
o added 'drop00' argument to the escalc(), rma.uni(), rma.mh(), and
rma.peto() functions
o added "MN", "MC", "SMCC", and "SMCR" measures to the escalc() and
rma.uni() functions for the raw mean, the raw mean change, and the
standardized mean change (with change score or raw score
standardization) as possible outcome measures
o the "IRFT" measure in the escalc() and rma.uni() functions is now
computed with 1/2*(sqrt(xi/ti) + sqrt(xi/ti+1/ti)) which is more
consistent with the definition of the Freeman-Tukey transformation for
proportions
o added "RTET" measure to the escalc() and rma.uni() functions to compute
the tetrachoric correlation coefficient based on 2x2 table data (the
'polycor' package is therefore now a suggested package, which is loaded
within escalc() only when required)
o added "RPB" and "RBIS" measures to the escalc() and rma.uni() functions
to compute the point-biserial and biserial correlation coefficient
based on means and standard deviations
o added "PBIT" and "OR2D" measures to the escalc() and rma.uni()
functions to compute the standardized mean difference based on 2x2
table data
o added the "D2OR" measure to the escalc() and rma.uni() functions to
compute the log odds ratio based on the standardized mean difference
o added "SMDH" measure to the escalc() and rma.uni() functions to compute
the standardized mean difference without assuming equal population
variances
o added "ARAW", "AHW", and "ABT" measures to the escalc() and rma.uni()
functions for the raw value of Cronbach's alpha, the transformation
suggested by Hakstian & Whalen (1976), and the transformation suggested
by Bonett (2002) for the meta-analysis of reliability coefficients (see
help(escalc) for details)
o corrected a small mistake in the equation used to compute the sampling
variance of the phi coefficient (measure="PHI") in the escalc()
function
o the permutest.rma.uni() function now uses an algorithm to find only the
unique permutations of the model matrix (which may be much smaller
than the total number of permutations), making the exact permutation
test feasible in a larger set of circumstances (thanks to John Hodgson
for making me aware of this issue and to Hans-Jörg Viechtbauer for
coming up with a recursive algorithm for finding the unique
permutations)
o credibility interval in forest.rma() is now indicated with a dotted
(instead of a dashed) line; ends of the interval are now marked with
vertical bars
o completely rewrote the funnel.rma() function which now supports many
more options for the values to put on the y-axis; trimfill.rma.uni()
function was adapted accordingly
o removed the 'ni' argument from the regtest.rma() function; instead,
sample sizes can now be explicitly specified via the 'ni' argument when
using the rma.uni() function (i.e., when measure="GEN"); the escalc()
function also now adds information on the 'ni' values to the resulting
data frame (as an attribute of the 'yi' variable), so, if possible,
this information is passed on to regtest.rma()
o added switch so that regtest() can also provide the full results from
the fitted model (thanks to Michael Dewey for the suggestion)
o weights.rma.mh() now shows the weights in % as intended (thanks to
Gavin Stewart for pointing out this error)
o more flexible handling of the 'digits' argument in the various forest
functions
o forest functions now use pretty() by default to set the x-axis tick
locations ('alim' and 'at' arguments can still be used for complete
control)
o studies that are considered to be 'influential' are now marked with an
asterisk when printing the results returned by the influence.rma.uni()
function (see the documentation of this function for details on how
such studies are identified)
o added additional extractor functions for some of the influence measures
(i.e., cooks.distance, dfbetas); unfortunately, the 'covratio' and
'dffits' functions in the 'stats' package are not generic; so, to avoid
masking, there are currently no extractor functions for these measures
o better handling of missing values in some unusual situations
o corrected small bug in fsn() that would not allow the user to specify
the standard errors instead of the sampling variances (thanks to Bernd
Weiss for pointing this out)
o plot.infl.rma.uni() function now allows the user to specify which plots
to draw (and the layout) and adds the option to show study labels on
the x-axis
o added proper print() method for objects generated by the
confint.rma.uni(), confint.mh(), and confint.peto() functions
o when 'transf' or 'atransf' argument was a monotonically *decreasing*
function, then confidence, prediction, and credibility interval bounds
were in reversed order; various functions now check for this and order
the bounds correctly
o trimfill.rma.uni() now only prints information about the number of
imputed studies when actually printing the model object
o qqnorm.rma.uni(), qqnorm.rma.mh(), and qqnorm.rma.peto() functions now
have a new argument called 'label', which allows for labeling of
points; the functions also now return (invisibly) the x and y
coordinates of the points drawn
o rma.mh() with measure="RD" now computes the standard error of the
estimated risk difference based on Sato, Greenland, & Robins (1989),
which provides a consistent estimate under both large-stratum and
sparse-data limiting models
o the restricted maximum likelihood (REML) is now calculated using the
full likelihood equation (without leaving out additive constants)
o the model deviance is now calculated as -2 times the difference between
the model log-likelihood and the log-likelihood under the saturated
model (this is a more appropriate definition of the deviance than just
taking -2 times the model log-likelihood)
o naming scheme of illustrative datasets bundled with the package has
been changed; now datasets are called ; therefore, the
datasets are now called (old name -> new name):
* dat.bcg -> dat.colditz1994
* dat.warfarin -> dat.hart1999
* dat.los -> dat.normand1999
* dat.co2 -> dat.curtis1998
* dat.empint -> dat.mcdaniel1994
o but dat.bcg has been kept as an alias for dat.colditz1994, as it has
been referenced under that name in some publications
o added new dataset (dat.pritz1997) to illustrate the meta-analysis of
proportions (raw values and transformations thereof)
o added new dataset (dat.bonett2010) to illustrate the meta-analysis of
Cronbach's alpha values (raw values and transformations thereof)
o added new datasets (dat.hackshaw1998, dat.raudenbush1985)
o (approximate) standard error of the tau^2 estimate is now computed and
shown for most of the (residual) heterogeneity estimators
o added nobs() and df.residual() methods for objects of class 'rma'
o metafor.news() is now simply a wrapper for news(package="metafor")
o the package code is now byte-compiled, which yields some modest
increases in execution speed
o some general code cleanup
o the 'metafor' package no longer depends on the 'nlme' package
o some improvements to the documentation
Changes in Version 1.6-0 (2011-04-12)
=====================================
o trimfill.rma.uni() now returns a proper object even when the number of
missing studies is estimated to be zero
o added the (log transformed) ratio of means as a possible outcome
measure to the escalc() and rma.uni() functions (measure="ROM")
o added new dataset (dat.co2) to illustrate the use of the ratio of means
outcome measure
o some additional error checking in the various forest functions
(especially when using the 'ilab' argument)
o in labbe.rma(), the solid and dashed lines are now drawn behind (and
not on top of) the points
o slight change to transf.ipft.hm() so that missing values in 'targs$ni'
are ignored
o some improvements to the documentation
Changes in Version 1.5-0 (2010-12-15)
=====================================
o the 'metafor' package now has its own project website at:
http://www.metafor-project.org/
o added labbe() function to create L’Abbe plots
o the forest.default() and addpoly.default() functions now allow the user
to directly specify the lower and upper confidence interval bounds
(this can be useful when the CI bounds have been calculated with other
methods/functions)
o added the incidence rate for a single group and for two groups (and
transformations thereof) as possible outcome measures to the escalc()
and rma.uni() functions (measure="IRR", "IRD", "IRSD", "IR", "IRLN",
"IRS", and "IRFT")
o added the incidence rate ratio as a possible outcome measure to the
rma.mh() function
o added transformation functions related to incidence rates
o added the Freeman-Tukey double arcsine transformation and its inverse
to the transformation functions
o added some additional error checking for out-of-range p-values in the
permutest.rma.uni() function
o added some additional checking for out-of-range values in several
transformation functions
o added confint() methods for 'rma.mh' and 'rma.peto' objects (only for
completeness sake; print already provides CIs)
o added new datasets (dat.warfarin, dat.los, dat.empint)
o some improvements to the documentation
Changes in Version 1.4-0 (2010-07-30)
=====================================
o a papar about the package has now been published in the Journal of
Statistical Software (http://www.jstatsoft.org/v36/i03/)
o added citation info; see: citation("metafor")
o the 'metafor' package now depends on the 'nlme' package
o added extractor functions for the AIC, BIC, and deviance
o some updates to the documentation
Changes in Version 1.3-0 (2010-06-25)
=====================================
o the 'metafor' package now depends on the 'Formula' package
o made escalc() generic and implemented a default and a formula interface
o added the (inverse) arcsine transformation to the set of transformation
functions
Changes in Version 1.2-0 (2010-05-18)
=====================================
o cases where k is very small (e.g., k equal to 1 or 2) are now handled
more gracefully
o added sanity check for cases where all observed outcomes are equal to
each other (this led to division by zero when using the Knapp &
Hartung method)
o the "smarter way to set the number of iterations for permutation tests"
(see notes for previous version below) now actually works like it is
supposed to
o the permutest.rma.uni() function now provides more sensible results
when k is very small; the documentation for the function has also been
updated with some notes about the use of permutation tests under those
circumstances
o made some general improvements to the various forest plot functions
making them more flexible in particular when creating more complex
displays; most importantly, added a 'rows' argument and removed the
'addrows' argument
o some additional examples have been added to the help files for the
forest and addpoly functions to demonstrate how to create more complex
displays with these functions
o added 'showweight' argument to the forest.default() and forest.rma()
functions
o cumul() functions not showing all of the output columns when using
fixed-effects models has been corrected
o weights.rma.uni() function now handles NAs appropriately
o weights.rma.mh() and weights.rma.peto() functions added
o logLik.rma() function now behaves more like other logLik() functions
(such as logLik.lm() and logLik.lme())
Changes in Version 1.1-0 (2010-04-28)
=====================================
o cint() generic removed and replaced with confint() method for objects
of class 'rma.uni'
o slightly improved the code to set the x-axis title in the forest() and
funnel() functions
o added coef() method for 'permutest.rma.uni' objects
o added 'append' argument to escalc() function
o implemented a smarter way to set the number of iterations for
permutation tests (i.e., the permutest.rma.uni() function will now
switch to an exact test if the number of iterations required for an
exact test is actually smaller than the requested number of iterations
for an approximate test)
o changed the way how p-values for individual coefficients are calculated
in permutest.rma.uni() to 'two times the one-tailed area under the
permutation distribution' (more consistent with the way we typically
define two-tailed p-values)
o added 'retpermdist' argument to permutest.rma.uni() to return the
permutation distributions of the test statistics
o slight improvements to the various transformation functions to cope
better with some extreme cases
o p-values are now calculated in such a way that very small p-values
stored in fitted model objects are no longer truncated to 0 (the
printed results are still truncated depending on the number of digits
specified)
o changed the default number of iterations for the ML, REML, and EB
estimators from 50 to 100
Changes in Version 1.0-1 (2010-01-28)
=====================================
o version jump in conjunction with the upcoming publication of a paper in
the Journal of Statistical Software describing the 'metafor' package
o instead of specifying a model matrix, the user can now specify a model
formula for the 'mods' argument in the rma() function (e.g., like in
the lm() function)
o permutest() function now allows exact permutation tests (but this is
only feasible when k is not too large)
o forest() function now uses the 'level' argument properly to adjust the
CI level of the summary estimate for models without moderators (i.e.,
for fixed- and random-effets models)
o forest() function can now also show the credibility interval as a
dashed line for a random-effects model
o information about the measure used is now passed on to the forest() and
funnel() functions, which try to set an appropriate x-axis title
accordingly
o funnel() function now has more arguments (e.g., atransf, at) providing
more control over the display of the x-axis
o predict() function now has its own print() method and has a new
argument called 'addx', which adds the values of the moderator
variables to the returned object (when addx=TRUE)
o functions now properly handle the na.action "na.pass" (treated
essentially like "na.exclude")
o added method for weights() to extract the weights used when fitting
models with rma.uni()
o some small improvements to the documentation
Changes in Version 0.5-7 (2009-12-06)
=====================================
o added permutest() function for permutation tests
o added metafor.news() function to display the NEWS file of the 'metafor'
package within R (based on same idea in the 'animate' package by Yihui
Xie)
o added some checks for values below machine precision
o a bit of code reorganization (nothing that affects how the functions
work)
Changes in Version 0.5-6 (2009-10-19)
=====================================
o small changes to the computation of the DFFITS and DFBETAS values in
the influence() function, so that these statistics are more in line
with their definitions in regular linear regression models
o added option to the plot function for objects returned by influence()
to allow plotting the covariance ratios on a log scale (now the
default)
o slight adjustments to various print() functions (to catch some errors
when certain values were NA)
o added a control option to rma() to adjust the step length of the Fisher
scoring algorithm by a constant factor (this may be useful when the
algorithm does not converge)
Changes in Version 0.5-5 (2009-10-08)
=====================================
o added the phi coefficient (measure="PHI"), Yule's Q ("YUQ"), and Yule's
Y ("YUY") as additional measures to the escalc() function for 2x2 table
data
o forest plots now order the studies so that the first study is at the
top of the plot and the last study at the bottom (the order can still
be set with the 'order' or 'subset' argument)
o added cumul() function for cumulative meta-analyses (with a
corresponding forest() method to plot the cumulative results)
o added leave1out() function for leave-one-out diagnostics
o added option to qqnorm.rma.uni() so that the user can choose whether to
apply the Bonferroni correction to the bounds of the pseudo confidence
envelope
o some internal changes to the class and methods names
o some small corrections to the documentation
Changes in Version 0.5-4 (2009-09-18)
=====================================
o corrected the trimfill() function
o improvements to various print functions
o added a regtest() function for various regression tests of funnel plot
asymmetry (e.g., Egger's regression test)
o made ranktest() generic and added a method for objects of class 'rma'
so that the test can be carried out after fitting
o added anova() function for full vs reduced model comparisons via fit
statistics and likelihood ratio tests
o added the Orwin and Rosenberg approaches to fsn()
o added H^2 measure to the output for random-effects models
o in escalc(), measure="COR" is now used for the (usual) raw correlation
coefficient and measure="UCOR" for the bias corrected correlation
coefficients
o some small corrections to the documentation
Changes in Version 0.5-3 (2009-07-31)
=====================================
o small changes to some of the examples
o added the log transformed proportion (measure="PLN") as another
measure to the escalc() function; changed "PL" to "PLO" for the logit
(i.e., log odds) transformation for proportions
Changes in Version 0.5-2 (2009-07-06)
=====================================
o added an option in plot.infl.rma.uni() to open a new device for
plotting the DFBETAS values
o thanks to Jim Lemon, added a much better method for adjusting the size
of the labels, annotations, and symbols in the forest() function when
the number of studies is large
Changes in Version 0.5-1 (2009-06-14)
=====================================
o made some small changes to the documentation (some typos corrected,
some confusing points clarified)
Changes in Version 0.5-0 (2009-06-14)
=====================================
o first version released on CRAN