[R] arcsine transformation with metafor

Antonello Preti antoviral at gmail.com
Mon Nov 24 00:34:42 CET 2014


# I'm trying to adapt to my own data the double arcsine transformation
according to Miller (1978) as described in the metafor site
# I've understood all passages (I think)
# I'm able to build a forest plot with the correct data
# I would like to build a funnel plot and a radial plot
# However, the rule that is helpful to build a forest plot does not work
for the radial or the funnel plot
# When I use the results of the fixed (or random) effects model, as
expected, the estimates are wrong (about two times the correct estimates)
# How can the radial and funnel plot be built for the double arcsine
transformation?

# Thank you in advance, Antonello

# Here the code I've used

library(metafor)

# The data used by Miller (1978) to illustrate the transformation and its
inversion can be re-created with:

dat <- data.frame(xi=c(3, 6, 10, 1), ni=c(11, 17, 21, 6))
dat$pi <- with(dat, xi/ni)
dat <- escalc(measure="PFT", xi=xi, ni=ni, data=dat)

dat

# The yi values are the Freeman-Tukey (double arcsine) transformed
proportions,
# while the vi values are the corresponding sampling variances.

# We can check whether the back-transformation works for individual values
with:

transf.ipft(dat$yi, dat$ni)


#  As described by Miller (1978), we can aggregate the transformed values,
# either by computing an unweighted or a weighted mean (with
inverse-variance weights).
# The unweighted mean can be obtained with:

res <- rma(yi, vi, method="FE", data=dat, weighted=FALSE)
res


# The value reported by Miller for the unweighted mean is again twice as
large as the value given above,
# which we can confirm with:

predict(res, transf=function(x) x*2)



# To back-transform the average, a value for the sample size is needed.
# Miller suggests to use the harmonic mean of the individual sample sizes
in the inversion formula.
# This can be accomplished with:

predict(res, transf=transf.ipft.hm, targs=list(ni=dat$ni))


# Since the true proportions appear to be homogeneous (e.g., Q(3)=2.18,
p=.54),
# a more efficient estimate of the true proportion can be obtained by using
inverse-variance weights.
# For this, we first synthesize the transformed values with:

res <- rma(yi, vi, method="FE", data=dat)
res


# Again, the value reported by Miller is twice as large.
# We can back-transform the estimated transformed average with:

predict(res, transf=transf.ipft.hm, targs=list(ni=dat$ni))


# When using the Freeman-Tukey transformation,
# an additional complication arises when using the back-transformation.



# To back-transform the individual proportions, we need the individual
sample sizes:

transf.ipft(dat$yi, dat$ni)


# To back-transform the estimated average transformed proportion,
# we need to use the harmonic mean of the sample sizes:

res <- rma(yi, vi, method="FE", data=dat)
pred <- predict(res, transf=transf.ipft.hm, targs=list(ni=dat$ni))
pred



# To build  a forest plot we need to first obtain the CI bounds of the
individual studies with:

dat.back <- summary(dat, transf=transf.ipft, ni=dat$ni)



# Now the back-transformation is applied to each transformed proportion
with the study-specific sample sizes.
# The yi values are now the back-transformed values (i.e., the raw
proportions)
# and the ci.lb and ci.ub values are the back-transformed 95% CI bounds.1)

# Finally, we can create the forest plot by directly passing the observed
outcomes (i.e., proportions)
# and the CI bounds to the function. Then the back-transformed average with
the corresponding CI bounds obtained earlier
# can be added to the plot with the addpoly() function. We add a couple
tweaks to make the final forest plot look nice:


forest(dat.back$yi, ci.lb=dat.back$ci.lb, ci.ub=dat.back$ci.ub,
       xlim=c(-.5,1.8), alim=c(0,1), ylim=c(-1,8), refline=NA, digits=3,
xlab="Proportion")
addpoly(pred$pred, ci.lb=pred$ci.lb, ci.ub=pred$ci.ub, row=-0.5, digits=3,
mlab="FE Model", efac=1.3)
abline(h=0.5)
text(-0.5, 7, "Study",               pos=4)
text( 1.8, 7, "Proportion [95% CI]", pos=2)


### However, this is wrong

radial(res)
funnel(res)

##  sessionInfo()
R version 3.0.2 (2013-09-25)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=Italian_Italy.1252  LC_CTYPE=Italian_Italy.1252
[3] LC_MONETARY=Italian_Italy.1252 LC_NUMERIC=C
[5] LC_TIME=Italian_Italy.1252

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

other attached packages:
[1] metafor_1.9-3 Matrix_1.1-0  Formula_1.1-1

loaded via a namespace (and not attached):
[1] grid_3.0.2      lattice_0.20-24

	[[alternative HTML version deleted]]



More information about the R-help mailing list