「r<-ggplot2」生存分析森林图玩法:变量筛选与多模型可视
2019-11-28 本文已影响0人
王诗翔
之前在写 metawho 包的 deft_show()
函数时用到了 forestmodel 包展示元分析模型结果,后面还用到了我发表在 eLife 上的 TIGS 文章中(当时谁能想到呢?)。forestmodel 包还支持常用的一些模型,如 lm、glm 以及 cox,生存分析使用的 Cox 模型是我比较常用的,之前还修过几个bug,最近想做下批量的单变量Cox分析并进行可视化,碰巧记得 forestmodel 这个包支持模型列表,所以又去翻一翻 GitHub 仓库。
变量筛选
发现 GitHub 有个 issue,说这个包的变量筛选功能不起作用(https://github.com/NikNakk/forestmodel/issues/19)。
仔细看了下源代码,问题很简单,已经在我Fork的仓库中修复了,也提交了合并请求,不过这个作者很少上GitHub,CRAN版本都很久没更新了,所以有兴趣的暂时通过我的仓库里安装吧。
remotes::install_github("ShixiangWang/forestmodel")
这里用示例数据演示下变量筛选的效果:
library("forestmodel")
library("survival")
library("dplyr")
pretty_lung <- lung %>%
transmute(time,
status,
Age = age,
Sex = factor(sex, labels = c("Male", "Female")),
ECOG = factor(lung$ph.ecog),
`Meal Cal` = meal.cal)
print(forest_model(coxph(Surv(time, status) ~ ., pretty_lung))
筛选前:
筛选后:
print(forest_model(coxph(Surv(time, status) ~ ., pretty_lung), covariates=c("Age", "Sex")))
多模型可视化
如果进行批量的单变量分析会产生多个模型,前面说了这个包支持可视化,用我之前写 ezcox 包的示例试试看。
library(ezcox)
zz = ezcox(lung, covariates = c("age", "sex", "ph.ecog"), return_models = TRUE)
ml = zz$models$model
forest_model(model_list=ml)
出来一个很奇葩的图:
我稍微看了下源代码,推测可能是惰性求值出了问题,如果我们自己命令模型名字,问题就不存在了。
names(ml) = c("model1", "model2", "model3")
forest_model(model_list=ml)
虽然这样模型区分的很明显,但我想要的是不需要显示模型名字,因为如果做批量分析,显示名字没有意义,只需要说明做的是单变量分析就可以了。
可惜该包不支持,想一想难度不大,自己增加这个功能,引入了 merge_models
选项,默认是 FALSE
,这样也不影响之前的功能。
forest_model(model_list=ml, merge_models = TRUE)
至于上面提到的 bug,我感觉无伤大雅,有兴趣的朋友不妨钻研下代码。
上面图形的显示是可以自定义的,之前整过,有机会可以再说说。