临床研究中常需要绘制两组或多组患者(如非AKI组和AKI组)的基线特征表。

下图就是临床中常见的基线特征表,从下图我们可以看出,第1列为两组患者需要比较的变量;第2列为所有患者的基线特征,这一列在论文中可有可不有;第3列和第4列分别为非AKI组和AKI组的基线特征;第5列比较两组基线特征有没有统计学差异。

患者基线特征表1

在上图中,分类变量表示为计数(百分比),连续变量若呈正态分布表示为均值±标准差,呈非正态分布表示为中位数和四分位数。

那么在R中怎么快速绘制绘制临床论文中的基线特征表1

可以使用tableone包来绘制。


目  录

  • 1. 绘制基线表前的准备

  • 2. 单组汇总数据

  • 3. 分类变量处理

  • 4. 优化单组汇总

  • 5. 显示基线表所有数据信息

  • 6. 指定非正态分布变量

  • 7. 多组汇总数据

  • 8. 统计检验

  • 9. 添加overall列

  • 10. 输出基线特征表

  • 11. 后续

  • 12. CreateTableOne()函数

  • End


1. 绘制基线表前的准备

安装需要用到的R包install.packages("tableone")  # 安装tableone包,绘制基线表需要install.packages("survival") # 安装需要内置数据集的包

加载数据集和包library(tableone) # 加载包library(survival)  # 加载包,需要使用survival包的colon数据data(colon) # 加载数据集View(colon) # 预览数据集

本次用来演示的数据集为survival包的colon数据,数据集介绍查看《常用内置数据集介绍》这篇文章。

2. 单组汇总数据

CreateTableOne(data = colon)  # 汇总整个数据集特征

从上面可以看出,colon数据集中共有1858例患者,但由于没有将分类变量转化为因子,所以分类变量显示的也是均值+标准差。

3. 分类变量处理

在数据处理中,大多数分类变量是采用数字编码,二分类变量常表示为01,多分类变量表示为012等。

有两种方法可以将分类变量转化为因子:一是先在数据集中将分类变量转化为因子,然后再使用tableone包进行汇总,二是在tableone包中直接指定哪些变量属于因子(使用factorVars参数进行转换),然后在进行汇总。

dput(names(colon)) # 输出colon数据集变量名称输出变量名称:c("id", "study", "rx", "sex", "age",   "obstruct", "perfor", "adhere",   "nodes", "status", "differ", "extent",   "surg", "node4", "time", "etype")

从数据集介绍中,我们知道 "rx""sex""obstruct""perfor""adhere""status""differ""extent""surg""node4""etype"都是分类变量。

指定基线表中需要比较的变量

排除一些不需要比较的变量,如id、study之类的变量myVars "rx", "sex", "age", "obstruct", "perfor",             "adhere", "nodes", "status", "differ",             "extent", "surg", "node4", "time", "etype")

指定基线表中哪些变量是分类变量

catVars "rx", "sex","obstruct", "perfor", "adhere", "status",             "differ","extent", "surg", "node4","etype")

4. 优化单组汇总

tab2                        data = colon,                        factorVars = catVars);tab2# 通过vars参数指定哪些变量是基线表中需要汇总的变量# 通过factorVars参数指定哪些变量是分类变量# data参数指定变量的数据来源

从上图可以看出,在指定基线表的汇总变量、分类变量,排除掉无关变量后,基线表的结果显示比前面好很多。

二分类变量显示为第2水平的计数(百分比),比如分类变量为01,则显示1的结果;如果为多分类变量,则显示出所有水平数据。

如果在表中要显示所有水平的数据,则输入:

print(tab2, showAllLevels = TRUE)

注意:分类变量的百分比数据是在排除缺失值后计算的。

5. 显示基线表所有数据信息

如果需要显示所有数据信息,包括分类变量和连续变量的缺失值信息,对结果对象使用summary()函数,先输出连续变量数据信息,在输出分类变量数据信息。

summary(tab2)

连续变量数据

分类变量数据

6. 指定非正态分布变量

从前面的表中可以看到,连续变量都表示为均数+标准差,这是认为连续变量都呈正态分布。但是实际上有些数据呈非正态分布,需要用中位数(四分位数)表示。

怎么判断连续变量是不是呈正态分布,可以参考《R语言统计绘图:t 检验怎么做?》这篇文章。

假设数据集中"time"和"nodes"两个连续变量呈非正态分布。

nonvar "time","nodes") # 指定哪些变量是非正态分布变量print(tab2, nonnormal = nonvar) # 输出基线表数据信息

可以看出"time"和"nodes"这两个连续变量都用中位数(四分位数)表示了。

如果在print()函数中输入的是nonnormal = TRUE,则所有连续变量都按非正态分布进行分析。

微调基线表数据输出格式查看《R语言统计与绘图:微调基线特征表1输出格式》这篇文章。

7. 多组汇总数据

在前面,我们对数据集信息进行了单组汇总。但是通常,我们需要比较两组患者之间的基线特征,如比较AKI组和非AKI组。

在本数据集中,我们需要对"status"生存状态(1为死亡,0为删失)进行分组汇总。

tab3                        strata = "status",                        data = colon,                        factorVars = catVars); tab3# strata参数表示分层,指定需要分层的变量,这里我们指定status变量# 通过vars参数指定哪些变量是基线表中需要汇总的变量。# 通过factorVars参数指定哪些变量是分类变量# data参数指定变量的数据来源

从图上我们可以看出,我们已经分组总结好了,并且在表右边已经自动进行了统计检验,输出了检验p值。

但是呈非正态分布的连续变量并没有输出中位数和四分位数,检验方法也需要调整。

别急,后面进行调整。

8. 统计检验

如上表所示,当进行两组或多组分层汇总时,两组或多组间比较的p值会自动随着基线表一起输出,如果p值很小,则显示为<0.001

CreateTableOne()函数默认的检验方法为:分类变量使用卡方检验(chisq.test(),进行连续性校正);连续变量使用方差分析(oneway.test(),假设等方差),两组间方差分析相当于t检验。

但是在基线表中,有些连续变量是非正态分布变量,有些分类变量中单元格期望值较小,这些变量的统计方法不能使用默认的统计方法。

kruskal.test()函数可以用于呈非正态分布的连续变量,fisher.test()可以指定分类变量进行fisher精确检验。在两组间比较时,kruskal.test()wilcox.test()等效。

基线表的test列会显示哪些变量是使用非默认检验方法来计算p值。

假设"extent"变量需要使用fisher精确检验。

print(tab3, # 前面的tab3对象      nonnormal = nonvar, # 指定哪些连续变量是非正态分布变量      exact = "extent")  # 指定哪些变量需要使用fisher精确检验

9. 添加overall列

如最前面的举例所示,基线表中可以添加overall列,表示所有患者的特征。

在CreateTableOne()函数中使用addOverall = TRUE就可以添加overall列了。

tab4                        strata = "status",                        data = colon,                        factorVars = catVars,                        addOverall = TRUE) # 增加overall列print(tab4, nonnormal = nonvar, exact = "extent")# strata表示分层,指定需要分层的变量,这里我们指定status变量# 通过vars参数指定哪些变量是基线表中需要汇总的变量。# 通过factorVars参数指定哪些变量是分类变量# data参数指定变量的数据来源

可以看到overall列添加成功了。

10. 输出基线特征表

到了这一步,R中基线特征表就基本绘制完成了。接下来就要将表格导出到Excel中进行调整,然后导入到Word中绘制三线表。

简单粗暴的方法:就是复制粘贴,使用quote = TRUE显示引号,使用noSpaces = TRUE删除用于在R控制台中对齐文本的空格,然后直接复制基线表整个内容并将其粘贴到Excel电子表格即可。

print(tab4, # 前面的tab4对象      nonnormal = nonvar, # 指定非正态分布变量      exact = "extent", # 指定哪些变量需要使用fisher精确检验      quote = TRUE,  # 显示引号      noSpaces = TRUE) # 删除用于在R控制台中对齐文本的空格

另一种方式:如果您不喜欢复制和粘贴,则可以通过以下方式自动导出。

tab4Mat "extent",                  quote = FALSE, # 不显示引号                 noSpaces = TRUE, # 删除用于在R控制台中对齐文本的空格                 printToggle = FALSE)

## 保存为 CSV 格式文件,并命名为 myTable。write.csv(tab4Mat, file = "myTable.csv")

注意quote参数选FALSE,noSpaces参数可选TRUE。


基本和前面的举例差不多了,在自己微调下数据就行。

11. 后续

仅输出分类变量

tab3$CatTable

仅输出连续变量

print(tab3$ContTable, nonnormal = nonvar)

12. CreateTableOne()函数

CreateTableOne()是创建基线特征表的函数,可以汇总所有基线变量信息(包括连续变量和分类变量),并可按一个变量或多个变量进行分层汇总,并进行统计检验。

CreateTableOne(vars, strata, data, factorVars,  includeNA = FALSE,  test = TRUE,  testApprox = chisq.test,  argsApprox = list(correct = TRUE),  testExact = fisher.test,  argsExact = list(workspace = 2 * 10^5),  testNormal = oneway.test,  argsNormal = list(var.equal = TRUE),  testNonNormal = kruskal.test,  argsNonNormal = list(NULL),  smd = TRUE, addOverall = FALSE)

函数参数解释说明vars  # 字符向量;指定哪些变量是基线特征表需要汇总的变量# 数据集中的因子视为分类变量,数字型变量视为连续变量# vars参数为空,则指定数据集中所有变量进行汇总

strata # 字符向量;指定分组汇总的变量,为空则进行单组汇总(也就是Overall列)data  # 变量来源的数据集名称,所有汇总变量都要在数据集里面factorVars # 字符向量;指定哪些变量为分类变量,指定的变量应是vars参数中的变量includeNA = FALSE # 逻辑词;为TRUE则将缺失值作为因子处理,仅对分类变量有效

test = TRUE # 逻辑词;默认为TRUE,当有2个或多个组时,自动进行组间比较testApprox = chisq.test # 默认卡方检验;当分类变量的单元格期望值较低(如<5)时,不建议使用argsApprox = list(correct = TRUE) # 进行chisq.test的连续校正。

testExact = fisher.test # 进行精确检验的函数,默认为fisher.test。argsExact = list(workspace = 2*10^5) # 指定fisher.test分配的内存空间

testNormal = oneway.test # 连续变量为正态分布进行的检验# 默认为oneway.test,两组时相当于t检验argsNormal = list(var.equal = TRUE) # 假设为等方差分析

testNonNormal = kruskal.test # 连续变量为非正态分布变量进行的检验,非参数检验# 默认为Kruskal-Wallis秩和检验# 当只有两个组时,与wilcox.test(Man-Whitney U检验)等效argsNonNormal = list(NULL) #传递给testNonNormal中指定的函数的参数的命名列表# 默认list(NULL),它只是一个占位符

smd = TRUE # 默认为TRUE;当有两个以上的组时,则将自动计算组间比较的标准化均值差addOverall = FALSE # 仅在分组汇总中使用,将overall列添加到基线表中# smd和p值仅在分组汇总中使用。

参考资料:tableone包帮助文件

课程推荐

多点好看,少点脱发

t分布表精确完整图_如何快速绘制临床论文基线特征表相关推荐

  1. R语言使用compareGroups包绘制分组患者基线信息表实战:基于survival包lung数据集

    R语言使用compareGroups包绘制分组患者基线信息表实战:基于survival包lung数据集 目录 R语言使

  2. activiti表单设计器_基于Vue,ElementUI开发的一款表单设计器

    介绍 基于Vue,ElementUI开发的一款表单设计器,提高表单开发效率的利器,让开发者从枯燥的表单代码编写中解放出来 工具地址: http://tools.xiaoyaoji.cn/form Gi ...

  3. r语言绘制雷达图_用r绘制雷达蜘蛛图

    r语言绘制雷达图 I've tried several different types of NBA analytical articles within my readership who are ...

  4. 提交日期表单状态操作_奇怪的知识又增加了,表单还能查寝?

    Hi,胖友们,大家好!好久不见呀,最近表姐在刷微博时,无意间发现一位小伙伴神奇的表单用法. 别人都用表单收集数据,登记信息,而这位小伙伴则是用表单来"查寝",看了他的讲解,表姐不禁 ...

  5. python 山脊图_纯Python绘制艺术感满满的山脊地图,创意满分

    而今天的文章,我们就来一起基于 Python ,配合颜色与字体的选择搭配,使用简短的代码,就可以创作出艺术海报级别的 山脊地图 . 2 基于ridge_map的山脊地图绘制 我们主要使用 matplo ...

  6. python 山脊图_纯Python绘制满满艺术感的山脊地图

    ❝ 本文示例代码及附件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes❞ 1 简介 下面的这幅图可能很多读者朋友们都看到 ...

  7. hdc mfc 画扇形图_使用echarts绘制条形图和扇形图

    使用echarts绘制条形图和扇形图 简单举例说明下echarts如何绘制条形图和扇形图 代码示例 echarts绘制条形图和扇形图 var mychart1=echarts.init(documen ...

  8. svn注册表编辑器怎么打开_如何在Windows 10上打开注册表编辑器

    svn注册表编辑器怎么打开 Windows and a lot of third-party applications store their settings in the registry. Th ...

  9. python 四象限图_使用matplotlib绘制四象限图

    今天简单研究了一下在python中绘制四象限图的问题,结合前人相关研究成果,绘制出的图效果如下: 绘制这种图的要点是:自己构造新的x轴和y轴,不要用散点图默认的横纵坐标系,并且不要显示原来的横纵坐标系 ...

最新文章

  1. private关键字和构造方法
  2. visual studio 2008 快捷键
  3. python使用scrapy_python使用scrapy发送post请求的坑
  4. 一步一步部署微软工作流解决方案(MWMS)到生产环境
  5. 这份免费AI论文太强了,我肝了!
  6. js图片转二进制流_V8是如何执行一段JS代码的?
  7. 响应程度怎么填写_如何增加直邮营销的响应率?
  8. mysql快捷键设置_MySQL快捷命令
  9. 递归下降分析法的基本思想。_语法分析 | 递归下降分析算法
  10. python装饰器模式带参数_Python装饰器使用实例:验证参数合法性 请教Python 使用装饰器实现单例模式的原理...
  11. pb利用pdf虚拟打印机将datawindow中的内容导出为pdf
  12. zigbee协议栈 任务、事件与轮询机制
  13. 大地高、正高和正常高的区别
  14. win服务器系统无法切换输入法,win8系统中文输入法切换不出来
  15. C# 对目录中的文件名按照数字序号进行排序
  16. 医学图像配准中的深度学习综述论文解读
  17. 阿里云天池大数据:【入门】精灵宝可梦数据集分析
  18. LeetCode·718.最长重复子数组·动态规划
  19. 月份,星期几的英文表示
  20. 苹果数据泄漏:内鬼频出,这是库克的错吗?

热门文章

  1. 无法将输入值传递给JavaScript变量
  2. freecodecamp_freeCodeCamp论坛的未来
  3. 决策报表服务器安装_无服务器流处理如何使决策更加容易
  4. 139_Power BI之某制造企业HR相关数据年度复盘
  5. 校园计算机知识竞赛活动简介,徽县一中计算机爱好者社团成功举办计算机知识竞赛活动...
  6. js获取数组最大值的索引_数组中最大值的返回索引
  7. 基于分位数回归的动态CoVaR计算 案例与代码
  8. 赶紧收藏!非常实用的 30 个 Python 技巧
  9. IIS5、IIS6、IIS7的ASP.net 请求处理过程比较
  10. 参考的datalist分页helper