R语言实现Cox回归的K折交叉验证(1)

K折交叉验证:将数据分成K份,K-1份作为训练集,剩余一份作为测试集。可以检验预测模型在新训练集上的预测效果,减少过拟合。

基本方法:

#使用10折验证结果
###方法1
library(survival)
library(riskRegression)
help(package="survival")
library(caret)
library(magrittr)
lung<-na.omit(lung)
str(lung)
lung$status<-ifelse(lung$status==2,1,0)
colnames(lung)
#设置随机种子,使数据分割可重复
set.seed(1)
#设定K和times,生成times*K个新数据
folds <-createMultiFolds(y=lung$status,
                         k=10,
                         times=2)#times参数指的分区数,通俗移动的来说就是2次k折验证
auc_value_test<-as.numeric()
auc_value_train<-as.numeric()
auc_aver<-as.numeric()
cindex_results_train <-as.numeric()
cindex_results_test <-as.numeric()
c_aver<-as.numeric()
#2次k折验证,每次10个结果,共计20个结果
for(i in 1:20){
  train<-lung[ folds[[i]],] 
  test<-lung[-folds[[i]],] 
  model<-coxph(Surv(time,status)~.,
               data=train,x=T)
  #AUC
  mod1<-Score(list(model1=model),
             formula=Surv(time,status)~1,
             data=test,
             metrics="auc",
             times=200)
  mod2<-Score(list(model1=model),
              formula=Surv(time,status)~1,
              data=train,
              metrics="auc",
              times=200)
  aver=(mod1$AUC$score$AUC+mod2$AUC$score$AUC)/2
  auc_aver<-append(auc_aver,as.numeric(aver))
  auc_value_test<-append(auc_value_test,as.numeric(mod1$AUC$score$AUC))
  auc_value_train<-append(auc_value_train,as.numeric(mod2$AUC$score$AUC))
  #C指数
  Cin<-concordance(model,newdata=test)[["concordance"]]
  cindex_results_test<- append(cindex_results_test,as.numeric(Cin))
  Cin_train<-concordance(model,newdata=train)[["concordance"]]
  cindex_results_train<- append(cindex_results_train,as.numeric(Cin_train))
  Aver_c=(Cin+Cin_train)/2
  c_aver=append(c_aver,as.numeric(Aver_c))
}
summary(auc_value_train)
summary(auc_value_test)
summary(auc_aver)
summary(cindex_results_train)
summary(cindex_results_test)
summary(c_aver)

 

### R语言中LASSO-Cox回归实现 #### 使用`glmnet`包拟合LASSO-Cox回归模型 为了在R语言实现LASSO-Cox回归,可以利用`glmnet`包中的功能来处理生存数据分析。该过程涉及准备数据集、设置参数以及评估模型性能。 ```r library(glmnet) library(survival) # 假设已有数据框df, 包含列time(时间), status(状态)和其他协变量columns y <- Surv(df$time, df$status) # 创建Surv对象表示生存数据 x_matrix <- as.matrix(df[, -(which(names(df) %in% c("time", "status")))]) fit_cv_lasso_cox <- cv.glmnet(x = x_matrix, y = y, family = 'cox', alpha = 1) # 设置alpha=1指定LASSO惩罚项 ``` 通过上述代码创建了一个交叉验证版本(`cv.glmnet`)的LASSO-Cox回归模型[^1]。 #### 特征筛选与最佳λ的选择 当完成模型训练之后,可以通过访问`lambda.min`和`lambda.1se`两个属性找到最优的正则化强度λ值: - `lambda.min`: 给定最小均方误差对应的λ。 - `lambda.1se`: 在一个标准误范围内最简单的模型所对应的最大λ。 ```r best_lambda_min <- fit_cv_lasso_cox$lambda.min best_lambda_se <- fit_cv_lasso_cox$lambda.1se cat('Best lambda (min):', best_lambda_min, '\n') cat('Best lambda (1 se rule):', best_lambda_se, '\n') coef(fit_cv_lasso_cox, s = "lambda.1se") # 获取选定λ下非零系数即重要特征 ``` 这一步骤有助于识别哪些预测因子对于患者的存活率有显著影响,并减少过拟合风险[^2]。 #### 可视化C指数及CV路径图 绘制交叉验证过程中不同λ值的表现情况可以帮助理解模型复杂度变化趋势;而计算C指数(C-statistic),类似于ROC曲线下面积(AUC),用于衡量分类器区分能力的好坏程度。 ```r plot(fit_cv_lasso_cox) # 显示平均错误随log(lambda)的变化曲线 preds <- predict(fit_cv_lasso_cox, newx=x_matrix, type='risk', s="lambda.1se") c_index <- survConcordance(Surv(time=df$time, event=df$status) ~ preds)$concordance cat('C-index:', round(c_index, digits = 3)) ``` 以上操作不仅展示了如何构建并优化基于LASSO约束条件下的比例风险模型,还提供了直观的方式去解释结果的有效性和可靠性[^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值