Funnel Plots
Function to create funnel plots.
funnel(x, ...) ## S3 method for class 'rma' funnel(x, yaxis="sei", xlim, ylim, xlab, ylab, steps=5, at, atransf, targs, digits, level=x$level, addtau2=FALSE, type="rstandard", back="lightgray", shade="white", hlines="white", refline, pch=19, pch.fill=21, col, bg, legend=FALSE, ci.res=1000, ...) ## Default S3 method: funnel(x, vi, sei, ni, subset, yaxis="sei", xlim, ylim, xlab, ylab, steps=5, at, atransf, targs, digits, level=95, back="lightgray", shade="white", hlines="white", refline=0, pch=19, col, bg, legend=FALSE, ci.res=1000, ...)
x |
an object of class |
vi |
vector with the corresponding sampling variances. |
sei |
vector with the corresponding standard errors. |
ni |
vector with the corresponding sample sizes. |
subset |
optional (logical or numeric) vector indicating the subset of studies that should be included in the plot. Only relevant when passing a vector via |
yaxis |
either |
xlim |
x-axis limits. If unspecified, the function tries to set the x-axis limits to some sensible values. |
ylim |
y-axis limits. If unspecified, the function tries to set the y-axis limits to some sensible values. |
xlab |
title for the x-axis. If unspecified, the function tries to set an appropriate axis title. |
ylab |
title for the y-axis. If unspecified, the function tries to set an appropriate axis title. |
steps |
the number of tick marks for the y-axis (the default is 5). |
at |
position of the x-axis tick marks and corresponding labels. If unspecified, the function tries to set the tick mark positions/labels to some sensible values. |
atransf |
optional argument specifying the name of a function that should be used to transform the x-axis labels (e.g., |
targs |
optional arguments needed by the function specified via |
digits |
integer specifying the number of decimal places to which the tick mark labels of the x- and y-axis should be rounded. Can also be a vector of two integers, the first specifying the number of decimal places for the x-axis, the second for the y-axis labels (e.g., |
level |
numerical value between 0 and 100 specifying the level of the pseudo confidence interval region (for |
addtau2 |
logical to indicate whether the amount of heterogeneity should be accounted for when drawing the pseudo confidence interval region (the default is |
type |
either |
back |
color to use for the background of the plotting region. |
shade |
color to use for shading the pseudo confidence interval region. When |
hlines |
color of the horizontal reference lines. |
refline |
value at which to draw the vertical reference line and, if drawn, where the pseudo confidence interval should be centered. If unspecified, the reference line is drawn at the fixed- or random-effects model estimate when the model does not include moderators and at zero when moderators are included (and therefore residuals are plotted) or when directly plotting observed effect sizes or outcomes. |
pch |
plotting symbol to use for the observed effect sizes or outcomes. By default, a solid circle is used. Can also be a vector of values. See |
pch.fill |
plotting symbol to use for the effect sizes or outcomes filled in by the trim and fill method. By default, a circle is used. Only relevant when plotting an object created by the |
col |
optional character string specifying the name of a color to use for the points ("black" is used by default if not specified). Can also be a vector of color names. |
bg |
optional character string specifying the name of a background color for open plot symbols ("white" is used by default if not specified). Can also be a vector of color names. |
legend |
logical to indicate whether a legend should be added to the plot (can also be a keyword to indicate the position of the legend; see as in |
ci.res |
integer specifying the number of y-axis values at which to calculate the bounds of the pseudo confidence interval. The default is |
... |
other arguments. |
For fixed- and random-effects models (i.e., models not involving moderators), the plot shows the individual observed effect sizes or outcomes on the x-axis against the corresponding standard errors (i.e., the square root of the sampling variances) on the y-axis. A vertical line indicates the estimate based on the model. A pseudo confidence interval region is drawn around this value with bounds equal to ± 1.96 SE, where SE is the standard error value from the y-axis (assuming level=95
). If addtau2=TRUE
(only for models of class "rma.uni"
), then the bounds of the pseudo confidence interval region are equal to ± 1.96 √(SE² + τ²), where τ² is the amount of heterogeneity as estimated by the model.
For models involving moderators, the plot shows the residuals on the x-axis against their corresponding standard errors. Either the usual or deleted residuals can be used for that purpose (set via the type
argument). See residuals.rma
for more details on the different types of residuals.
With the atransf
argument, the labels of the observed effect sizes or outcomes on the x-axis can be transformed with some suitable function. For example, when plotting log odds ratios, one could use transf=exp
to obtain a funnel plot with the values on the x-axis corresponding to the odds ratios. See also transf for some transformation functions useful for meta-analyses.
Instead of placing the standard error value on the y-axis, several other options are available by setting the yaxis
argument to:
yaxis="vi"
for the sampling variance,
yaxis="seinv"
for the inverse of the standard error,
yaxis="vinv"
for the inverse of the sampling variance,
yaxis="ni"
for the sample size,
yaxis="ninv"
for the inverse of the sample size,
yaxis="sqrtni"
for the square root sample size,
yaxis="sqrtninv"
for the inverse of the square root sample size,
yaxis="lni"
for the log of the sample size,
yaxis="wi"
for the weights.
However, only when yaxis="sei"
(the default) will the pseudo confidence region have the expected (upside-down) funnel shape with straight lines. Also, when placing (a function of) the sample size on the y-axis or the weights, then the pseudo confidence region cannot be drawn. See Sterne and Egger (2001) for more details on the choice of the y-axis.
If the object passed to the function comes from the trimfill
function, the effect sizes or outcomes that are filled in by the trim and fill method are also added to the funnel plot. The symbol to use for plotting the filled in values can then be specified via the pch.fill
argument.
One can also directly pass a vector of observed effect sizes or outcomes (via x
) and the corresponding sampling variances (via vi
), standard errors (via sei
), and/or sample sizes (via ni
) to the function. By default, the vertical reference line is then drawn at zero.
The arguments back
, shade
, and hlines
can be set to NULL
to suppress the shading and the horizontal reference lines.
A data frame with components:
x |
the x coordinates of the points that were plotted. |
y |
the y coordinates of the points that were plotted. |
slab |
study labels of the points that were plotted. |
Note that the data frame is returned invisibly.
Placing (a function of) the sample size on the y-axis (i.e., using yaxis="ni"
, yaxis="ninv"
, yaxis="sqrtni"
, yaxis="sqrtninv"
, or yaxis="lni"
) is only possible when information about the sample sizes is actually stored within the object passed to the funnel
function. That should automatically be the case when the observed outcomes were computed with the escalc
function or when the observed outcomes were computed within the model fitting function. On the other hand, this will not automatically be the case when rma.uni
was used together with the yi
and vi
arguments and the yi
and vi
values were not computed with escalc
. In that case, it is still possible to pass information about the sample sizes to the rma.uni
function (i.e., use rma.uni(yi, vi, ni)
).
When using unweighted estimation, using yaxis="wi"
will place all points on a horizontal line. When directly passing a vector of observed effect sizes or outcomes to the function, yaxis="wi"
is equivalent to yaxis="vinv"
, except that the weights are expressed in percent.
When specifying vectors for pch
, col
, and/or bg
, the variables specified are assumed to be of the same length as the data passed to the funnel function or the model fitting function (when using funnel
on a model object). Any subsetting and removal of studies with missing values is automatically applied to the variables specified via pch
, col
, and bg
.
Wolfgang Viechtbauer wvb@metafor-project.org http://www.metafor-project.org/
Light, R. J., & Pillemer, D. B. (1984). Summing up: The science of reviewing research. Cambridge, MA: Harvard University Press.
Peters, J. L., Sutton, A. J., Jones, D. R., Abrams, K. R., & Rushton, L. (2008). Contour-enhanced meta-analysis funnel plots help distinguish publication bias from other causes of asymmetry. Journal of Clinical Epidemiology, 61, 991–996.
Sterne, J. A. C., & Egger, M. (2001). Funnel plots for detecting bias in meta-analysis: Guidelines on choice of axis. Journal of Clinical Epidemiology, 54, 1046–1055.
Viechtbauer, W. (2010). Conducting meta-analyses in R with the metafor package. Journal of Statistical Software, 36(3), 1–48. https://www.jstatsoft.org/v036/i03.
### copy BCG vaccine data into 'dat' dat <- dat.bcg ### calculate log risk ratios and corresponding sampling variances dat <- escalc(measure="RR", ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat) ### random-effects model res <- rma(yi, vi, data=dat) ### standard funnel plot funnel(res) ### show risk ratio values on x-axis (log scale) funnel(res, atransf=exp) ### passing log risk ratios and sampling variances directly to the function ### note: essentially the same plot, except that reference line is centered at zero funnel(dat$yi, dat$vi) funnel(res, refline=0) ### funnel plot with risk ratio values on the x-axis (log scale) funnel(res, atransf=exp, at=log(c(.12, .25, .5, 1, 2))) ### contour-enhanced funnel plot centered at 0 (see Peters et al., 2008) funnel(res, level=c(90, 95, 99), shade=c("white", "gray55", "gray75"), refline=0, legend=TRUE) ### same, but show risk ratio values on the x-axis funnel(res, level=c(90, 95, 99), shade=c("white", "gray55", "gray75"), refline=0, legend=TRUE, atransf=exp, at=log(c(.10, .25, .5, 1, 2, 4, 10))) ### illustrate the use of vectors for 'pch' and 'col' res <- rma(yi, vi, data=dat, subset=2:10) funnel(res, pch=ifelse(dat$yi > -1, 19, 21), col=ifelse(sqrt(dat$vi) > .3, "red", "blue")) ### mixed-effects model with absolute latitude in the model res <- rma(yi, vi, mods = ~ ablat, data=dat) ### funnel plot of the residuals funnel(res) ### simulate a large meta-analytic dataset (correlations with rho = 0.2) ### with no heterogeneity or publication bias; then try out different ### versions of the funnel plot gencor <- function(rhoi, ni) { x1 <- rnorm(ni, mean=0, sd=1) x2 <- rnorm(ni, mean=0, sd=1) x3 <- rhoi*x1 + sqrt(1-rhoi^2)*x2 cor(x1, x3) } set.seed(1234) k <- 200 ### number of studies to simulate ni <- round(rchisq(k, df=2) * 20 + 20) ### simulate sample sizes (skewed distribution) ri <- mapply(gencor, rep(0.2,k), ni) ### simulate correlations res <- rma(measure="ZCOR", ri=ri, ni=ni, method="FE") ### use r-to-z transformed correlations funnel(res, yaxis="sei") funnel(res, yaxis="vi") funnel(res, yaxis="seinv") funnel(res, yaxis="vinv") funnel(res, yaxis="ni") funnel(res, yaxis="ninv") funnel(res, yaxis="sqrtni") funnel(res, yaxis="sqrtninv") funnel(res, yaxis="lni") funnel(res, yaxis="wi")
Please choose more modern alternatives, such as Google Chrome or Mozilla Firefox.