用R语言的forestplot包画亚组分析森林图

1. 背景介绍

关于绘制临床研究报告中亚组分析的森林图,我过去几乎试过了所有可能的工具,最早用绘制meta分析森林图的方法绘制临床研究亚组分析森林图,使用过Stata,RevMan,甚至用过Excel......虽然这些工具都能画,但操作繁琐,往往还需要借助其他工具进一步修改图形。当然,如果精通SAS,画个森林图应该是小菜一碟,很多顶级杂志也是采用SAS制作亚组分析森林图,但SAS毕竟是统计分析工具中的贵族,会的人不多,笔者也没有系统学习过SAS绘图,最终我还是把解决问题的目光投向了R。自从我使用了R语言的forestplot包,以前那些画亚组分析森林图的方法统统摒弃,画亚组分析森林图,唯R独尊。

2. 案例分析

下面我们就以发表在新英格兰杂志上的一篇文章中的亚组分析森林图为例[1],用R语言的forestplot包还原这个森林图,下图1.为原文的FIG.1 D图。作者首先在所有入组人群中比较了试验组(阿比特龙+泼尼松)与对照组(单用泼尼松)在总生存率Overall Survival的差异,并计算了HR及95%可信区间,然后又按照多种因素从总人群中取子集,在子集中进一步比较试验组与对照组 Overall Survival 的差异,这就是我们常说的所谓亚组分析。虽然笔者对这些亚组分析的结果持谨慎态度,但亚组分析结果作为一种观察性结果还是具有一定参考价值。此外,我们不得不承认这幅图画的真的很好,清晰明了,可以直观的观察到在某些亚组人群中试验组的获益更大。下面我们就以这幅图的例子来演示下如何复制一幅相同的图出来。

用R语言的forestplot包画亚组分析森林图-图片1

图1. 为原文的FIG.1 D图。

 

首先,我们需要从这幅图里还原原始数据并整理入Excel中,并另存为“abiraterone.csv”,整理后的数据如下图2.所示。注意:下图数据还原的形式很重要,数据只有按照我们这种方式整理才能绘制出合格的图形,这一点一定要严格遵守。

用R语言的forestplot包画亚组分析森林图-图片2

图2. 还原图中的数据并整理成固定格式。前四列均为字符串形式,后三列分别是:HR值的点估计、95%可信区间下限、上限,均为数值型变量。当数据导入R语言,最后三列空格处会自动填充为NA,表示缺失。

 

3. R语言代码及代码解读

  1. install.packages("forestplot")
  2.  
  3. library(forestplot)
  4.  
  5. rs_forest <- read.csv('abiraterone.csv',header = FALSE)
  6.  
  7. # 读入数据的时候一定要把header设置成FALSE,确保第一行不被当作列名称。
  8.  
  9. tiff('Figure 1.tiff',height = 6000,width = 7000,res= 600)
  10.  
  11. forestplot(labeltext = as.matrix(rs_forest[,1:4]),
  12.  
  13. #设置用于文本展示的列,此处我们用数据的前四列作为文本,在图中展示
  14.  
  15. mean = rs_forest$V5, #设置均值
  16.  
  17. lower = rs_forest$V6, #设置均值的lowlimits限
  18.  
  19. upper = rs_forest$V7, #设置均值的uplimits限
  20.  
  21. is.summary=c(T,T,T,F,F,T,F,F,T,F,F,T,F,F,F,T,F,F,T,F,F,T,F,F,T,F,F),
  22.  
  23. #该参数接受一个逻辑向量,用于定义数据中每一行是否是汇总值,若是,则在对应位置设置为TRUE,若否,则设置为FALSE;设置为TRUE的行则以粗体出现
  24.  
  25. zero = 1, #设置参照值,此处我们展示的是HR值,故参照值是1,而不是0
  26.  
  27. boxsize = 0.4, #设置点估计的方形大小
  28.  
  29. lineheight = unit(8,'mm'),#设置图形中的行距
  30.  
  31. colgap = unit(2,'mm'),#设置图形中的列间距
  32.  
  33. lwd.zero = 2,#设置参考线的粗细
  34.  
  35. lwd.ci = 2,#设置区间估计线的粗细
  36.  
  37. col=fpColors(box='#458B00',summary="#8B008B",lines = 'black',zero = '#7AC5CD'),
  38.  
  39. #使用fpColors()函数定义图形元素的颜色,从左至右分别对应点估计方形,汇总值,区间估计线,参考线
  40.  
  41. xlab="The estimates",#设置x轴标签
  42.  
  43. lwd.xaxis=2,#设置X轴线的粗细
  44.  
  45. lty.ci = "solid",
  46.  
  47. graph.pos = 4)#设置森林图的位置,此处设置为4,则出现在第四列

最后得亚组分析森林图如下图3.所示

用R语言的forestplot包画亚组分析森林图-图片3

图3. 还原的亚组分析森林图。

至此,可以获得一张直接用于投稿的展示亚组分析结果的图形,美观,简洁,清晰、明了。如果我们以矢量图的形式导出,可以通过矢量图的编辑软件进一步修改美化,当然以这幅图目前的颜值用于投稿已经绰绰有余了。以上雕虫小技,希望对大家有用。

4. 参考文献

[1].Abiraterone in Metastatic Prostate Cancer without Previous Chemotherapy. N Engl J Med. 2013 Jan 10;368(2):138-48.

[2].张铁军 陈兴栋 刘振球 著,《R语言与医学统计图形》, 人民卫生出版社, 2018.

评论  4  访客  4
    • 流雨明 0

      经常出错,试了几次,换了不同版本的R,Error in Summary.factor(c(31L, 15L, 1L, 9L, 22L, 1L, 28L, 6L, 1L, 4L, :
      ‘max’ not meaningful for factors

      • zyf 0

        graph.pos = 4)这一步之后为什么出现不了森林图

        • 213312 0

          无法复现

          • 小熊 0

            请问做完这些呢?也没有图呀?

          发表评论

          匿名网友

          拖动滑块以完成验证
          加载失败