首页 > 其他分享 >统计小白如何计算各个指标的95%CI以及两个AUC之间的Delong Test

统计小白如何计算各个指标的95%CI以及两个AUC之间的Delong Test

时间:2025-01-21 17:32:36浏览次数:1  
标签:CI AUC TP TN Delong PPV SEN SE

目录

第一部分:计算各个指标的95%CI

指标计算公式

根据论文需要,指标包括AUC(AUC的所有计算见第二部分)、精度ACC、敏感度SEN、特异度SPE、正预测值PPV、负预测值NPV、F1分数
各计算公式如下:
\(\text{ACC} = \frac{TP + TN}{TP + TN + FP + FN}\)

\(\text{SEN} = \frac{TP}{TP + FN}\)

\(\text{SPE} = \frac{TN}{TN + FP}\)

\(\text{PPV} = \frac{TP}{TP + FP}\)

\(\text{NPV} = \frac{TN}{TN + FN}\)

\(\text{F1} = 2 \times \frac{\text{PPV} \times \text{SEN}}{\text{PPV} + \text{SEN}}\)

其中,\(TP=True Positive, TN=True Negative, FP=False Positive, FN=False Negative\)

95%CI计算公式

采用正态近似法(前提是假设数据分别为正态分布,未必都适用哦)
计算公式为\(\hat{p} \pm z_{\frac{\alpha}{2}} \times SE\)
其中:
\(\hat{p}\)为估计值(如ACC等)
\(z_{\frac{\alpha}{2}}\)为标准正态分布的临界值(通常取1.96对应于95%置信区间
\(SE\)为标准误,其计算公式为\(SE = \sqrt{\frac{\hat{p}(1 - \hat{p})}{n}}\),n为样本总数,不同指标的n不同,是计算指标时的分母

计算实现方式

方式1:利用现成的网站

进入网站后,只需要输入True Positive, True Negative, False Positive, False Negative四个变量后点击计算即可。网站1中还需输入\(1-\alpha\)为0.95,网站2中似乎是默认的
网站1:https://www2.ccrb.cuhk.edu.hk/stat/confidence interval/Diagnostic Statistic.htm
网站2:http://vassarstats.net/clin1.html#return
根据我自己的结果,网站1更准确,网站2的95%CI会有点偏差,但是因为其并未给出计算公式,具体原因不得而知
然而,这些网站计算的指标其实是不全的,只包括SEN、SPE、PPV和NPV。如果需要更全指标的结果,可使用下一节的python代码得到

方式2::Python代码实现

代码如下,按照公式计算,与网站1的结果完全一致:

import pandas as pd
import math
import scipy.stats as stats

# 定义计算各项指标及其95%置信区间的函数
def calculate_metrics(TP, TN, FP, FN):
    # 总样本数
    n = TP + TN + FP + FN
    
    # 计算各个指标
    ACC = (TP + TN) / n
    SEN = TP / (TP + FN)
    SPE = TN / (TN + FP)
    PPV = TP / (TP + FP)
    NPV = TN / (TN + FN)
    F1 = 2 * (PPV * SEN) / (PPV + SEN)
    
    # 计算标准误
    SE_ACC = math.sqrt(ACC * (1 - ACC) / n)
    SE_SEN = math.sqrt(SEN * (1 - SEN) / (TP + FN))
    SE_SPE = math.sqrt(SPE * (1 - SPE) / (TN + FP))
    SE_PPV = math.sqrt(PPV * (1 - PPV) / (TP + FP))
    SE_NPV = math.sqrt(NPV * (1 - NPV) / (TN + FN))
    SE_F1 = math.sqrt(F1 * (1 - F1) / n)
    
    # Z值
    z = stats.norm.ppf(0.975)
    
    # 计算95%置信区间
    CI_ACC = (ACC - z * SE_ACC, ACC + z * SE_ACC)
    CI_SEN = (SEN - z * SE_SEN, SEN + z * SE_SEN)
    CI_SPE = (SPE - z * SE_SPE, SPE + z * SE_SPE)
    CI_PPV = (PPV - z * SE_PPV, PPV + z * SE_PPV)
    CI_NPV = (NPV - z * SE_NPV, NPV + z * SE_NPV)
    CI_F1 = (F1 - z * SE_F1, F1 + z * SE_F1)
    
    # 返回结果
    return {
        "ACC": round(ACC, 3),
        "CI_ACC_Lower": round(CI_ACC[0], 3),
        "CI_ACC_Upper": round(CI_ACC[1], 3),
        "SEN": round(SEN, 3),
        "CI_SEN_Lower": round(CI_SEN[0], 3),
        "CI_SEN_Upper": round(CI_SEN[1], 3),
        "SPE": round(SPE, 3),
        "CI_SPE_Lower": round(CI_SPE[0], 3),
        "CI_SPE_Upper": round(CI_SPE[1], 3),
        "PPV": round(PPV, 3),
        "CI_PPV_Lower": round(CI_PPV[0], 3),
        "CI_PPV_Upper": round(CI_PPV[1], 3),
        "NPV": round(NPV, 3),
        "CI_NPV_Lower": round(CI_NPV[0], 3),
        "CI_NPV_Upper": round(CI_NPV[1], 3),
        "F1": round(F1, 3),
        "CI_F1_Lower": round(CI_F1[0], 3),
        "CI_F1_Upper": round(CI_F1[1], 3)
    }

# 示例数据:TP, TN, FP, FN
TP = 64
TN = 101
FP = 14
FN = 13

# 计算指标
metrics = calculate_metrics(TP, TN, FP, FN)

# 创建一个DataFrame用于保存结果
df = pd.DataFrame([metrics])

# 输出为CSV文件
df.to_csv(r'metrics.csv', index=False)

print(df)

第二部分:两个AUC之间的Delong Test

关于AUC及其95%CI的计算,以及两个AUC之间的Delong Test,都是用Medcalc这个软件最方便
关于如何使用Medcalc软件,可参考:https://zhuanlan.zhihu.com/p/76351802
简单介绍如下,可以自己摸索一下:
1、点击File——New,新建一个工作表,把预测概率(或者其他形式,这里指机器学习模型预测各个样本为正样本的概率)和label(ground truth标签)粘贴进来,第一行为列名(以识别对应列的数据),不同列对应于不同模型的结果
2、点击Statistics——ROC curves,如果你只需要算一列结果的AUC,则选择ROC curve analysis;如果需要比较多个AUC,且共用一列的label,则选择Comparison of ROC curves
3、会跳出一个页面,在Variables下选择需要得到AUC的数据列的列名(多个比较则选多个);在Classification Variable下选择label列的列名,并且在其下面的define status里输入你在label列中用什么表示正样本,什么表示负样本
4、在对比ROC曲线时,跳出的页面右侧可以选择使用Delong test还是Hanley & McNeil
5、最后点击OK即可,会跳出结果页面,里面ROC曲线,AUC,其95%CI,两两ROC曲线比较得到的P值,等等,应有尽有

标签:CI,AUC,TP,TN,Delong,PPV,SEN,SE
From: https://www.cnblogs.com/xjl-ultrasound/p/18683811

相关文章

  • TensorFlow手写AlexNet识别10-monkey-species
     In [1]:fromtensorflowimportkerasimporttensorflowastfimportnumpyasnpimportpandasaspdimportmatplotlib.pyplotasplt In [9]:defAlexNet(height=224,width=224,classes=10):input_image=keras.layers.Input(sh......
  • 元强化学习算法—— EMCL —— 《Adapting to Dynamic LEO B5G Systems Meta-Critic L
    原文地址:https://orbilu.uni.lu/bitstream/10993/52996/1/Adapting_to_Dynamic_LEO-B5G_Systems_Meta-Critic_Learning_Based_Efficient_Resource_Scheduling.pdfPS:大概距离这个论文是fake的,无法做验证,其中对引用的算法的描述也是错的,基于一堆错误的东西能搞错对的东......
  • 「CF1101F」Trucks and Cities
    题意描述有\(N\)座城市,第\(i\)座坐标为\(a_i\),有\(M\)辆卡车,第\(i\)辆卡车要从城市\(s_i\)前往城市\(e_i\),每单位长度耗油量为\(c_i\),可以在中途城市加满油\(r_i\)次,求让所有卡车都能到达目的地最小的油箱容积。传送门思考&做法step1先来思考暴力,二分答案......
  • 利用dsp28335的sci模块对esp8266wifi模块进行控制
    利用dsp28335的sci模块对esp8266wifi模块进行控制,将数据发出资源文件列表V1_wifi_send/.ccsproject , 519V1_wifi_send/.cdtbuild , 12372V1_wifi_send/.cdtbuild_initial , 12352V1_wifi_send/.cdtproject , 677V1_wifi_send/.cproject , 21668V1_wifi_send/.la......
  • 国产化板卡设计原理图:2295-基于 JFM7K325T的半高PCIe x4双路万兆光纤收发卡
      基于JFM7K325T的半高PCIex4双路万兆光纤收发卡    一、板卡概述   板卡采用JFM7K325T芯片作为主处理器,可应用于万兆网络、高速数据采集、存储;光纤隔离网闸等领域。      二、功能和技术指标: 板卡功能参数内容......
  • 国产板卡设计原理图:2226-基于JFM7K325T PCIeX8 四路光纤卡
    一、板卡概述     板卡主芯片采用JFM7K325TFPGA,pin_to_pin兼容FPGAXC7K410T-2FFG900,支持8-LanePCIe、64bitDDR3、四路SFP+连接器、四路SATA接口、内嵌16个高速串行收发器RocketIOGTX,软件具有windows驱动。    二、功能和技术指标: 板卡功能参......
  • 2024 (ICPC) Jiangxi Provincial Contest I 题 Neuvillette Circling题解
    简单思路一个圆套中了几个点,如果不断缩小这个圆,那么最终的结果有两种有两个点卡住了这个圆,且这两点一定是直径有三个或者三个以上的点卡住了这个圆,圆心在这三个点围成的三角形的外接圆圆心。因此我们枚举两点作为直径,或者枚举三个点作为圆的内接三角形,求这个三角形的外接圆......
  • relation goes to calmness that is reassuring but not very exciting
    Whenweconfuseassertionwithaggression,neutralizeotherness,adjustourlongings,andreasonawayourhostility,weassembleacalmnessthatisreassuringbutnotveryexciting.StephenMitchellmakesthepointthatthecapacitytocontainaggressionis......
  • 2024 (ICPC) Jiangxi Provincial Contest L 题 Campus 题解
    简单思路首先对于所有的出口求一遍最短路,由于出口只会打开并关闭一次,所以大门的开启状态是相当有限的(最多大概30种),我们对于每一种状态直接暴力求答案最后输出即可。复杂度大概\(O(knlogn)\)参考代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;type......
  • 1. Calcite元数据创建
    1.简介Calcite是一款来自Apache的开源动态数据管理框架,核心功能是提供SQL查询解析、优化及执行等基础能力,以灵活支持多种数据源,广泛应用于各类数据处理系统。以下从其功能特性、应用场景、优势三方面简单概述:功能特性SQL解析:支持多种SQL方言,如标准SQL以及不同数据......