楼主: 段湘杰
6734 1

[学习分享] R语言统计与绘图:手把手教你画临床论文基线特征表 [推广有奖]

  • 0关注
  • 1粉丝

本科生

24%

还不是VIP/贵宾

-

威望
0
论坛币
322 个
通用积分
31.4422
学术水平
15 点
热心指数
15 点
信用等级
15 点
经验
170 点
帖子
23
精华
0
在线时间
111 小时
注册时间
2018-6-15
最后登录
2023-6-25

楼主
段湘杰 学生认证  发表于 2020-3-27 22:49:17 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

来源:R语言统计与绘图 公众号,更多精彩内容,欢迎关注!

前言

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

需要用到tableone包。

tableone包是用来创建“表1”(也就是生物医学研究论文中常见的的患者基线特征表),可以在一张表中汇总连续变量和分类变量。

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

下载和加载R包

install.packages("tableone")  # 安装包
library(tableone) # 加载包

加载数据集

library(survival)  # 使用survival包的colon数据
data(colon) # 加载数据集

数据集介绍双击这里

单组汇总

CreateTableOne(data = colon)  # 汇总摘要整个数据集


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

分类变量转换

大多数分类变量是用数字编码的,常表示为0、1和2等,因此我们要么在数据集中将其转换为因子,要么是使用factorVars参数进行转换。

通过vars参数指定哪些变量是需要汇总的变量,排除无关变量。

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"是分类变量。

指定需要汇总的变量

myVars <- c("rx", "sex", "age", "obstruct", "perfor", "adhere", 
            "nodes", "status", "differ", "extent", "surg", "node4", "time", 
            "etype")

指定哪些是分类变量

catVars <- c("rx", "sex","obstruct", "perfor", "adhere", "status",
             "differ","extent", "surg", "node4","etype")

优化单组汇总表

tab2 <- CreateTableOne(vars = myVars, data = colon, factorVars = catVars)
tab2

从这里可以看出,经过指定分类变量后,结果显示比前面好很多。

二分类变量总结为第二水平的计数和百分比,比如分类变量为01,则显示1的结果;如果为分类变量为3或以上,则总结所有水平数据。

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

print(tab2, showAllLevels = TRUE)

注意:百分比是在排除缺失值后计算的。

显示所有数据信息

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

summary(tab2)

连续变量数据

分类变量数据

总结非正态分布变量

在本数据集中,连续变量都表示为均数+标准差,认为连续变量呈正态分布。但是实际上有些数据呈非正态分布,需要用中位数(四分位数)表示。

那么怎么做呢?

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

nonvar <- c("time","nodes")
print(tab2, nonnormal = nonvar)

可以看出"time""nodes"都用中位数(四分位数)表示了。

如果输入nonnormal = TRUE,则所有变量都按非正态分布处理。
微调表格查看此函数。

?print.TableOne 

多组总结

通常,我们需要对数据集进行分组进行汇总。

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

tab3 <- CreateTableOne(vars = myVars, strata = "status" , data = colon, factorVars = catVars)
tab3

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

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

别急,后面进行调整。

统计检验

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

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

当然,你也许会担心呈非正态分布的连续变量,分类变量中的小单元格计数。这些变量的统计检验有所区别。

在这种情况下,你可以在print()函数中像前面那样使用非正态参数,或使用fisher精确检验。

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

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

要使用标准化均值差异,使用smd选项。

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

print(tab3, nonnormal = nonvar, exact = "extent", smd = TRUE)

添加overall列

CreateTableOne()函数中使用addOverall = TRUE

tab4 <- CreateTableOne(vars = myVars, strata = "status" , data = colon, factorVars = catVars, addOverall = TRUE)
print(tab4, nonnormal = nonvar, exact = "extent", smd = TRUE)

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

输出表格

到了这一步,就要将表格导出到Excel以进行编辑,然后导出到Word(临床医学期刊通常不提供LaTeX提交)。

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

粘贴后,单击小的粘贴图标以选择“使用文本导入向导…”,在对话框中,您只需单击“完成”即可将值放入相应的单元格中。

然后,您可以根据需要编辑或重新对齐内容。我通常将组摘要居中对齐,然后将p值右对齐。

print(tab3, nonnormal = nonvar, exact = "extent", quote = TRUE, noSpaces = TRUE)

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

tab4Mat <- print(tab4, nonnormal = nonvar, exact = "extent", quote = FALSE, noSpaces = TRUE, printToggle = FALSE)
## 保存为 CSV 格式文件
write.csv(tab4Mat, file = "myTable.csv")

注意:请不要使用quote参数,noSpaces参数还是可选的。

后续

仅输出分类变量

tab3$CatTable

仅输出连续变量

print(tab3$ContTable, nonnormal = nonvar)

CreateTableOne()函数

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

CreateTableOne(
  vars,  # 字符向量,指定哪些变量是需要总结的变量,因子视为分类变量,数字变量视为连续变量,为空,则指定数据集中所有变量进行总结
  strata, # 字符向量,指定分组总结的变量,为空,则进行单组总结
  data,  # 数据集名称,所有汇总变量都要在数据集中
  factorVars, # 字符向量,指定哪些变量为分类变量,指定的变量应是vars中的变量。
  includeNA = FALSE, # 逻辑词,为TRUE,则将缺失值作为因子处理,而不是省略作为缺失值,仅对分类变量有效
  test = TRUE, # 逻辑词,默认为TRUE,当有2个或多个组时,进行组间比较
  testApprox = chisq.test, # 大样本近似检验,默认为卡方检验,当某些单元格的数量较少(如少于5个)时,不建议使用此方法。
  argsApprox = list(correct = TRUE), # 传递给testApprox中指定函数的参数的命名列表。默认值为list(correct = TRUE),进行chisq.test的连续性校正。
  testExact = fisher.test, #  进行精确检验的函数,默认为fisher.test。
  argsExact = list(workspace = 2 * 10^5), # 传递给testExact中指定的函数的参数的命名列表。默认值为list(workspace = 2 * 10 ^ 5),指定为fisher.test分配的内存空间。
  testNormal = oneway.test, # 基于正态分布假设的检验,默认为oneway.test,两组时相当于t检验
  argsNormal = list(var.equal = TRUE),# 传递给testNormal中指定函数的参数的命名列表。默认值为list(var.equal = TRUE),假设各组之间均值相等的普通方差分析。
  testNonNormal = kruskal.test, # 非参数检验的函数。默认值为kruskal.test(Kruskal-Wallis秩和检验)。当只有两个组时,等效于wilcox.test(Man-Whitney U检验)。
  argsNonNormal = list(NULL), #传递给testNonNormal中指定的函数的参数的命名列表。 默认值为list(NULL),它只是一个占位符。
  smd = TRUE, # 如果为TRUE(如默认值)并且有两个以上的组,则将计算所有成对比较的标准化均值差。
  addOverall = FALSE) # 可选,仅在分组总结中使用,将overall列添加到基线表中,smd和p值仅在分组总结中使用。

End

来源:R语言统计与绘图 公众号,更多精彩内容,欢迎关注!

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝


已有 2 人评分经验 论坛币 收起 理由
oliyiyi + 100 精彩帖子
cheetahfly + 20 观点有启发

总评分: 经验 + 100  论坛币 + 20   查看全部评分

公众号:R语言统计与绘图。

沙发
oliyiyi 发表于 2020-9-9 10:27:30
谢谢分享

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-2-7 22:18