survivalsvm 是一种用于生存分析的支持向量机(SVM)方法,可以在生存数据中预测风险或生存时间。生存分析的任务通常包括评估某些因素对生存时间的影响,处理删失数据,以及构建对个体风险进行排序的模型。survivalsvm 结合了生存分析和机器学习的方法,适用于处理高维数据且能捕捉非线性关系的应用场景,例如基因表达数据、生物标记数据等。
survivalsvm 的主要特点:
处理删失数据:可以处理右删失数据(即在研究结束时个体尚未发生事件的情况),这是生存分析中一个典型的问题。 多种生存分析方法:survivalsvm 提供多种核函数(例如线性核、径向基核等)以及不同的生存损失函数,以适应不同的数据特征和需求。 适用于高维数据:在处理特征数远大于样本数的数据时,survivalsvm 比传统的Cox回归更为有效。
survivalsvm 通常提供四种模型类型:
线性回归模型(regression):直接使用线性回归函数。 中心回归模型(vanbelle1):对数据中心化,减少偏差。 中心和尺度回归模型(vanbelle2):对数据同时进行中心化和缩放处理。 最小二乘回归模型(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]
得到风险分数后面就是分组/生存分析等一系列的简单分析+可视化啦~
需要提醒的是,为了更好地理解这个算法,建议先学习支持向量机的基础知识。同时要再次强调,没有任何算法工具是绝对最好的,关键在于它是否适合分析者的数据需求。
参考资料:
Improved performance on high-dimensional survival data by application of Survival-SVM. Bioinformatics. 2011 Jan 1;27(1):87-94. 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 医学和生信笔记/阿越老师:https://mp.weixin.qq.com/s/l3FEo9Ah22ONnpOs57RzGA https://mp.weixin.qq.com/s/lTff5UT4jQ3oNT0VDSrxzg https://mp.weixin.qq.com/s/Eb6ihab87Y3zSc9c7WsCJg 零基础说科研:https://mp.weixin.qq.com/s/TAkWrEVPiGye_WPJ1u__8g
注:若对内容有疑惑或者有发现明确错误的朋友,请联系后台(欢迎交流)。更多内容可关注公众号:生信方舟
- END -