专栏首页R语言交流中心R语言绘制森林图

R语言绘制森林图

在Meta分析中森林图比较常见,其主要是是以统计指标和统计分析方法为基础,用数值运算结果绘制出的图型。它在平面直角坐标系中,以一条垂直的无效线(横坐标刻度为1或0)为中心,用平行于横轴的多条线段描述了每个被纳入研究的效应量和可信区间,用一个棱形(或其它图形)描述了多个研究合并的效应量及可信区间。它非常简单和直观地描述了Meta分析的统计结果,是Meta分析中最常用的结果表达形式。

森林图的类型主要包括以下两种:

1. 二值变量的森林图

当研究对象为二值变量(如发生与不发生)时,采用RR和OR作为统计学指标。

RR(risk ratio,危险比率)=发生某一事件的人数/观察的总人数。

OR(odds ratio,比值比)=发生某一事件的人数/未发生某事件的人数。

2. 连续性变量的森林图

分析指标是连续变量,也称数值变量,可选择加权均数差(WMD)或标准化均数差(SMD)为合并统计量。

加权均数差(weighted mean difference)是对每个研究的均数进行加权处理。

大样本研究,由于效应估计值更为准确,权重较大;

小样本研究,由于估计值不够准确,权重较小。

标准化均数差(standardise mean difference)在每一试验中以不同的测量单位对同一结局描述时,需要进行标准化处理。

森林图中横短线与中线相交表示无统计学意义;横线在左侧说明结局弱于竖线结局;在右侧说明强于竖线结局。最后以菱形所在位置得到总体的评价结果。

以上就是森林图的理论知识。接下来我们介绍其是如何在R语言中实现的。

首先我们需要导入R包forestplot。具体的安装载入不再赘述。

下面我们看下其主要的函数forestplot。

其中主要的参数:

tabletext:主要是以矩阵或者list形式将数据导入函数,最好以矩阵,因为数据一般都是矩阵的。

Mean,lower,uper一般会以list形式直接一次性导入,当然如果数据是一个一个向量还是分开的方便。

is.summary主要的功能是让表格的每一行字体出现差异,从而区分表头。其值主要用TRUE/FALSE进行差异化分配。

Graph.pos主要是定位森林图所在的位置。通过数字来确定为第几列。

hrzl_lines以list形式设置表中线的类型以及长度。Eg:“3”=gar(lwd=1,columns=1:4,col=’red’)意思就是宽度为1,线段延伸至第四列。Col指的颜色。

clip主要x轴的最大最小值。

Col指的其中横线以及点的颜色。eg:col=fpcolors(box=’royblue’,line=’darkblue’, summary=’royblue’, hrz_lines=’red’)设置其中这些部分的的颜色。

txt_gap主要是设置表格中文本的字体

最后我们看两个样例程序:

library(forestplot)
# Cochrane data from the 'rmeta'-package
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"))

forestplot(tabletext,

graph.pos =4,

hrzl_lines =list("3"=gpar(lty=2),

"11" =gpar(lwd=1, columns=c(1:3,5), col ="#000044"),

"12" =gpar(lwd=1, lty=2, columns=c(1:3,5), col ="#000044")),

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",hrz_lines ="#444444"))

data(HRQoL)
clrs <-fpColors(box="royalblue",line="darkblue", summary="royalblue")
tabletext <-
  list(c(NA, rownames(HRQoL$Sweden)),
       append(list(expression(beta)), sprintf("%.2f", HRQoL$Sweden[,"coef"])))
tabletext <-tabletext[,1]
forestplot(tabletext, 
            fn.ci_norm =c(fpDrawNormalCI, fpDrawCircleCI),
            boxsize = .25, # We set the box size to better visualize the type
            line.margin = .1, # We need to add this to avoid crowding
            mean =cbind(HRQoL$Sweden[, "coef"], HRQoL$Denmark[, "coef"]),
            lower =cbind(HRQoL$Sweden[, "lower"], HRQoL$Denmark[, "lower"]),
            upper =cbind(HRQoL$Sweden[, "upper"], HRQoL$Denmark[, "upper"]),
            clip =c(-.125, 0.075),
            col=fpColors(box=c("blue", "darkred")),
            xlab="EQ-5D index")
forestplot(tabletext, 
            fn.ci_norm =c(fpDrawNormalCI, fpDrawCircleCI),
            boxsize = .25, # We set the box size to better visualize the type
            line.margin = .1, # We need to add this to avoid crowding
            mean =cbind(HRQoL$Sweden[, "coef"], HRQoL$Denmark[, "coef"]),
            lower =cbind(HRQoL$Sweden[, "lower"], HRQoL$Denmark[, "lower"]),
            upper =cbind(HRQoL$Sweden[, "upper"], HRQoL$Denmark[, "upper"]),
            clip =c(-.125, 0.075),
            lty.ci =c(1, 2),
            col=fpColors(box=c("blue", "darkred")),
            xlab="EQ-5D index")

本文分享自微信公众号 - R语言交流中心(R_statistics),作者:one sand

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-07-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • R语言调用C++程序

    R语言在数据处理方面很是强大,然而也面临着很多的局限性。比如图像的分析处理,大数据的运算效率问题。今天我们介绍R语言和高效语言结合的一种方法:

    一粒沙
  • R语言进化树分析及可视化

    生物进化树基本理论指出所有的生物都可以追溯到共同的祖先,生物的产生和分化就像树一样地生长、分叉,以树的形式来表示生物之间的进化关系是非常自然的事。可以用树中的各...

    一粒沙
  • R语言实现eQTL分析

    今天给大家介绍一个GWAS分析过程中的一个重要的环节eQTL(表达数量性状位点)分析。eQTL指的是染色体上一些能特定调控mRNA和蛋白质表达水平的区域,其mR...

    一粒沙
  • BERT相关论文、文章和代码资源汇总

    BERT最近太火,蹭个热点,整理一下相关的资源,包括Paper, 代码和文章解读。

    AINLP
  • Cats(1)- 从Free开始,Free cats

      cats是scala的一个新的函数式编程工具库,其设计原理基本继承了scalaz:大家都是haskell typeclass的scala版实现。当然,cat...

    用户1150956
  • PHP开发者必备的50个库/框架【2019】

    Symfony是一个web应用开发框架,包含一组可重用的PHP组件。Symfony已经应用于上千个web应用,包括BlaBlaCar.com和Spotify.c...

    用户1408045
  • ubuntu一步搭建Apache+MySQL+PHP环境

    AlicFeng
  • 超全AI速查表|神经网络、机器学习、深度学习

    这个速查表可以帮助你为你的任务找到合适的estimator,这个是工作中最困难的地方。流向图帮助你查找文档,estimator也能大致的帮助你更加好的理解你的问...

    AI科技大本营
  • 干货!最全的AI速查表|神经网络,机器学习,深度学习

    这个速查表可以帮助你为你的任务找到合适的estimator,这个是工作中最困难的地方。流向图帮助你查找文档,estimator也能大致的帮助你更加好的理解你的问...

    石晓文
  • 最全的AI速查表|神经网络,机器学习,深度学习

    过去的几个月中,我都在收集AI速查表。我时不时的分享给同学和朋友,他们经常问我要。所以我决定整理一下,发出来。为了让这件事情更加有趣,我对每个主题加了点描述。

    AI算法与图像处理

扫码关注云+社区

领取腾讯云代金券