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)