生活,有时候就需要些技巧~
使用nomogram
绘制列线图时,有个参数fun,输入计算特定时间点的生存函数,如果是多个时间点的话,则使用列表形式:
If more than one transformation is plotted, put them in a list, e.g.
list(function(x)x/2,function(x)2*x)
.
如计算
surv = Survival(fit) # 生存函数
surv1 = function(x) surv(1*365, lp=x) # 1年生存
surv2 = function(x) surv(3*365, lp=x) # 3年生存
surv3 = function(x) surv(5*365, lp=x) # 5年生存
对应的参数 funlabel 用于设置显示,此时就是:
nomogram(fit, fun = list(surv1, surv2, surv3),
funlabel = c("1-year Survival Probability",
"3-year Survival Probability",
"5-year Survival Probability"),...)
没任何问题,除了...我觉得代码有些高度重复。因为,真正需要改变的仅仅是时间点的值而已,故可以将其作为lapply()
的参数,返回列表即可!
对此,funlabel 比较容易:
times = c(1,3,5)
labels = lapply(times, function(time) paste0(time, "-year Survival Probability"))
难点在于参数 fun,因为其输入是函数对象或函数对象构成的列表:
class(surv1)
[1] "function"
所以需要把paste0
返回的字符串转换为 function 对象,可以使用eval
搭配parse
函数:
func = lapply(times, function(time) eval(parse(text = paste0("function(x) surv(", time, "*365, x)"))))
综上,nomogram
命令改成如下即可:
nomogram(fit, fun = funcs, funlabel = labels,...)
当然,这么做的好处并不仅仅在于装B,而是:
1、设置多个时间点时,可以极大地避免代码冗余
2、可以更方便的设置时间点。如果设置的时间点超出了最长生存时间,就会报错:
Error in approx(fu[s], xseq[s], fat, ties = mean) :
need at least two non-NA values to interpolate
此时,就不需要在代码中寻找并更改N次时间值,只需要修改上示times变量即可!
3、进一步地,lapply
的方式有利于根据输入的生存时间,自行判断时间值的取值范围并作出调整,避免在程序执行中报错!
R系列·往期精彩
R技巧 | 如果一句命令就能解决,为什么还要三句?
R语言 | 如果你再问我怎么安装R包
数据挖掘 | 快速实现生存分析森林图