8.临床预测模型验证——交叉验证/Bootstrap法

发布时间:2024年01月17日

基本概念

交叉验证:

将一定比例的数据挑选出来作为训练集,将其余未选中的样本作为测试集,先在训练集中构建模型,再在测试集中做预测。

内部验证:手动将样本随机分为训练集和测试集,先在训练集中构建模型,再在测试集中进行测试。

常用三种方法:

  1. Hold-Out Method 简单交叉验证;
  2. K-fold Cross Validation (K-CV),K折交叉验证;
  3. ?Leave-One-Out Cross Validation(LOO-CV),留一法交叉验证,N折交叉验证。

简单交叉验证:

将原始的数据随机分成两组,一组作为训练集,一组作为测试集。

K折交叉验证:

将数据随机分为K个子集,对每个子集分别做一次测试集,其余的K-1组子集数据作为训练集,最终得到K个模型,用K个测试集的平均结果作为K-折交叉验证的性能指标。可以有效避免过度拟合及欠拟合状态的发生,最终得到的结果也比较有说服力。

注意:K一般不小于3

N折交叉验证:

假设原始数据有N个样本,每个样本作为测试集,其余的N-1个样本作为训练集,所以得到N个模型,用N个模型的平均结果作为此留一法交叉验证的性能指标。

相较于K折交叉验证,N折交叉验证的优势:

  1. 每次交叉验证,N-1个样本用于训练模型,接近原始数据分布,结果较为可靠;
  2. 在交叉验证过程中,没有随机因素影响最终结果,结果具有重现性。

外部验证:基于内部数据集建模完成之后,其他独立的研究团队开展的相同研究,其数据集作为外部数据的来源,进行模型的验证。

Bootstrap法

Bootstrap法是非参数统计方法,对样本进行重抽样,从而估计总体特征。优点:可以避免交叉验证造成的样本减少问题,也可以用于创造样本随机性。

优点:数据较小,难以有效划分训练集和测试集时效果显著,能从初始数据集中产生多个不同的训练集。

缺点:产生的数据集改变了初始数据集的分布,引入了估计偏差,因此在初始数据集样本量足够时,交叉验证法更常用

具体实操

二分类资料

案例:肺动脉栓塞风险模型

library(readxl)
data <- read_excel("data.xlsx")
data<-na.omit(data)
data<-as.data.frame(data)
data$group<-factor(data$group,levels = c(0,1),labels = c("No","Yes"))

利用最优子集法筛选出来的自变量,age,BMI,Tos,CA153,CDU,Transfusion,stage构建模型

form.bestglm<-as.formula(group~age+BMI+ToS+CA153+CDU+transfusion+stage)

若无具体的公式,也可以进行循环交叉验证及Bootstrap,确定最优的模型公式:

简单交叉验证

设置验证方法

train.control_1 <- trainControl(method="LGOCV",
                                p=0.7,
                                number = 1)

method=“LGOCV”,leave-group out cross-validation,为简单交叉验证。p指定训练集占的比例,这里为70%,number指定简单交叉次数。

set.seed(1)
LogMod1 <- train(form.bestglm, 
                    data=data, 
                    trControl=train.control_1, 
                    method='glm')

LogMod1

train()函数中formula输入公式,data为数据集,trControl指定相应的交叉算法(为上一步定义好的交叉方法),method指定进行广义线性分析

可以发现共有515个样本,7个预测变量,因变量两个水平,no和yes。训练集占70%,1次重复。准确率达到0.87,Kappa值为0.41。结果尚可

显示ROC的结果

train.control_2 <- trainControl(method="LGOCV",
                                p=0.7,
                                number = 1,
                                classProbs=TRUE,
                                summaryFunction=twoClassSummary)
set.seed(1)
LogMod2 <- train(form.bestglm, 
                    data=data, 
                    trControl=train.control_2, 
                    method='glm')
LogMod2 

?classProbs设置为TRUE,summaryFunction设置为twoClassSummary,表示显示ROC结果。

ROC曲线下面积为0.812,灵敏度为0.976,特异度为0.346

K折交叉验证

train.control_3 <- trainControl(method = "cv", 
                                number = 10)
set.seed(1)
LogMod3 <- train(form.bestglm, 
                    data=data, 
                    trControl=train.control_3, 
                    method='glm')
LogMod3
train.control_4 <- trainControl(method = "cv", 
                                number = 10,
                                classProbs=TRUE,
                                summaryFunction=twoClassSummary)
set.seed(1)
LogMod4 <- train(form.bestglm, 
                 data=data, 
                 trControl=train.control_4, 
                 method='glm')
LogMod4

需要将方法设置为cv,number=10,表示10折交叉验证

N折交叉验证

train.control_5 <- trainControl(method = "LOOCV")
LogMod5 <- train(form.bestglm, 
                 data=data, 
                 trControl=train.control_5, 
                 method="glm")
LogMod5
train.control_6 <- trainControl(method = "LOOCV",
                                classProbs=TRUE,
                                summaryFunction=twoClassSummary)
LogMod6 <- train(form.bestglm, 
                 data=data, 
                 trControl=train.control_6, 
                 method="glm")
LogMod6

LOOCV为留一法交叉验证。

Bootstrap交叉验证

train.control_7 <-trainControl(method = "boot",
                               number=1000)

set.seed(1)
LogMod7 <- train(form.bestglm, 
                    data=data, 
                    trControl=train.control_7, 
                    method="glm")
LogMod7

train.control_8 <-trainControl(method = "boot",
                               number=1000,
                               classProbs=TRUE,
                               summaryFunction=twoClassSummary)


set.seed(1)
LogMod8 <- train(form.bestglm, 
                    data=data, 
                    trControl=train.control_8, 
                    method="glm")
LogMod8

文章来源:https://blog.csdn.net/Dr_long1996/article/details/135636828
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。