数据科学与R语言Cook RR语言与统计分析

「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,我感觉无伤大雅,有兴趣的朋友不妨钻研下代码。

上面图形的显示是可以自定义的,之前整过,有机会可以再说说。

上一篇下一篇

猜你喜欢

热点阅读