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

news2025/7/19 6:21:40

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)
alt

3.2 初步绘图

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

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)
alt

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, # 每行加背景底色
)
alt

4Cox回归结果可视化

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

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

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)
alt

4.3 整理成table

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

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

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

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
)
alt

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)
alt

5.2 整理成table

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

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
)
alt

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

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

📍 往期精彩

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

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/37886.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(第九十三篇)C规范编辑笔记(五)

往期文章&#xff1a; C规范编辑笔记(一) C规范编辑笔记(二) C规范编辑笔记(三) C规范编辑笔记(四) 正文&#xff1a; 继第四篇C规范编辑笔记之后&#xff0c;我们今天来分享第五篇C规范编辑笔记&#xff0c;讲解部分类型初始化时候的建议&#xff0c;话不多说&#xff0c;我…

wodP2P ActiveX 最新版 Crack

wodP2P ActiveX 组件 网络P2P ActiveX 客户端 OCX/DLL&#xff0c;V-P-N 组件&#xff0c;P2P 组件&#xff0c;P2P 库 wodP2P 是 P2P 点对点 ActiveX 组件&#xff0c;用于在两个对等点之间建立虚拟专用网络。所有 P2P 通信都经过加密和保护。对等点能够转发本地和远程端口、发…

Ubuntu 20.04系统中Sage(sagemath)安装及使用详细过程

文章目录一、安装方式一&#xff1a;预编译二进制版本二、安装方式二&#xff1a;源码编译最近在做实验遇到要安装Sage&#xff0c;也是花了将近三天时间才弄好&#xff0c;一波三折整理了一下&#xff0c;以便后续还要安装时能少走弯路。首先&#xff0c;了解一下sage是什么。…

fiddler抓包

首先安装fiddler官网地址 安装完毕之后&#xff0c;这时fiddler软件是抓取不了https的请求数据包的 fiddler 抓取https请求数据包 打开fiddler 一次点击 工具 -> 选项 -> HTTPS 勾选上面选中 的选项 依次进行以下步骤即可 解压fiddler包&#xff0c; 安装fidder 打开…

Servlet到底是什么(非常透彻)

Servlet到底是什么&#xff1f;1. Servlet的概念2. Servlet是一种规范3. Servlet的接口4. JSP是什么学习顺序1. Servlet的概念 Servlet 是 Server Applet 的缩写&#xff0c;译为“服务器端小程序”&#xff0c;是一种使用 Java 语言来开发动态网站的技术。 Servlet 虽然被称…

deepvariant 基因变异识别算法docker版使用

参考&#xff1a;https://github.com/google/deepvariant docker版安装 参考&#xff1a;https://github.com/google/deepvariant/blob/r1.4/docs/deepvariant-quick-start.md 本文是windows上安装的deepvariant 1.4.0版本 docker pull google/deepvariant:1.4.0docker版使用…

用SPDK实现存储加速

个人理解nvme能提高存储性能&#xff0c;就像4G比3G快一样&#xff0c;电磁波还是光速&#xff0c;但协议变了&#xff0c;所以快了。rdma应用跑在用户态能减小存储时延&#xff0c;spdk在用户态实现nvme驱动&#xff0c;天然能和rdma结合&#xff0c;而且两者的队列能一一映射…

python内存泄漏浅析

一、概述 以前没有对内存泄漏有过相关的排查手段&#xff0c;一般个人使用python写的程序&#xff0c;不是那种长时间运行的程序&#xff0c;很少会去注意内存是否出现泄漏&#xff0c;但是如果程序是作为服务器的服务&#xff0c;需要长时间运行的&#xff0c;即使是很小的内…

毕业设计-基于机器视觉的口罩佩戴检测识别

目录 前言 课题背景和意义 实现技术思路 数据来源 COCO数据集预训练模型 图片检测 视频检测 训练&评估结果 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近…

结冰过程渲染-Ovito实现

结冰过程渲染-Ovito实现结冰过程渲染后结果一、渲染步骤-主要突出内容二、识别并区分冰晶和溶液三、渲染溶液中的水四、渲染出溶液中的冰五、突出溶液中溶质、金属板的显示六、data测试文件下载结冰过程渲染后结果 一、渲染步骤-主要突出内容 这里我们主要研究掺杂溶质如何影响…

k8s网络插件之Flannel

Flannel简介 Flannel官网&#xff1a;https://github.com/coreos/flannel Flannel是由CoreOS开源的针对k8s的网络服务&#xff0c;其目的是为解决k8s集群中各主机上Pod之间的通信问题&#xff0c;其借助etcd维护网络IP地址分配&#xff0c;并为每个Node节点分配一个不同的IP地…

学生HTML个人网页作业作品 HTML+CSS校园环保(大学生环保网页设计与实现)

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

redis : 持久化

redis通过将数据放在内存里实现高速访问&#xff0c;为了防止意外情况&#xff0c;其数据也可以存放起来 持久化的实现方式有两种方案&#xff1a;一种是直接保存当前已经存储的数据&#xff0c;相当于复制内存中的数据到硬盘上&#xff0c;需要恢复数据时直接读取即可&#x…

代理模式与动态代理深入理解

一&#xff0c;代理模式的简单认识 1.参与者&#xff1a; 代理对象&#xff0c;被代理对象 代理对象相当于现实生活中的房产中介&#xff0c;被代理对象 相当于 房东 2.目的&#xff1a;保护被代理对象 避免外界直接修改被代理对象&#xff0c;破坏掉被代理对象原本的功能。…

KubeGems容器云平台体验

KubeGems容器云平台体验 KubeGems 是一款开源的企业级多租户容器云平台。围绕云原生社区&#xff0c;KubeGems 提供了多 Kubernetes 集群接入能力&#xff0c;并具备丰富的组件管理和资源成本分析功能&#xff0c;能够帮助企业快速的构建和打造一个本地化、功能强大且低成本的…

关于BigInteger和BigDecimal

BigInteger BigInteger类是用于解决整形类型(含基本数据类型及对应的包装类,)无法表示特别大的数字及运算的问题,即使是占用字节数最多的整形long,能表示的范围也是有限的.理论上,你可以使用BigInteger表示任意整数基于java8中BigInteger的构造方法. BigDecimal的构造方法2 …

Java代码审计基础——RMI原理和反序列化利用链

目录 &#xff08;一&#xff09;何为RMI &#xff08;二&#xff09;、 RMI的模式与交互过程 0x01 设计模式 0x02 交互过程 0x03 Stub和Skeleton &#xff08;三&#xff09;简单的 RMI Demo 1、Server 2、Registry 3、Client 补充——动态类加载机制 几个函数 (…

Java集合框架详解(四)——Map接口、HashMap类、LinkedHashMap类

一、Map接口 Map接口的特点&#xff1a; &#xff08;1&#xff09;映射键值对的形式&#xff08;key和value&#xff09;&#xff1b; &#xff08;2&#xff09;Map集合中&#xff0c;key是不能重复的&#xff0c;value是可以重复的&#xff1b; &#xff08;3&#xff09;…

解决报错:fatal: Authentication failed for ‘https://github.com/*/*.git/‘

目录 问题 解决 步骤一、 步骤二、 步骤三、 ​步骤四、 ​步骤五、 步骤六、 问题 今天创建一个 github 新仓库&#xff0c;首次上传本地代码时&#xff0c;遇到了一个报错。但是&#xff0c;之前这样操作肯定是没有问题的&#xff0c;毕竟我可以保证用户名和密码都是…

复杂环境下多移动机器人路径规划研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …