[R-meta] Question on Forest Plot by subgroups

Gabriel Cotlier g@b|k|m01 @end|ng |rom gm@||@com
Mon Jun 19 14:46:12 CEST 2023


Hello all,

I have taken an example from here
<https://www.metafor-project.org/doku.php/plots:forest_plot_with_subgroups> and
modified it to my case study of Fisher's z correlations meta-analysis with
the code below.
I would like to plot a forest plot in which each of the subgroups ( 3
groups expressed in a column named "Type"  : Computational
simulation","Experimental","Natural Rainfed") each showing the studies
(rows) with positive correlations and those with negative correlations
divided in agreement to the line of no effect located at zero. I have used
a column named "alloc" which has a 1 for those correlations (rows) with
positive value and -1 for those with negative value, however for some
reason it does not work as expected. It mixes the lines from
different groups, ploting them where they do not correspond and also does
not plot the model summary for the second and third group.
I tried to change several arguments to solve it, however unsuccessfully.
What could be the error?
Thanks a lot for your help.

############################## CODE
###########################################

pdf(file="ForestPlotCompleteDataSetbyGroups.pdf", width = 12, height = 35)

mlabfun <- function(text, res) {
  list(bquote(paste(.(text),
                    " (Q = ", .(formatC(res$QE, digits=2, format="f")),
                    ", df = ", .(res$k - res$p),
                    ", p ", .(metafor:::.pval(res$QEp, digits=2,
showeq=TRUE, sep=" ")), "; ",
                    I^2, " = ", .(formatC(res$I2, digits=1, format="f")),
"%, ",
                    tau^2, " = ", .(formatC(res$tau2, digits=2,
format="f")), ")")))}
forest(res,
       top = 2,
       # xlim=c(-8, 6),
       # alim = c(-3.36077, 5.181815),
       alim = c(-3.8, 6),
       # at=log(c(0.05, 0.25, 1, 4)),
       # atransf=exp,
       # width = 4,
       showweights = TRUE,
       ilab=cbind(ni),  # content of extra columns of information
       ilab.xpos=c(-4.6), # position of extra columns of information
       cex=0.75,
       ylim=c(-1, 161), # rows in the y-axis from min-row to max-row with
text.
       slab = paste(dat$Authors, dat$Year, sep = ", "),
       order=alloc,
       rows=c(2:15,19:85,89:156), # this divide by groups the studies (3
groups) from column named "Type"
       mlab=mlabfun("RE Model for All Studies", res),
       #psize= 1 ,
       efac = 0.2, # size of the polygon (the diamond)
       # header="Author(s) and Year")
       )

op <- par(cex=0.75, font=2)

text(c(-15), res$k+10,  c("Author(s) and Year"), cex = 1.2, font = 2)
text(c(-4.6), res$k+10,  c("Samples size"), cex = 1.2, font = 2)
text(c(9.7),  res$k+10,  c("Weight"),cex = 1.2, font=2)
text(c(9.7),  res$k+9.3, c("%"),cex = 1.2, font=2)
text(c(12.6),  res$k+10,  c("Fisher's zr [95% CI]"),cex = 1.2, font=2)
text(c(res$k+13), c("Complete Dataset"), cex = 2, font = 2)

par(font=4)

text(-17.2, c(16,86,157), pos=4, c("Computational simulation",
                                 "Experimental",
                                 "Natural Rainfed"), cex = 1.3)
par(op)

### fit random-effects model in the three subgroups
res.s <- rma(yi, vi, subset=(alloc == 1), data=dat)
res.r <- rma(yi, vi, subset=(alloc == 2), data=dat)
res.a <- rma(yi, vi, subset=(alloc == 3),  data=dat)

### add summary polygons for the three subgroups
addpoly(res.s, row= 88, mlab=mlabfun("RE Model for Subgroup", res.s),efac =
0.2, col='red')
addpoly(res.r, row= 18, mlab=mlabfun("RE Model for Subgroup", res.r),efac =
0.2, col='green')
addpoly(res.a, row= 1, mlab=mlabfun("RE Model for Subgroup", res.a),efac =
0.2, col='blue')

dev.off()

	[[alternative HTML version deleted]]



More information about the R-sig-meta-analysis mailing list