CoxBoost 是一种用于生存分析的统计和机器学习方法,特别适合处理高维数据(例如基因组数据)中的 Cox 回归模型。它将 Cox 比例风险模型(Cox Proportional Hazards Model)与 Boosting(提升)算法结合,用来在大量特征(变量)和相对较少样本的数据集中进行生存时间预测和变量筛选。
这里需要提一下,高维数据的概念,通常来说特征(变量)远大于观测数量(样本)的就是高维数据(比如:测序数据)。
目前笔者所了解到的高低维度数据的界定没有严格的标准,如果变量数不多比如在10-100之间,样本量又很多远超变量数那就可以看做是低维数据(如果这里的概念有明确错误的话请尽管批评指正)。
低维度数据通常使用常规的算法构建的模型就可具有良好的可解释性,而高维度数据是可以用常规算法去进行分析,但通常建议使用更加“强大”的工具,比如Coxboost。
通常而言如果协变量对发生事件的特定风险有影响的时候,那么忽略协变量的方式其实是不可取的。
有一种方法是构建多个COX比例风险模型并结合解释(保护/危害因素),但在低维度数据中,通过累积发生函数(Cumulative Incidence Function, CIF)对两个特定原因的模型结合进行综合解释已经是有难度了,那么在高维度数据中通过这种方法去解释就更加麻烦(可以通过CIF自行探索)。
Fine 和 Gray(1999)提出了一个适用于竞争风险情境的亚分布风险模型(Subdistribution Hazard Model),通过对CIF建模,来描述特定事件在有竞争风险时的累积发生概率。该模型中的亚分布风险与 CIF 直接相关,因此只需为感兴趣的事件拟合一个模型即可。相比之下,传统的特定原因风险模型(Cause-specific Hazard Model)与 CIF 没有直接关系,无法准确反映在竞争风险下的累积发生概率。
累积发生函数(CIF)是什么?
亚分布风险(Subdistribution Hazard)与 CIF 的关系
特定原因风险(Cause-specific Hazard)与 CIF 的关系
开发者使用一种改进的Boosting方法来适应高维数据的比例亚分布风险模型,这种方法基于Fine和Gray醍醐的加权似然,能够更好的识别出具有价值的变量。
预测误差曲线(即真实与预测累积发生函数之间的均方差)在单一事件类型的时间-事件分析中已被广泛应用,通过 bootstrap .632+ 技术可以估计预测误差,而无需预留测试集。
Cox 回归模型
Boosting 算法
高维数据适用性
CoxBoost 的主要功能
rm(list = ls())
library(CoxBoost)
load("data.Rdata")
# 把基因数据转置之后跟生存信息整合在一起
# 行为样本,列为生存信息+变量
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, ]
在 CoxBoost 模型中,penalty 和 stepno 是控制模型复杂性、选择变量、避免过拟合的两个重要参数,尤其是在高维数据中(即变量数量远多于样本数量的情况)。以下是它们在模型中的重要性和作用:
1. penalty(惩罚参数)的重要性
penalty 参数决定了模型在每次 Boosting 迭代时对变量系数更新的强度,即对每个变量进行惩罚的力度。惩罚越大,模型会更倾向于将变量的系数缩小到零,从而使模型更加稀疏。
2. stepno(Boosting步数)的重要性
stepno 决定了模型迭代的步数,即 Boosting 过程中的更新次数。Boosting 的每一步都会选择一个变量并更新其系数,随着步数的增加,模型会逐渐拟合训练数据中的模式。
penalty 和 stepno 的相互作用
确定最佳penalty值
# 输入矩阵哦~
dat <- as.matrix(train[,-c(1:3)])
penalty <- optimCoxBoostPenalty(time = train$OS.time,
status = train$OS,
x = dat,
trace = T,
parallel = T)
penalty$penalty
# [1] 2556
确定最佳stepno值
# 输入矩阵哦~
# dat <- as.matrix(train[,-c(1:3)])
stepno <- cv.CoxBoost(time = train$OS.time,
status = train$OS,
x = dat,
maxstepno = 500,
K = 10,# 交叉验证的折数
type = "verweij", # Verweij 和 van Houwelingen 方法
penalty = penalty$penalty,
multicore = 4
)
stepno$optimal.step
#[1] 79
构建CoxBoost模型
set.seed(123)
fit <- CoxBoost(time = train$OS.time,
status = train$OS,
x = dat, # 要确认一下输入的矩阵情况哦
stepno = stepno$optimal.step, #重采样次数
#maxstepno = 200, # Boosting最大步数
#multicore = T, # 多核运行
#stratnotinfocus = 0, #等于0的样本不会被用于模型拟合
penalty = penalty$penalty #惩罚参数用于控制模型复杂度
#criterion = "hscore",
#unpen.index = NULL # 所有变量都使用惩罚
)
# summary(fit)提取关键变量
summary(fit)
# 79 boosting steps resulting in 29 non-zero coefficients
# partial log-likelihood: -662.5563
#
# parameter estimates > 0:
# TMCO1, TBCK, SNX14, RPL12, TPP1, NAT10, AC090589.1, TMEM223, EMC4, CCDC32, RSL24D1, SEC11A, DNAJA2, LINC02128, NOB1, NUDT7
# parameter estimates < 0:
# PIK3C2B, CELSR3, IMPG2, SPINK6, CPNE5, CUL9, FGD3, MS4A1, CATSPERB, PITPNM3, ZNF266, NIBAN3, AC118344.4
# plot
pdf("CoxBoost.pdf",width = 9,height = 7)
plot(fit)
dev.off()
Boosting步数和非零系数数量
部分对数似然值(Partial Log-Likelihood)
正参数估计(Parameter Estimates > 0)
负参数估计(Parameter Estimates < 0)
这里就可以提取summary(fit)中不为0的变量后续再进行其他算法的联合分析~ 如果不进行后续的分析,也可以直接预测风险分数。
# 输入矩阵哦~
data <- as.matrix(test[,-c(1:3)])
# predict
verify <- predict(fit,
newdata = data,
newtime = test$OS.time,
newstatus = test$OS,
type = "logplik") # lp
verify
# [1] -306.3869
pred.train <- predict(fit, newdata = dat) # lp
head(pred.train)[,1:5]
# [1] -0.90537999 -0.07241175 0.74893233 0.52619319 -0.36423249
pred.test <- predict(fit, newdata = data) # lp
head(pred.test)[,1:5]
# [1] -0.19091011 0.32812666 0.32118698 0.13696966 -0.03886175
type = "logplik"
type = "lp"
# 这里丢失了样本信息
# 笔者结合了各大up主的内容来看,这里是跟样本顺序一致的。
RS_train = t(pred.train)
head(RS_train)
# [,1]
# [1,] -0.90537999
# [2,] -0.07241175
# [3,] 0.74893233
# [4,] 0.52619319
# [5,] -0.36423249
# [6,] -0.21650543
RS_test = t(pred.test)
head(RS_test)
# [,1]
# [1,] -0.19091011
# [2,] 0.32812666
# [3,] 0.32118698
# [4,] 0.13696966
# [5,] -0.03886175
# [6,] 0.03699118
得到了风险分数后续就很好办了~
注:若对内容有疑惑或者有发现明确错误的朋友,请联系后台(欢迎交流)。更多内容可关注公众号:生信方舟
- END -
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。