构建预后模型时,通常先进行单因素Cox分析筛选出关联的变量,再通过Lasso Cox 筛选生存相关特征(排除多重共线性的特征),最后构建Cox多因素回归模型分析预后影响。
###### Lasso + Cox 生存分析模式####
# if (!require("BiocManager", quietly = TRUE))
# install.packages("BiocManager")
#
# BiocManager::install("glmnet")
### 1. 载入数据
# R包glmnet是通过惩罚最大似然法拟合广义线性和类似模型的软件包。
library(glmnet)
library(survival)
data(CoxExample)
class(CoxExample) # [1] "list"
dim(CoxExample$x)
dim(CoxExample$y)
## 加上假基因名,样本名
rownames(CoxExample$x) <- paste0('sample',1:dim(CoxExample$x)[1])
colnames(CoxExample$x) <- paste0('gene',1:dim(CoxExample$x)[2])
rownames(CoxExample$y) <- paste0('sample',1:dim(CoxExample$x)[1])
head(CoxExample$x) # 行:患者/样本,列:特征,可以是特征基因的表达谱
head(CoxExample$y) # 生存数据,行:患者/样本,列:time, status
# CoxExample$y 中 0=alive,1=dead
### 2. Lasso Cox模型
fit = glmnet(CoxExample$x,CoxExample$y,
alpha = 1,family = "cox")
## alpha = 1,用于变量选择,去除系数为零的变量
## lambda =0, 没有正则项,等于coxph_fit
plot(fit,xvar= 'lambda',label = TRUE)
## 交叉验证
# 默认 nfolds = 10
cvfit <- cv.glmnet(CoxExample$x,CoxExample$y,
alpha = 1,family = "cox")
# type.measure :deviance
# cvfit <- cv.glmnet(CoxExample$x,CoxExample$y,
# alpha = 1,family = "cox",
# type.measure= "C")
plot(cvfit)
### 3. 筛选特征
coefficient <- coef(cvfit, s= cvfit$lambda.min)
selected_index <- which(as.numeric(coefficient) != 0)
selected_features <- names(coefficient[selected_index,])
### 4. 预测生存时间
predict(cvfit, newx = CoxExample$x[1:10, ],
type = "response")
# type:“link”, “response”, “coefficients”, “nonzero”其中的一个
### 5. 计算risk score
# 一般选择risk score计算公式
risk_score <- apply(CoxExample$x[1:10,selected_features],1,
function(x) sum(x*coefficient[selected_index,]))
# sum(CoxExample$x[10,selected_features]*coefficient[selected_index,])
参考: