R语言之列线图的绘制应用

2019-07-31 09:51:11 浏览数 (1)

线图(AlignmentDiagram),又称诺莫图(Nomogram图),它是建立在多因素回归分析的基础上,将多个预测指标进行整合,然后采用带有刻度的线段,按照一定的比例绘制在同一平面上,从而用以表达预测模型中各个变量之间的相互关系。其优势在于可以直接利用图形推算出某变量的取值,如患者的指标得分或生存概率等。它在医学领域中的应用由来已久,常见的有百分位列线图和概率列线图等。百分位列线图是确定个体某指标的测量值在总体中的百分位数;概率列线图是确定某个体特定事件的发生概率,该特定事件可以是疾病的发生、复发以及预后(如死亡)等,往往由多因素二分类回归或COX比例风险模型求得。列线图是回归方程结果的可视化,常用于逻辑回归或COX回归的结果展示,依据回归的结果,按照特定的比例画出多个线段,通过做图能够便捷地推算出某个体的发病风险或生存概率。

列线图在制作之前需要对预测模型的预测结果进行验证,常见的验证过程有内部验证和外部验证。内部验证是指采用建模的数据去验证模型的预测效果,可采用Bootstrap自抽样法或交叉验证的方法。Bootstrap自抽样法是在研究样本中进行有放回的抽样,然后使用抽得的样本进行计算。交叉验证是指将研究对象随机分为多段,然后交叉使用上述数据进行建模和验证。外部验证是使用另外一组研究对象的数据(即外部数据)去验证模型的预测准确性。因此在列线图的制作上,不能盲目地建立某个指标的列线图,只有当模型的预测效果得到了明确验证之后,方可对模型制作列线图,此时该列线图也会有很好的应用价值。(摘自临床研究方法学园地)

接下来我们介绍在R语言中如何绘制以及分析列线图结果,前期的验证我们就不再赘述了,方法有很多。

首先我们导入需要的R包rms。我们以逻辑回归为例绘制列线图。接下来我们看下其中主要的函数:

datadist将数据转化成rms包识别的数据格式

nomogram构建列线图绘制数据

其中的fun参数的主要是进行Logistic分布的随机化。常用的有plogis或者自己编写函数公式。

参数lp用于对坐标轴的重构,如果为False

下面是具体的示例程序:

library(rms)

library(survival)

data(lung,package = "survival")#获取lung数据集

查看lung数据集的情况

lung$sex <- factor(lung$sex,levels =c(1,2),labels = c("male", "female"))#对性别添加标签

dd=datadist(lung)#对数据进行打包

打包结果如下:

第一部分,我们构建逻辑回归模型,并绘制其列线图

lg<- lrm(status~ age sex, data = lung)

nom <- nomogram(lg, fun=function(x)1/(1 exp(-x)), lp=F, funlabel="Risk")

plot(nom)

结果如图:

对于上图的结果分析:比如我们想看男性70岁的一个风险情况,首先我们在points坐标轴找到对应的男性,70岁的值,分别是65,70。然后加和为135.然后从Total Points找到135的位置对应的风险概率,也就是约为0.83。

第二部分构建COX模型:

# 绘制COX回归中位生存时间的Nomogram图

ff<- psm(Surv(time,status) ~ age sex,data = lung, dist='lognormal')

med <- Quantile(ff) # 计算中位生存时间

surv <- Survival(ff) # 构建生存概率函数

nom <- nomogram(ff, fun=function(x)med(lp=x), funlabel="Median Survival Time")

plot(nom)

# 绘制COX回归生存概率的Nomogram图

# 注意lung数据的time是以”天“为单位

nom <- nomogram(ff,fun=list(function(x) surv(365, x),function(x) surv(730, x)),funlabel=c("1-yearSurvival Probability","2-year Survival Probability"))

plot(nom)

结果如图

以上的结果分析我们不一一介绍了,基本的原理是一样的。

最后进行校正曲线绘制

## 参数说明:

## 绘制校正曲线前需要在模型函数中添加参数x=T, y=T,详细参考帮助

## u需要与之前模型中定义好的time.inc一致,即365或730;

## m要根据样本量来确定,由于标准曲线一般将所有样本分为3组(在图中显示3个点)

## 而m代表每组的样本量数,因此m*3应该等于或近似等于样本量;

## B代表最大再抽样的样本量

ff1 <-psm(Surv(time,status) ~ age sex, data = lung, x=T, y=T, dist='lognormal')

## 构建校正曲线

cal1<- calibrate(ff1, cmethod='KM', method="boot", u=365, m=76, B=228)

## 绘制校正曲线

par(mar=c(8,5,3,2),cex = 1.0)

plot(cal1,lwd=2,lty=1,

errbar.col=c(rgb(0,118,192,maxColorValue=255)),

xlim=c(0.25,0.6),ylim=c(0.15,0.70),

xlab="Nomogram-Predicted Probability of 1-Year DFS",

ylab="Actual 1-Year DFS (proportion)",

col=c(rgb(192,98,83,maxColorValue=255)))

至此列线图除了前期的验证过程,后期的分析全部结束。

0 人点赞