lenn
lenn

Reputation: 5

Forestplot in R superscript in tabletext matrix

I am creating a forestplot in R. Since I cannot display my own data I am using example code and data that I found here https://cran.r-project.org/web/packages/forestplot/vignettes/forestplot.html

cochrane_from_rmeta <- 
structure(list(
mean  = c(NA, NA, 0.578, 0.165, 0.246, 0.700, 0.348, 0.139, 1.017, NA, 0.531), 
lower = c(NA, NA, 0.372, 0.018, 0.072, 0.333, 0.083, 0.016, 0.365, NA, 0.386),
upper = c(NA, NA, 0.898, 1.517, 0.833, 1.474, 1.455, 1.209, 2.831, NA, 0.731)),
.Names = c("mean", "lower", "upper"), 
row.names = c(NA, -11L), 
class = "data.frame")


tabletext<-cbind(
c("", "Study", "Auckland", "Block", 
"Doran", "Gamsu", "Morrison", "Papageorgiou", 
"Tauesch", NA, "Summary"),
c("Deaths", "(steroid)", "36", "1", 
"4", "14", "3", "1", 
"8", NA, NA),
c("Deaths", "(placebo)", "60", "5", 
"11", "20", "7", "7", 
"10", NA, NA),
c("", "OR", "0.58", "0.16", 
"0.25", "0.70", "0.35", "0.14", 
"1.02", NA, "0.53"),
c("",NA,NA,NA,NA,NA,NA,NA,NA,NA,"Heterogeniety I^2 = 20%"))[enter image description here][1]


library(forestplot)
 forestplot(tabletext, 
       cochrane_from_rmeta,new_page = TRUE,
       is.summary=c(TRUE,TRUE,rep(FALSE,8),TRUE),
       clip=c(0.1,2.5), 
       xlog=TRUE, 
       col=fpColors(box="royalblue",line="darkblue", summary="royalblue"))

I would like to superscript the very last label for Heterogeniety. I tried expression(Heterogeniety~I^2), but I get the following error message:

Error in cbind(c("Outcome", "Death or BPD", NA, NA, NA, "Interaction p value = .xx", : cannot create a matrix from type 'expression'

How do I include a superscript in my forestplot?

Upvotes: 0

Views: 1601

Answers (2)

Savitesh Kushwaha
Savitesh Kushwaha

Reputation: 1

Create a new column for superscripts based on the length of studlab or use your reference numbers here

random_all$trial <- seq_len(length(random_all$studlab))  # Generate a sequence from 1 to the length of `studlab` or use reference here

Combine study labels with trial numbers in superscripts

random_all$studlab.ref <- mapply(
  function(x, y) as.expression(bquote(.(x)^.(y))),  # Format as expression
  random_all$studlab,  # Study label
  random_all$trial  # New trial numbers for superscripts
)

Forest Plot Code

forest(
  random_all,
  # studlab = TRUE,
  studlab = random_all$studlab.ref,  # Use the newly created slab.ref for labels
  xlim = c(0.0, 100),
  pooled.events = TRUE,
  smlab = "",
  fontsize = 10,
  overall = TRUE,
  # test.overall = FALSE,
  # fontfamily = "Times",
  col.square = "white",
  col.square.lines = "black",
  squaresize = 0.5,
  col.diamond = "black",
  col.common = "grey",
  # sortvar = year,
  col.inside = "black",
  # text.common = "Fixed effects model",
  weight.study = "Random", #can be "fixed"
  # text.w.common = "Fixed",
  text.w.random = "Random",
  # print.tau2 = FALSE,
  prediction = TRUE,
  col.predict = "black",
  col.predict.lines = "black",
  subgroup = TRUE,
  print.subgroup.name = FALSE ,
  print.subgroup.labels = TRUE,
  # label.test.subgroup.common = "Test for subgroup differences (fixed effects): ",
  leftlabs = c("Author (Year)", "Anemia\n(N)", "Total IBD\n(N)"),
  rightlabs = c("Proportion (%)", "95% CI", "Weight"),
  fs.heading = 10,
  xlab = "Proportion (%)",  # Customize label,
  digits = 1,
  digits.tau2 = 2,
  digits.pval.Q = 3,
  digits.I2 = 1,
  digits.Q = 1,
  digits.pval = 3,
  # layout = "RevMan5",
  colgap.forest.left = "2.0cm",
  print.tau2 = TRUE,
  print.I2 = TRUE,  # Include I²
  print.Q = TRUE,   # Include X sq or Q statistic
  print.pval.Q = TRUE
  # ref = 0.0000,
  # text.addline1 = "",
  # ff.addline = "bold",
  # fs.addline = 12,
)

Upvotes: 0

chinsoon12
chinsoon12

Reputation: 25225

R does not allow you to create a matrix of expression. Also mentioned in the documentation for forestplot,

You can also provide a matrix although this cannot have expressions by design

Luckily, the documentation for forestplot also mentioned that it can take in a list for labeltext.

The list should be wrapped in m x n number to resemble a matrix: list(list("rowname 1 col 1", "rowname 2 col 1"), list("r1c2", expression(beta))

Hence, you might want to convert your tabletext into a nested list as follows:

tabletext <- list(
    list("", "Study", "Auckland", "Block", 
        "Doran", "Gamsu", "Morrison", "Papageorgiou", 
        "Tauesch", NA, "Summary"),
    list("Deaths", "(steroid)", "36", "1", 
        "4", "14", "3", "1", 
        "8", NA, NA),
    list("Deaths", "(placebo)", "60", "5", 
        "11", "20", "7", "7", 
        "10", NA, NA),
    list("", "OR", "0.58", "0.16", 
        "0.25", "0.70", "0.35", "0.14", 
        "1.02", NA, "0.53"),
    list("",NA,NA,NA,NA,NA,NA,NA,NA,NA, expression(Heterogeniety~I^2==20~'%')))


forestplot(tabletext, 
    cochrane_from_rmeta,new_page = TRUE,
    is.summary=c(TRUE,TRUE,rep(FALSE,8),TRUE),
    clip=c(0.1,2.5), 
    xlog=TRUE, 
    col=fpColors(box="royalblue",line="darkblue", summary="royalblue"))

HTH.

Upvotes: 0

Related Questions