前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >🤔 forplo | 冲冲冲!这个画森林图的包好flexible哦~

🤔 forplo | 冲冲冲!这个画森林图的包好flexible哦~

作者头像
生信漫卷
发布2023-02-24 14:14:00
3860
发布2023-02-24 14:14:00
举报
文章被收录于专栏:R语言及实用科研软件

1写在前面

我想大家肯定都用过森林图,应用比较多的场景可能是展示meta分析回归分析结果的时候。🥳 画森林图的包还是挺多的,今天介绍一下forplo包的用法。😘

2用到的包

代码语言:javascript
复制
rm(list = ls())
library(tidyverse)
library(forplo)
library(meta)
library(autoReg)
library(survival)

3meta分析结果可视化

3.1 示例数据

这里我准备了一个随机数据,假设是我们收集的各篇文章中的某个指标

代码语言:javascript
复制
dat <- read.csv("./forplo_meta.csv",row.names = 1)
DT::datatable(dat)

3.2 初步绘图

代码语言:javascript
复制
forplo(dat[,1:3],
       groups=dat$groups,
       font = "Arial",
       grouplabs=c('Low risk of bias',
                   'Some concerns',
                   'High risk of bias'))

3.3 分组计算meta效应值

代码语言:javascript
复制
logORs <- round(log(dat$OR),2)

SE <- round((log(dat$UCI)-logORs)/1.96,2)

meta1 <- meta::metagen(logORs[1:3],SE[1:3])

meta2 <- meta::metagen(logORs[4:9],SE[4:9])

meta3 <- meta::metagen(logORs[10:12],SE[10:12])

metatot <- meta::metagen(logORs,SE)

3.4 创建可视化需要的data

代码语言:javascript
复制
dat2 <- dat
dat2$logORs <- logORs
dat2$SE <- SE
dat2$weights <- round(metatot$w.random/sum(metatot$w.random)*100,2)
dat2 <- rbind(subset(dat2,groups==1),
      c(round(exp(meta1$TE.random),2),
        round(exp(meta1$lower.random),2),
        round(exp(meta1$upper.random),2),
        1,round(meta1$TE.random,2),round(meta1$seTE.random,2),sum(dat2$weights[1:3])),
      subset(dat2,groups==2),
      c(round(exp(meta2$TE.random),2),
        round(exp(meta2$lower.random),2),
        round(exp(meta2$upper.random),2),
        2,round(meta2$TE.random,2),round(meta2$seTE.random,2),sum(dat2$weights[4:9])),
      subset(dat2,groups==3),
      c(round(exp(meta3$TE.random),2),
        round(exp(meta3$lower.random),2),
        round(exp(meta3$upper.random),2),
        3,round(meta3$TE.random,2),round(meta3$seTE.random,2),sum(dat2$weights[10:12])),
      c(round(exp(metatot$TE.random),2),
        round(exp(metatot$lower.random),2),
        round(exp(metatot$upper.random),2),
        4,round(metatot$TE.random,2),round(metatot$seTE.random,2),100))
dat2 <- data.frame(dat2)

rownames(dat2)[c(4,11,15,16)] <- c('Effect 1','Effect 2','Effect 3','Effect 4')


DT::datatable(dat2)

3.5 森林图可视化meta结果

代码语言:javascript
复制
forplo(dat2[,1:3],
       font = "Arial",
       groups=dat2$groups,
       grouplabs=c('Low risk of bias',
                   'Some concerns',
                   'High risk of bias',
                   'Overall'),
       left.align=TRUE,
       add.columns=dat2[,5:7],
       add.colnames=c('log(OR)','SE','Weights'),
       scaledot.by = dat2$weights,
       col= '#FEBE8C',
       ci.edge= T,
       char = 15,  # 10为空心圆, 15为实心方格, 20实心圆
       diamond=c(4,11,15,16),
       diamond.col= '#EB6440',
       favorlabs=c('Favours other models','Favours midwife-led'), # x.lab
       ## 阴影参数
       shade.every=1, # 每行加背景底色
       )

4Cox回归结果可视化

本期使用survival里的cancer数据,类型为lung。😘

代码语言:javascript
复制
data("cancer")
DT::datatable(lung)

4.1 因子转换

这里我们先做个factor转换,方便后续操作。🧐

代码语言:javascript
复制
lung$sex <- factor(lung$sex, levels = unique(lung$sex))
lung$ph.ecog <- factor(lung$ph.ecog, levels = c(0,1,2,3))

4.2 Cox回归建模

所有变量都纳入进去进行回归建模吧。👇

代码语言:javascript
复制
fit1 <- coxph(Surv(time, status) ~ sex + age + ph.ecog + ph.karno + pat.karno + meal.cal + wt.loss,
           data = lung)
summary(fit1)

4.3 整理成table

这里我们用一下之前介绍的autoreg, 看一下回归结果。🤩

Note! 由于这个dataset存在缺失值,所以使用了mice包进行填补,想要了解mice具体教程的小伙伴可以在公众号内搜索ggmice或者mice。😏

代码语言:javascript
复制
autoReg(fit1, uni = T, threshold = 0.1, 
        final = T,imputed = T) %>%
  myft()

4.4 森林图可视化

不知道大家有没有发现, 这个结果和autoreg出的结果会有一点细微差异, 仁者见仁,智者见智吧。🤒

代码语言:javascript
复制
forplo(fit1,
       font='Arial',
       sort = T,
       #flipbelow1=T,
       left.align=T,
       ci.edge= T,
       scaledot.by=abs(coef(fit1)),
       col = '#BAD1C2',
       char = 20,
       shade.every = 1,
       shade.col = '#FDF0E0',
       shade.alpha = 0.8
       )

5logistic回归结果可视化

5.1 logistic回归建模

代码语言:javascript
复制
lung$status <- factor(lung$status, levels = rev(unique(lung$status)))
  
fit2 <- glm(status ~ sex + age + ph.karno + pat.karno + meal.cal + wt.loss,
           data = lung,
           family="binomial")
summary(fit2)

5.2 整理成table

代码语言:javascript
复制
autoReg(fit2, uni = T, threshold = 0.1, 
        final = T,imputed = T) %>% 
  myft()

5.3 森林图可视化

代码语言:javascript
复制
forplo(fit2,
       font='Arial',
       sort = T,
       #flipbelow1=T,
       left.align=T,
       ci.edge= T,
       scaledot.by=abs(coef(fit2)),
       col = '#DBA39A',
       char = 15,
       shade.every = 1,
       shade.col = '#FDF0E0',
       shade.alpha = 0.8,
       right.bar=T,
       rightbar.ticks=T,
       leftbar.ticks=T
       )

最后祝大家早日不卷!~


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-11-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信漫卷 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1写在前面
  • 2用到的包
  • 3meta分析结果可视化
    • 3.1 示例数据
      • 3.2 初步绘图
        • 3.3 分组计算meta效应值
          • 3.4 创建可视化需要的data
            • 3.5 森林图可视化meta结果
            • 4Cox回归结果可视化
              • 4.1 因子转换
                • 4.2 Cox回归建模
                  • 4.3 整理成table
                    • 4.4 森林图可视化
                    • 5logistic回归结果可视化
                      • 5.1 logistic回归建模
                        • 5.2 整理成table
                          • 5.3 森林图可视化
                          相关产品与服务
                          灰盒安全测试
                          腾讯知识图谱(Tencent Knowledge Graph,TKG)是一个集成图数据库、图计算引擎和图可视化分析的一站式平台。支持抽取和融合异构数据,支持千亿级节点关系的存储和计算,支持规则匹配、机器学习、图嵌入等图数据挖掘算法,拥有丰富的图数据渲染和展现的可视化方案。
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档