R语言小白绘图系列|第37弹·生存分析中的列线图和校准曲线

文摘   2024-10-08 19:37   德国  

R 语言小白绘图系列

第 37 弹|生存分析中的列线图和校准曲线

1 列线图简介

列线图(Nomogram)是一种统计学工具,广泛应用于医学领域,尤其是临床研究和预测模型中。其目的是通过将复杂的多变量回归模型(如Cox回归、逻辑回归等)结果可视化为一个简单易懂的图形,帮助临床医生或研究人员根据不同的变量值(如年龄、性别、实验室检查结果等)直观地预测个体患者的预后或疾病发生的概率。

1.1 列线图的特点:

  1. 直观性强:列线图通过一系列标尺(通常是分数标尺)将各个变量的影响量化,最终汇总成总分,并通过总分预测患者的风险概率或预后。

  2. 简单易用:列线图使得临床医生无需掌握复杂的统计学知识,就能够根据患者的个体特征快速做出评估。

  3. 多变量整合:能够将多个变量整合到一个图中,展示各自对结局变量的影响,并给出综合的风险预测。

  4. 可用于个体化风险预测:根据不同患者的具体情况,计算个体化的风险评估结果,便于临床决策。

1.2 列线图的常见应用:

  1. 癌症预后评估:列线图常用于预测癌症患者的生存期、复发风险等。
  2. 疾病风险评估:可用于预测个体患某种疾病的风险,如心血管疾病、糖尿病等。
  3. 治疗效果评估:用于评估不同治疗方案下患者的预期效果,帮助选择最优治疗方案。

1.3 列线图的构建步骤:

  1. 构建多变量回归模型:通过Cox回归、逻辑回归等方法,计算出各变量的回归系数。
  2. 量化变量影响:根据回归系数将每个变量的贡献转换为分数,通常用分数标尺表示。
  3. 总分计算:将各变量的分数加总,得出总分。
  4. 风险预测:根据总分和事先建立的校准曲线,预测个体的风险或预后。

列线图通过图形化的方式帮助简化复杂的统计结果,使其在医学临床实践中应用广泛。

1.4 应用实例

如下图,第一行points为分数标尺,为下面每一行的变量进行分数转换。例如,年龄为50对应28分,性别为male对应18分,以此类推;将各变量的分数加总,得出总分total points;图中总分total points行中的数值分别对应下面1-3年生存率;例如,总分若为250,对应的一年生存率为60%,两年生存率为35%,三年生存率为30%。

Nomogram

2 生存分析与列线图结合

生存分析是研究事件发生时间的统计方法,广泛用于医疗领域,尤其是患者的生存期或疾病复发时间的分析中。在构建列线图时,生存分析方法(例如Cox比例风险回归模型)常用于评估不同变量对生存期的影响,并将这些变量纳入列线图中,提供个体化的风险预测。

2.1 Cox比例风险模型简介:

Cox比例风险模型是一种广泛使用的生存分析方法,用于探讨多个预测变量(如年龄、病理因素等)对患者生存时间的影响。该模型能够计算出每个预测变量的风险比(Hazard Ratio),反映变量对事件发生风险的相对影响。
通过Cox回归分析得到的各变量回归系数,可以用于构建列线图,将复杂的回归结果图形化,使临床医生能够方便地评估患者的生存风险。

2.2 列线图结合生存分析的优点:

  • 个性化预后评估:列线图可以整合多种生存分析结果,将个体的多种因素综合评估,提供个性化的预后预测。
  • 可视化风险评估:通过列线图,医生可以直观地看到每个变量对生存结果的影响,并根据患者的具体情况进行风险评估。
  • 易于使用:即使医生对生存分析的具体原理不熟悉,也可以通过列线图进行直观、简便的预后评估,从而提高临床决策效率。

3 校准曲线简介

校准曲线(Calibration Curve)是一种用于评价预测模型准确性的图形工具。它将模型预测的概率与实际观察到的结果进行比较,以判断模型的预测性能。在列线图的使用中,校准曲线尤为重要,因为它可以验证模型在不同风险水平下的预测准确性。

3.1 校准曲线的构建步骤:

  • 模型预测概率:根据列线图或回归模型的输出,计算出个体的风险预测概率(例如,预测患者5年生存率的概率)。
  • 实际观察结果:通过观察实际的生存数据,计算对应的实际生存率。
  • 绘制校准曲线:将模型预测概率与实际观察结果进行比较,并绘制校准曲线。如果校准曲线接近对角线,说明模型的预测结果较为准确。

3.2 校准曲线的重要性:

  • 模型验证:校准曲线可以帮助验证模型的有效性,尤其是在应用到新的患者群体时,确保模型的预测能力稳健。
  • 调整模型:通过校准曲线可以发现模型的偏差,若模型在某些风险段预测不准确,可以通过调整模型参数来提高预测性能。
  • 增强临床应用信心:通过校准曲线,临床医生可以更清晰地理解模型的预测能力,增强使用模型进行临床决策的信心。
Calibration Curve

4 R语言输入源文件

输入文件包括

  • id: 样品名称
  • futime:生存时间,单位为年
  • fustat:生存状态,0代表存活,1代表死亡
  • 其余变量

5 R语言绘制代码

环境准备

这段代码的目的是安装并加载rms包,读取输入文件并设置工作目录。以下是逐行解释:

install.packages("rms")  # 安装rms包
  • 这行代码用于安装rms包,rms包在R中用于回归模型建模、特别是用于生存分析、风险评分和生存曲线绘制。
library(rms)  # 加载rms包
  • 这行代码加载已安装的rms包,使得我们可以使用其中的函数。
inputFile = "input.txt"  # 定义输入文件名
  • 定义一个变量inputFile,指向数据文件input.txt,该文件将被后续代码读取。
setwd("D:\\biowolf\\bioR\\39.Nomo")  # 设置工作目录
  • 这行代码设置工作目录为"D:\\biowolf\\bioR\\39.Nomo",所有读取文件和写入文件的操作将默认在此目录下进行。
rt = read.table(inputFile, header = T, sep = "\t", check.names = F, row.names = 1)  # 读取数据
  • 这行代码使用read.table()函数读取制表符分隔的文本文件input.txt
    • header = T:表示文件的第一行是列名。
    • sep = "\t":指定文件的列是以制表符(\t)分隔的。
    • check.names = F:不检查列名,保持原有列名不被修改。
    • row.names = 1:将第一列作为行名。

总结

这段代码的功能是:

  1. 安装并加载rms包,准备进行回归模型相关的分析。
  2. 设置工作目录,确保文件操作在指定的目录中进行。
  3. input.txt文件中读取数据,并保存在变量rt中供后续分析使用。

数据打包

这段代码的目的是为回归模型准备数据的分布信息(比如中位数、四分位数等)并存储在dd对象中,然后设置全局选项,使得后续的分析可以引用这些数据分布信息。以下是逐行解释:

dd <- datadist(rt)
  • datadist(rt):这个函数来自rms包,它会计算数据框rt中每个变量的分布信息(如中位数、四分位数等),并将这些信息存储在一个datadist对象中。这个对象包含的信息可以在回归模型中用来标准化和调整变量。
  • dd:存储了rt数据的分布信息。该对象将在模型拟合时用作参考,以便进行变量转换、绘图等。
options(datadist = "dd")
  • options(datadist = "dd"):设置全局选项,告诉rms包后续的分析使用刚刚创建的dd对象中存储的变量分布信息。这意味着所有后续的回归模型和绘图都将引用dd中的变量分布数据。

总结

这段代码的作用是生成并存储数据中各变量的分布信息,并设置全局选项,确保在后续的分析中这些分布信息可以被自动引用。这一步通常在回归模型的准备阶段使用,可以帮助更好地处理自变量。

生成函数

这段代码的目的是使用Cox比例风险模型(Cox Proportional Hazards model,cph函数)来拟合生存数据,并生成生存函数。以下是逐行解释:

# 生成Cox比例风险模型
f <- cph(Surv(futime, fustat) ~ Age + Gender + Grade + T + M + N + VCAN, x = T, y = T, surv = T, data = rt, time.inc = 1)
  • cph()rms 包中的函数,用于拟合Cox比例风险模型。它与 survival 包中的 coxph 类似,但提供了更多功能,特别是在模型预测和图形化输出方面。

  • Surv(futime, fustat)Surv函数创建了一个生存对象,用来表示生存时间(futime)和生存状态(fustat,通常1表示事件发生,0表示未发生)。

  • ~ Age + Gender + Grade + T + M + N + VCAN:这些是模型中的自变量,包括年龄(Age)、性别(Gender)、病理分级(Grade)、TNM分期中的T(肿瘤大小)、M(远处转移)、N(淋巴结状态)以及VCAN(感兴趣的基因)。

  • x = T, y = T, surv = T:这些参数表示保存原始数据(x = T),保存响应变量(y = T),并计算生存曲线(surv = T)。

  • data = rt:指定用于模型的数据集是数据框rt

  • time.inc = 1:设置时间增量为1,表示每1个时间单位(通常是年)计算生存率。

surv <- Survival(f)
  • surv <- Survival(f):这个函数生成了一个生存概率函数(Survival function),基于模型f来计算不同时间点的生存概率。通过这个函数,可以生成给定自变量下的生存曲线。

总结

这段代码的作用是拟合一个Cox比例风险模型,将生存时间与多个变量(年龄、性别、分期等)联系起来,并生成一个生存函数(surv),供后续预测或绘图使用。

建立nomogram

这段代码的目的是生成一个列线图(Nomogram),用于可视化Cox比例风险模型的预测结果,并显示在1年、2年和3年的生存概率。以下是逐行解释:

# 建立列线图(Nomogram)
nom <- nomogram(f, 
                fun = list(function(x) surv(1, x), function(x) surv(2, x), function(x) surv(3, x)),
                lp = F
                funlabel = c("1-year survival""2-year survival""3-year survival"), 
                maxscale = 100
                fun.at = c(0.990.90.80.70.50.30.10.01))

逐行解释:

  1. nomogram(f, ...)

  • 这是rms包中的nomogram()函数,基于Cox比例风险模型f创建一个列线图。列线图是一种工具,它将回归模型的结果可视化,使得模型预测的结果可以通过简单的图形和线性标尺进行读取和解读。
  • fun = list(...)

    • 这个参数传入了一个列表,定义了三个生存函数,每个函数分别计算1年、2年和3年的生存概率。
    • function(x) surv(1, x):这是一个匿名函数,它调用之前生成的surv函数,计算1年的生存概率。同理,surv(2, x)surv(3, x)分别计算2年和3年的生存概率。
  • lp = F

    • lp代表linear predictor(线性预测器)。设置为F表示不显示线性预测器对应的轴。线性预测器是Cox模型中的线性组合部分。
  • funlabel = c("1-year survival", "2-year survival", "3-year survival")

    • 这个参数定义了列线图中三个生存函数的标签,分别为1年、2年和3年的生存率。
  • maxscale = 100

    • 将列线图的最大尺度设定为100分。通常列线图中的变量对总分的贡献用这个最大尺度来衡量。变量的总贡献在尺度上的总和为100分。
  • fun.at = c(0.99, 0.9, 0.8, 0.7, 0.5, 0.3, 0.1, 0.01)

    • 这行代码定义了列线图中的生存概率刻度,将生存率的轴显示在指定的概率点上,比如0.99, 0.9, 0.8等。

    总结

    这段代码的作用是基于之前的Cox比例风险模型f,生成一个列线图。该列线图展示了不同变量(如年龄、性别、分期等)对1年、2年和3年生存率的影响。列线图是一个非常直观的工具,常用于医学领域来预测个体患者的生存概率。

    nomogram可视化

    这段代码的目的是将列线图(Nomogram)可视化并保存为PDF文件。以下是逐行解释:

    pdf(file = "Nomogram.pdf", height = 7, width = 8.5)
    • pdf(file = "Nomogram.pdf", height = 7, width = 8.5):设置输出设备为PDF文件,文件名为"Nomogram.pdf",并指定PDF文件的高度为7英寸,宽度为8.5英寸。此设置会将接下来生成的图像直接保存为PDF文件。
    plot(nom)
    • plot(nom):这行代码绘制之前生成的列线图nomplot()函数会根据nom对象的内容生成图形,并将其显示或输出到当前指定的输出设备(这里是PDF文件)。
    dev.off()
    • dev.off():关闭当前的PDF设备,完成图形的保存。此时,"Nomogram.pdf"文件已经包含绘制好的列线图并保存在指定路径下。

    总结

    这段代码的功能是将列线图保存为PDF文件。图像的大小可以通过heightwidth参数进行调整,生成的PDF文件名为"Nomogram.pdf",包含之前基于Cox模型生成的列线图。

    校准曲线

    这段代码的目的是基于Cox比例风险模型,生成并可视化三年生存率的校准曲线(Calibration curve),并将其保存为PDF文件。以下是逐行解释:

    # calibration curve
    time = 3   # 预测三年生存率的校准曲线
    • 定义变量time为3,表示预测3年的生存率。这个变量用于后续模型的拟合和校准。
    f <- cph(Surv(futime, fustat) ~ Age + Gender + Grade + T + M + N + VCAN, x = T, y = T, surv = T, data = rt, time.inc = time)
    • 使用cph()函数基于Age, Gender, Grade, T, M, NVCAN等变量拟合Cox比例风险模型。
    • Surv(futime, fustat):表示生存时间futime和生存状态fustat
    • x = T, y = T, surv = T:指定保存自变量、因变量和生存信息。
    • time.inc = time:指定时间增量为3年(即预测3年的生存率)。
    cal <- calibrate(f, cmethod = "KM", method = "boot", u = time, m = 100, B = 1000)  # m样品数目为1/3
    • calibrate():生成模型的校准曲线,比较列线图预测的生存概率与实际生存情况之间的差异。
    • cmethod = "KM":使用Kaplan-Meier法计算生存率。
    • method = "boot":使用Bootstrap法进行重采样,评估模型的稳定性和可靠性。
    • u = time:设置校准的时间为3年
    • m = 100:指定样本数目为100,相当于整个样本的三分之一。
    • B = 1000:进行1000次bootstrap抽样,确保校准曲线的稳健性。
    pdf(file = "calibration.pdf", height = 6, width = 7)
    • pdf():将图形输出设备设置为PDF文件,文件名为"calibration.pdf",并指定文件的高度为6英寸,宽度为7英寸。
    plot(cal, xlab = "Nomogram-Predicted Probability of 3-Year OS", ylab = "Actual 3-Year OS (proportion)", col = "red", sub = F)
    • plot(cal, ...):绘制校准曲线。
      • xlab = "Nomogram-Predicted Probability of 3-Year OS":x轴标签为"列线图预测的3年生存概率"。
      • ylab = "Actual 3-Year OS (proportion)":y轴标签为"实际的3年生存率(比例)"。
      • col = "red":将校准曲线的颜色设置为红色。
      • sub = F:不显示子标题。
    dev.off()
    • dev.off():关闭PDF设备,保存校准曲线图。

    总结

    这段代码使用Cox比例风险模型生成了3年生存率的校准曲线。校准曲线用来评估列线图的预测准确性,并将校准结果保存为"calibration.pdf"文件。

    calibration

    本文作者:充电宝团队


    现在:


    长按扫码关注:科研生信充电宝


    10元赞赏本文,即喜欢作者~


    即可直接解锁:


    《R语言小白绘图系列|第37弹·生存分析中的列线图和校准曲线》对应资源哦~


    看到这里你还不心动吗?


    赶紧关注、转发、点赞、分享,领取你的专属福利吧~



    好啦,以上就是今天推文的全部内容啦!


    版权声明:本文内容由互联网用户自发贡献,版权归作者所有,本公众号不拥有所有权,也不承担相关法律责任。

    如果您发现本公众号中有涉嫌抄袭的内容,欢迎发送邮件至:kysxcdb@163.com 进行举报,一经查实,本公众号将立刻删除涉嫌侵权内容。




    科研生信充电宝
    介绍科研;介绍统计;介绍生信;
     最新文章