jamesbang

V1

2022/11/26阅读:48主题:雁栖湖

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

1写在前面

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

2用到的包

rm(list = ls())
library(tidyverse)
library(forplo)
library(meta)
library(autoReg)
library(survival)

3meta分析结果可视化

3.1 示例数据

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

dat <- read.csv("./forplo_meta.csv",row.names = 1)
DT::datatable(dat)

3.2 初步绘图

forplo(dat[,1:3],
groups=dat$groups,
font = "Arial",
grouplabs=c('Low risk of bias',
'Some concerns',
'High risk of bias'))

3.3 分组计算meta效应值

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

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结果

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。😘

data("cancer")
DT::datatable(lung)

4.1 因子转换

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

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回归建模

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

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。 😏

autoReg(fit1, uni = T, threshold = 0.1, 
final = T,imputed = T) %>%
myft()

4.4 森林图可视化

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

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回归建模

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

autoReg(fit2, uni = T, threshold = 0.1, 
final = T,imputed = T) %>%
myft()

5.3 森林图可视化

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
)

蛋挞
最后祝大家早日不卷!~

点个在看吧各位~ ✐.ɴɪᴄᴇ ᴅᴀʏ 〰

📍 往期精彩

📍 🤩 ComplexHeatmap | 颜狗写的高颜值热图代码!
📍 🤥 ComplexHeatmap | 你的热图注释还挤在一起看不清吗!?
📍 🤨 Google | 谷歌翻译崩了我们怎么办!?(附完美解决方案)
📍 🤩 scRNA-seq | 吐血整理的单细胞入门教程
📍 🤣 NetworkD3 | 让我们一起画个动态的桑基图吧~
📍 🤩 RColorBrewer | 再多的配色也能轻松搞定!~
📍 🧐 rms | 批量完成你的线性回归
📍 🤩 CMplot | 完美复刻Nature上的曼哈顿图
📍 🤠 Network | 高颜值动态网络可视化工具
📍 🤗 boxjitter | 完美复刻Nature上的高颜值统计图
📍 🤫 linkET | 完美解决ggcor安装失败方案(附教程)
📍 ......

分类:

后端

标签:

后端

作者介绍

jamesbang
V1

wx🔍: Grassssss 卷起来了