rr-forestplothazard

Error in forestplot.default: You have provided 2 rows in your mean argument while the labels have 34 rows


I am trying to make a forestplot in R.

Sample provided by this site: https://designdatadecisions.wordpress.com/2016/07/02/forest-plot-with-horizontal-bands/

Starting with reading the data in R.

Formatting so the column labels and columns match

subgps <- c(4,5,8,9,12,13,16,17,20,21,24,25,28,29,32,33)
data$Variable[subgps] <- paste("  ",data$Variable[subgps]) 
np <- ifelse(!is.na(data$Count), paste(data$Count," (",data$Percent,")",sep=""), NA)
tabletext <- cbind(c("Subgroup","\n",data$Variable), 
                    c("No. of Patients (%)","\n",np), 
                    c("4-Yr Cum. Event Rate\n PCI","\n",data$PCI.Group), 
                    c("4-Yr Cum. Event Rate\n Medical Therapy","\n",data$Medical.Therapy.Group), 
                    c("P Value","\n",data$P.Value))

So far no error.

After I try to do the second step, an error shows-up. The second step is as following:

library(forestplot)
png(file.path(workdir,"Figures\\Forestplot.png"),width=960, height=640)
forestplot(labeltext=tabletext, graph.pos=3, 
           mean=c(NA,NA,data$Point.Estimate), 
           lower=c(NA,NA,data$Low), upper=c(NA,NA,data$High),
           title="Hazard Ratio",
           xlab="     <---PCI Better---    ---Medical Therapy Better--->",
           hrzl_lines=list("3" = gpar(lwd=1, col="#99999922"), 
                          "7" = gpar(lwd=60, lineend="butt", columns=c(2:6), col="#99999922"),
                          "15" = gpar(lwd=60, lineend="butt", columns=c(2:6), col="#99999922"),
                          "23" = gpar(lwd=60, lineend="butt", columns=c(2:6), col="#99999922"),
                          "31" = gpar(lwd=60, lineend="butt", columns=c(2:6), col="#99999922")),
           txt_gp=fpTxtGp(label=gpar(cex=1.25),
                              ticks=gpar(cex=1.1),
                              xlab=gpar(cex = 1.2),
                              title=gpar(cex = 1.2)),
           col=fpColors(box="black", lines="black", zero = "gray50"),
           zero=1, cex=0.9, lineheight = "auto", boxsize=0.5, colgap=unit(6,"mm"),
           lwd.ci=2, ci.vertices=TRUE, ci.vertices.height = 0.4)
dev.off()

Error:

Error in forestplot.default(labeltext = tabletext, graph.pos = 3, mean = c(NA, : You have provided 2 rows in your mean argument while the labels have 34 rows

What does this even mean? How to solve This?


Solution

  • It means what it says. From the documentation for forestplot:

    mean: A vector or a matrix with the averages. You can also provide a 2D/3D matrix that is automatically converted to the lower/upper parameters.

    Did you check data to make sure you imported it correctly? If you downloaded it from the link on the blog, it's an .xlsx file.

    what do you see, for example, when you try data$Point.Estimate?

    If it's NULL (I suspect it is), then try downloading it with the openxlsx package:

    install.packages("openxlsx")
    library(openxlsx)
    data <- read.xlsx("ForestPlotData.csv")
    # Presuming you downloaded the file correctly from the url, and its
    # in your working directory, and titled "ForestPlotData.csv"