前几天演示了如何使用purrr
进行回归模型的亚组分析及森林图绘制:
本来找了好久没找到可以实现这个功能的R包,都打算自己写个包了,没想到这几天找到了!
完美实现COX回归和logistic回归的亚组分析,除此之外,还支持svyglm
、svycoxph
的结果,并且数据结果可直接用于绘制森林图,连NA
和各种空行都给你准备好了!
包的名字叫jstable
,直达网址:https://jinseob2kim.github.io/jstable/
这个包除了亚组分析外,还有其他很多函数,大家自己探索即可,我这里就演示下如何进行亚组分析!
install.packages("jstable")
## From github: latest version
remotes::install_github('jinseob2kim/jstable')
library(jstable)
还是使用上次演示的数据。
使用survival
包中的colon
数据集用于演示,这是一份关于结肠癌患者的生存数据,共有1858行,16列,共分为3个组,1个观察组+2个治疗组,观察他们发生终点事件的差异。
各变量的解释如下:
rm(list = ls())
library(survival)
str(colon)
可以使用cox回归探索危险因素。分类变量需要变为因子型,这样在进行回归时会自动进行哑变量设置。
为了演示,我们只选择Obs
组和Lev+5FU
组的患者,所有的分类变量都变为factor,把年龄也变为分类变量并变成factor。
suppressMessages(library(tidyverse))
df <- colon %>%
mutate(rx=as.numeric(rx)) %>%
filter(etype == 1, !rx == 2) %>% #rx %in% c("Obs","Lev+5FU"),
select(time, status,rx, sex, age,obstruct,perfor,adhere,differ,extent,surg,node4) %>%
mutate(sex=factor(sex, levels=c(0,1),labels=c("female","male")),
age=ifelse(age >65,">65","<=65"),
age=factor(age, levels=c(">65","<=65")),
obstruct=factor(obstruct, levels=c(0,1),labels=c("No","Yes")),
perfor=factor(perfor, levels=c(0,1),labels=c("No","Yes")),
adhere=factor(adhere, levels=c(0,1),labels=c("No","Yes")),
differ=factor(differ, levels=c(1,2,3),labels=c("well","moderate","poor")),
extent=factor(extent, levels=c(1,2,3,4),
labels=c("submucosa","muscle","serosa","contiguous")),
surg=factor(surg, levels=c(0,1),labels=c("short","long")),
node4=factor(node4, levels=c(0,1),labels=c("No","Yes")),
rx=ifelse(rx==3,0,1),
rx=factor(rx,levels=c(0,1))
)
str(df)
使用jstable
,只要1行代码即可!!!
library(jstable)
res <- TableSubgroupMultiCox(
# 指定公式
formula = Surv(time, status) ~ rx,
# 指定哪些变量有亚组
var_subgroups = c("sex","age","obstruct","perfor","adhere",
"differ","extent","surg","node4"),
data = df #指定你的数据
)
res
直接就得出了结果!除了亚组分析的各种结果,还给出了交互作用的P值!
这个结果不需要另存为csv也能直接使用(除非你是细节控,需要修改各种大小写等信息),当然如果你需要HR(95%CI)
这种信息,还是需要自己添加一下的。
我们添加个空列用于显示可信区间,并把不想显示的NA
去掉即可,还需要把P值,可信区间这些列变为数值型。
plot_df <- res
plot_df[,c(2,3,9)][is.na(plot_df[,c(2,3,9)])] <- " "
plot_df$` ` <- paste(rep(" ", nrow(plot_df)), collapse = " ")
plot_df[,4:6] <- apply(plot_df[,4:6],2,as.numeric)
画图就非常简单!
library(forestploter)
library(grid)
p <- forest(
data = plot_df[,c(1,2,3,11,9)],
lower = plot_df$Lower,
upper = plot_df$Upper,
est = plot_df$`Point Estimate`,
ci_column = 4,
#sizes = (plot_df$estimate+0.001)*0.3,
ref_line = 1,
xlim = c(0.1,4)
)
print(p)
这样就搞定了,真的是非常简单了,省去了大量的步骤。