临床预测模型/机器学习-生存分析支持向量机SVM(survivalsvm)算法学习

文摘   2024-11-05 11:09   日本  

survivalsvm 是一种用于生存分析的支持向量机(SVM)方法,可以在生存数据中预测风险或生存时间。生存分析的任务通常包括评估某些因素对生存时间的影响,处理删失数据,以及构建对个体风险进行排序的模型。survivalsvm 结合了生存分析和机器学习的方法,适用于处理高维数据且能捕捉非线性关系的应用场景,例如基因表达数据、生物标记数据等。

survivalsvm 的主要特点:

  1. 处理删失数据:可以处理右删失数据(即在研究结束时个体尚未发生事件的情况),这是生存分析中一个典型的问题。
  2. 多种生存分析方法:survivalsvm 提供多种核函数(例如线性核、径向基核等)以及不同的生存损失函数,以适应不同的数据特征和需求。
  3. 适用于高维数据:在处理特征数远大于样本数的数据时,survivalsvm 比传统的Cox回归更为有效。

survivalsvm 通常提供四种模型类型:

  1. 线性回归模型(regression):直接使用线性回归函数。
  2. 中心回归模型(vanbelle1):对数据中心化,减少偏差。
  3. 中心和尺度回归模型(vanbelle2):对数据同时进行中心化和缩放处理。
  4. 最小二乘回归模型(hybrid):结合了最小二乘法和SVM的思想。

分析流程

1.导入
rm(list = ls())
library(survival)
library(survivalsvm)
load("data.Rdata")
2.数据预处理
# 把基因数据转置之后跟生存信息整合在一起
# 行为样本,列为生存信息+变量
meta <- meta[,c(1:3)]
head(meta)
#                                ID OS  OS.time
# TCGA-CR-7374-01A TCGA-CR-7374-01A  0 1.000000
# TCGA-CV-A45V-01A TCGA-CV-A45V-01A  1 1.066667
# TCGA-CV-7102-01A TCGA-CV-7102-01A  1 1.866667
# TCGA-MT-A67D-01A TCGA-MT-A67D-01A  0 1.866667
# TCGA-P3-A6T4-01A TCGA-P3-A6T4-01A  1 2.066667
# TCGA-CV-7255-01A TCGA-CV-7255-01A  1 2.133333
identical(rownames(meta),colnames(exprSet))
# [1] TRUE
meta <- cbind(meta,t(exprSet))
head(meta)[1:5,1:5]
#                                ID OS  OS.time    WASH7P AL627309.6
# TCGA-CR-7374-01A TCGA-CR-7374-01A  0 1.000000 0.5808846   3.117962
# TCGA-CV-A45V-01A TCGA-CV-A45V-01A  1 1.066667 1.4177642   6.250413
# TCGA-CV-7102-01A TCGA-CV-7102-01A  1 1.866667 0.6501330   1.219729
# TCGA-MT-A67D-01A TCGA-MT-A67D-01A  0 1.866667 1.2045780   3.038835
# TCGA-P3-A6T4-01A TCGA-P3-A6T4-01A  1 2.066667 1.3470145   3.799571
str(meta)
# 'data.frame': 493 obs. of  18238 variables:
#  $ ID                       : chr  "TCGA-CR-7374-01A" "TCGA-CV-A45V-01A" "TCGA-CV-7102-01A" "TCGA-MT-A67D-01A" ...
#  $ OS                       : int  0 1 1 0 1 1 1 1 1 0 ...
#  $ OS.time                  : num  1 1.07 1.87 1.87 2.07 ...
#  $ WASH7P                   : num  0.581 1.418 0.65 1.205 1.347 ...
#  $ AL627309.6               : num  3.12 6.25 1.22 3.04 3.8 ...
#  $ AL627309.7               : num  3.73 6.38 2.13 2.96 4.43 ...


# 数据分割 7:3,8:2 均可
# 划分是随机的,设置种子数可以让结果复现
set.seed(123)
ind <- sample(1:nrow(meta), size = 0.7*nrow(meta))
train <- meta[ind,]
test <- meta[-ind, ]
3.survivalsvm分析
set.seed(123456)
fit <- survivalsvm(Surv(OS.time, OS) ~ .,
                   data = train[,-c(1)], 
                   type ="vanbelle1"#regression/vanbelle1/vanbelle2/hybrid
                   diff.meth = "makediff1",  # 差分方法
                   gamma.mu = 0.25#核函数参数,
                   opt.meth ="quadprog"#优化方法
                   kernel = "add_kernel")
fit
# survivalsvm result

# Call:
#  survivalsvm(Surv(OS.time, OS) ~ ., data = train[, -c(1)], type = "vanbelle1", diff.meth = "makediff1", gamma.mu = 0.25, opt.meth = "quadprog", kernel = "add_kernel") 

# Survival svm approach                  : vanbelle1 
# Type of Kernel                         : add_kernel 
# Method used to build 1NN differences   : diff1 
# Optimization solver used               : quadprog 
# Number of support vectors retained     : 333 
# survivalsvm version                    : 0.0.5 

Survival svm approach: vanbelle1:使用了 survivalsvm 中的 vanbelle1 方法,这是专为计算生存风险的排序模型类型,不直接预测生存时间,而是对个体进行相对风险的估计和排序。

Type of Kernel: add_kernel:选择了 add_kernel 核函数。这种核函数通过非线性映射来增强模型的表达能力。

Method used to build 1NN differences: diff1:差分方法 diff1(在代码中指定为 makediff1),用于计算每个观测与其最近邻之间的差异。这个差分方法在 vanbelle1 类型的模型中很重要,因为模型需要计算生存时间相近的观测对之间的差异,以构建支持向量。

Optimization solver used: quadprog:使用了 quadprog 作为优化求解器。quadprog 是一种二次规划求解器,适用于正定核矩阵。此求解器在优化过程中要求核矩阵是对称正定的。

Number of support vectors retained: 333:模型中保留了 333 个支持向量。支持向量是数据中对决策边界有显著影响的观测点。在生存分析中,这些支持向量有助于确定样本的相对风险排序。

参数type:如果 type 为 "regression",predicted 返回的是生存时间的预测值。如果 type 为 "vanbelle1"、"vanbelle2" 或 "hybrid",predicted 返回的是相对风险分数,用于对样本进行排序。

预测验证集风险分数
pred.test <- predict(object = fit,newdata = test[,-c(1)])
pred.test
# survivalsvm prediction

# Type of survivalsvm                      : vanbelle1 
# Type of kernel                           : add_kernel 
# Optimization solver used in model        : quadprog 
# Method used to build 1NN differences     : diff1 
# predicted risk ranks                     : 0.69 0.06 -0.03 1.25 -0.86 ...
# survivalsvm version                      : 0.0.5 
pred.test$predicted
#          [,1]       [,2]        [,3]     [,4]       [,5]      [,6]       [,7]
#[1,] 0.6873479 0.05785234 -0.03131869 1.250643 -0.8605844 -0.132737 -0.5757016
#          [,8]      [,9]     [,10]      [,11]     [,12]      [,13]    [,14]     [,15]
#[1,] 0.1251562 0.2261257 0.5613759 0.01300635 0.9762795 -0.9223921 0.282451 0.2952609
#         [,16]    [,17]     [,18]     [,19]    [,20]    [,21]      [,22]      [,23]
#[1,] 0.4513272 1.551965 0.1099892 0.3806088 1.131932 1.222526 -0.1603046 -0.2430107
#         [,24]       [,25]     [,26]     [,27]    [,28]      [,29]     [,30]

得到风险分数后面就是分组/生存分析等一系列的简单分析+可视化啦~

需要提醒的是,为了更好地理解这个算法,建议先学习支持向量机的基础知识。同时要再次强调,没有任何算法工具是绝对最好的,关键在于它是否适合分析者的数据需求。

参考资料:

  1. Improved performance on high-dimensional survival data by application of Survival-SVM. Bioinformatics. 2011 Jan 1;27(1):87-94.
  2. survivalsvm:https://github.com/imbs-hl/survivalsvm https://www.rdocumentation.org/packages/survivalsvm/versions/0.0.5 https://cran.r-project.org/web/packages/survivalsvm/survivalsvm.pdf
  3. 医学和生信笔记/阿越老师:https://mp.weixin.qq.com/s/l3FEo9Ah22ONnpOs57RzGA https://mp.weixin.qq.com/s/lTff5UT4jQ3oNT0VDSrxzg https://mp.weixin.qq.com/s/Eb6ihab87Y3zSc9c7WsCJg
  4. 零基础说科研:https://mp.weixin.qq.com/s/TAkWrEVPiGye_WPJ1u__8g

:若对内容有疑惑或者有发现明确错误的朋友,请联系后台(欢迎交流)。更多内容可关注公众号:生信方舟

- END -


生信方舟
执着医学,热爱科研。站在巨人的肩膀上,学习和整理各种知识。
 最新文章