这些概念确实很难记忆,长时间不用很容易忘记。此文可以帮你快速回忆起这些概念,同时不涉及任何绕口的专业术语。

1. 记住基本框架,金标准和预测结果,没有这两个概念就没有敏感性和特异性了。以上指标都是用于衡量我们(预测)方法的效果的。考虑两个极端的方面,一、我的诊断/预测方法里的阳性包含了所有的阳性(金标准)个体,想实现这个很简单,就是任何一个人来看病我都说你得了艾滋病,这会带来什么结果呢?正面的就是所有的艾滋病个体我都可以给你判断出来,负面的呢?就是同时一大堆正常人给误判为艾滋病了;二、我的诊断/预测方法的阴性包含了所有的阴性(金标准)个体,一个极端的诊断方法就是任何一个人来看病我都说你没有艾滋病,这回漏掉了很多的阳性个体。当然大部分的诊断和预测方法都不会这么极端,核心意思就是我们必须同时考虑我们方法在阳性和阴性(犯第一类错误和第二类错误)两方面的综合表现

2. 画表是你看到这几个指标的第一反应,横轴是金标准的阳性和阴性纵轴是方法的阳性和阴性,我们预测的任何一个个体都会落到以下四个象限中的一个:

看图说话

真阳性:左上格,金标准和预测都为真;

真阴性:右下格,金标准和预测都为假;

假阳性:右上格,就是我们的预测结果是假的阳性(预测出来的阳性其实是金标准的阴性);

假阴性:左下格,就是我们的预测结果是假的阴性(预测出来的阴性其实是金标准的阳性);

敏感性sensitivity:顾名思义,就是我们的方法对阳性的敏感度,换句话说就是我给你一堆金标准的阳性结果,你能判断出多少来。就像缉毒犬一样,给你一堆含毒品的行李箱,你能闻出多少出来。这个值命名为敏感性还是很形象的。

特异性specificity:顾名思义,就是你的方法能指定地判断出阴性的能力,我给你一堆金标准的阴性结果,你会不会误判出一些阳性的结果。这个命名还是欠缺形象性,叫准阴性更贴切。

FDR:常用于多重检验下的p-value矫正;伪发现率,其意义为是 错误拒绝(拒绝真的(原)假设)的个数占所有被拒绝的原假设个数的比例的期望值。就是我的所有预测阳性中有多少是误判的假阳性。以缉毒犬为例,我的狗闻出了一堆箱子,里面有多少是不含毒品的。在差异基因检测中,使用FDR就是用于控制假阳性的比率(通常为0.05),是不是又把所有知识串起来了。

第一类错误、第二类错误:显然我们的方法里有且仅有两类错误,通常我们先考虑我们预测的阳性结果,里面有多少错误(其实是金标准的阴性),这些错误就是第一类错误,也就是上面的假阳性。在考虑我们预测的阴性结果,里面有多少是假阴性,也就是有多少第二类错误。

False positive rate (FPR):假阳性率,给你一堆金标准的阴性,有多少是假的阴性,等于1-specificity,1-准阴性不就是假阴性吗。

Confusion matrix混淆矩阵 / Contingency table列联表 (这个表的两种名称)

基于sensitivity和specificity衍生出来的两个概念:只能用于二分类模型的评价。

怎么全面地评价一个二分类模型的好坏,模型的其他指标都依赖一个threshold,单一的threshold是有偏的。

ROC:receiver operating characteristic,每个分类器作出的预测呢,都是基于一个probability score的。一般默认的threshold呢都是0.5,如果probability>0.5,那么这个sample被模型分成正例了哈,反之则是反例。ROC曲线是一系列threshold(比如逻辑斯蒂分类问题,取多少阈值来划分类别)下的(FPR,TPR)数值点的连线。不同阈值下模型的sensitivity和specificity不同。

AUC:areas-under-the-curve,曲线下的面积(AUC)越大,或者说曲线更接近左上角(true positive rate=1, false positive rate=0)。AUC的意义:分别随机从正负样本集中抽取一个正样本,一个负样本,正样本的预测值大于负样本的概率。Wilcoxon-Mann-Witney Test。

参考:如何理解机器学习和统计中的AUC?

  • (0,0):TP=0,FP=0,可以发现该分类器预测所有的样本都为负样本(Negative)
  • (1,1):TN=0,FN=0,可以发现该分类器预测所有的样本都为正样本(Positive)
  • (0,1):FP=0,FN=0,它将所有的样本都正确分类
  • (1,0):TP=0,TN=0,它将所有的样本都错误分类

继续深入:

精确度Precision:很容易与敏感性搞混,分子是一样的,但分母不同,精确度的分母是我们方法预测出来的阳性,敏感性是金标准的阳性。精确度表示我们预测了一堆阳性结果,里面有多少是靠谱的。

准确度Accuracy:和Precision中文意思是一样的,Precision指的是测量结果的一致性。Accuracy指的是测量结果和真实结果的接近程度。

Recall:TPR,真阳性率,和sensitivity一个东西。

F1 score:F1-score(均衡平均数)是综合考虑了模型查准率和查全率的计算结果,取值更偏向于取值较小的那个指标。F1-score越大自然说明模型质量更高。但是还要考虑模型的泛化能力,F1-score过高但不能造成过拟合,影响模型的泛化能力。


以下是我曾经的一个项目,不感兴趣的可以不看。

终于要用到这个玩意了,很激动,主要统计假阴假阳性率。

我的任务:

1. 评估Pacbio MHC variation calling 结果(CCS/non-CCS)与Hiseq数据结果的一致性。
2. 分别在不同深度梯度的区域完成以上评估,推断PB MHC做variation calling的最低深度。

这里要将一个位点分为SNP、REF 和 LowQual,然后只去 SNP 和 REF 进行统计。

#!/usr/bin/env python
# Author: LI ZHIXIN import sys
import pysam
from collections import OrderedDict def classify_DP(depth):
if depth > 101:
return 21
return ((depth-1)//5+1) def parse_rec(rec):
sample = list(rec.samples)[0]
# filter the Invalid line
if not ('GQ' or 'GT' or 'DP') in rec.samples[sample].keys() or len(rec.alleles) <= 1:
# continue
return 1, "LowQual", rec.pos
# filter the LowQual
if rec.samples[sample]['GQ'] < 30:
return rec.samples[sample]['DP'], "LowQual", rec.pos
# filter the indel
flag = 0
for one in rec.alleles:
if len(one) != len(rec.ref):
flag = 1
if flag == 1:
return rec.samples[sample]['DP'], "LowQual", rec.pos
if rec.samples[sample]['GT'] != (0, 0): # rec.qual > 30
# variation_dict[rec.pos] = ["snp", rec.alleles]
return rec.samples[sample]['DP'], "snp", rec.pos
elif rec.samples[sample]['GT'] == (0, 0):
# variation_dict[rec.pos] = ["ref", rec.alleles]
return rec.samples[sample]['DP'], "ref", rec.pos def read_gvcf(gvcf_file_path):
variation_dict = OrderedDict()
for i in range(1,22):
variation_dict[i] = {}
for j in ('LowQual', 'snp', 'ref'):
variation_dict[i][j] = []
# pos_list = []
gvcf_file = pysam.VariantFile(gvcf_file_path)
for rec in gvcf_file.fetch('chr6',28477796,33448354):
DP, pos_type, pos = parse_rec(rec)
if DP < 1 or DP > 20:
continue
# DP = classify_DP(DP)
variation_dict[DP][pos_type].append(pos)
# print(pos, DP, pos_type)
gvcf_file.close()
# return variation_dict, pos_list
return variation_dict def read_hiseq_gvcf(gvcf_file_path):
variation_dict = OrderedDict()
# for i in range(1,22):
# variation_dict[i] = {}
for j in ('LowQual', 'snp', 'ref'):
variation_dict[j] = []
# pos_list = []
gvcf_file = pysam.VariantFile(gvcf_file_path)
for rec in gvcf_file.fetch('chr6',28477796,33448354):
DP, pos_type, pos = parse_rec(rec)
DP = classify_DP(DP)
variation_dict[pos_type].append(pos)
# print(pos, DP, pos_type)
gvcf_file.close()
# return variation_dict, pos_list
return variation_dict def show_dict_diff_DP(Hiseq_unified_variation_dict, PB_non_CCS_variation_dict, outf, outf2):
for DP in range(1,21):
Hiseq_snp = set(Hiseq_unified_variation_dict['snp'])
Hiseq_ref = set(Hiseq_unified_variation_dict['ref'])
Hiseq_lowqual = set(Hiseq_unified_variation_dict['LowQual'])
PB_snp = PB_non_CCS_variation_dict[DP]['snp']
PB_ref = PB_non_CCS_variation_dict[DP]['ref']
PB_lowqual = PB_non_CCS_variation_dict[DP]['LowQual']
total = set(PB_snp + PB_ref + PB_lowqual)
Hiseq_snp = total & Hiseq_snp
Hiseq_ref = total & Hiseq_ref
Hiseq_lowqual = total & Hiseq_lowqual
PB_snp = set(PB_snp)
PB_ref = set(PB_ref)
PB_lowqual = set(PB_lowqual)
a = len(Hiseq_snp & PB_snp)
b = len(Hiseq_ref & PB_snp)
c = len(Hiseq_lowqual & PB_snp)
d = len(Hiseq_snp & PB_ref)
e = len(Hiseq_ref & PB_ref)
f = len(Hiseq_lowqual & PB_ref)
g = len(Hiseq_snp & PB_lowqual)
h = len(Hiseq_ref & PB_lowqual)
i = len(Hiseq_lowqual & PB_lowqual)
Low_total = (g+h+i)/(a+b+c+d+e+f+g+h+i)
if (a+b) == 0:
PPV = "NA"
else:
PPV = a/(a+b)
PPV = "%.4f"%(PPV)
if (a+d) == 0:
TPR = "NA"
else:
TPR = a/(a+d)
TPR = "%.4f"%(TPR)
print(str(DP)+" :\n", a,b,c,"\n",d,e,f,"\n",g,h,i,"\n", file=outf2, sep='\t', end='\n')
print(DP, TPR, PPV, "%.4f"%Low_total, file=outf, sep='\t', end='\n') with open("./depth_stat.txt", "w") as outf:
print("Depth", "TPR", "PPV", "Low_total", file=outf, sep='\t', end='\n')
outf2 = open("raw.txt", "w")
Hiseq_unified_variation_dict = read_hiseq_gvcf("./hiseq_call_gvcf/MHC_Hiseq.unified.gvcf.gz")
PB_non_CCS_variation_dict = read_gvcf("./non_CCS_PB_call_gvcf/MHC_non_CCS.unified.gvcf.gz")
show_dict_diff_DP(Hiseq_unified_variation_dict, PB_non_CCS_variation_dict, outf, outf2)
outf2

  

又碰到一个高级python语法:在双层循环中如何退出外层循环? 我用了一个手动的flag,有其他好方法吗?

如何统计下机数据的覆盖度和深度?当然要比对之后才能统计,而且还要对比对做一些处理。

在计算一个位点是否是SNP、indel、Ref时,不仅要考虑ref、alts、qual、GQ,而且必须要把GT、DP考虑在内,所以说还是比较复杂的。

最后如何分析第二个问题,call variation的最低深度?

统计不同深度下的假阴假阳性率,看在什么深度下其达到饱和。

敏感性、特异性、假阳性、假阴性(sensitivity and specificity)的更多相关文章

  1. sensitivity and specificity(敏感性和特异性)

    医学.机器学习等等,在统计结果时时长会用到这两个指标来说明数据的特性.

  2. 分类器、logistic回归

    相关性 1.相关性是一种测度,用来表示两个变量在同一方向上发生变化的程度,如果x和y在变化方向上相同,那么这两个变量就是正相关:如果变化方向相反,就是负相关:如果变量之间没有关系,那么相关性就是0. ...

  3. 查全率(Recall),查准率(Precision),灵敏性(Sensitivity),特异性(Specificity),F1,PR曲线,ROC,AUC的应用场景

    之前介绍了这么多分类模型的性能评价指标(<分类模型的性能评价指标(Classification Model Performance Evaluation Metric)>),那么到底应该选 ...

  4. ROC 曲线/准确率、覆盖率(召回)、命中率、Specificity(负例的覆盖率)

      欢迎关注博主主页,学习python视频资源 sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频教程) https://study.163.com/course/introduction.ht ...

  5. 阳/阴性预测值Positive/negative Predictive Value(推荐AA)

    sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005269003&am ...

  6. GWAS:拒绝假阳性之case和control数量比例严重失衡的解决方案(SAIGE模型的应用)

    一.为什么要校正case和control数量比例不平衡情况 试问作为生信届人员,最怕的是什么,当然是统计结果不靠谱.统计结果不靠谱包括两方面:一个是假阴性,一个是假阳性.假阴性可以理解为白天鹅被误当成 ...

  7. 评估分类器性能的度量,像混淆矩阵、ROC、AUC等

    评估分类器性能的度量,像混淆矩阵.ROC.AUC等 内容概要¶ 模型评估的目的及一般评估流程 分类准确率的用处及其限制 混淆矩阵(confusion matrix)是如何表示一个分类器的性能 混淆矩阵 ...

  8. MATLAB聚类有效性评价指标(外部 成对度量)

    MATLAB聚类有效性评价指标(外部 成对度量) 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 更多内容,请看:MATLAB: Clustering ...

  9. R数据分析:临床预测模型中校准曲线和DCA曲线的意义与做法

    之前给大家写过一个临床预测模型:R数据分析:跟随top期刊手把手教你做一个临床预测模型,里面其实都是比较基础的模型判别能力discrimination的一些指标,那么今天就再进一步,给大家分享一些和临 ...

随机推荐

  1. Yii2 配置 Nginx 伪静态

    主要检查以下代码: location / { # Redirect everything that isn't a real file to index.php try_files $uri $uri ...

  2. python3 集合的常用方法

    方法 意义 S.add(e) 在集合中添加一个新的元素e:如果元素已经存在,则不添加 S.remove(e) 从集合中删除一个元素,如果元素不存在于集合中,则会产生一个KeyError错误 S.dis ...

  3. 获取Android设备的唯一识别码|设备号|序号|UUID

    如何获取一个能唯一标识每台Android设备的序号? 这个问题有很多答案,但是他们中的大部分只在某些情况下有效. 根据测试: 所有的设备都可以返回一个 TelephonyManager.getDevi ...

  4. linux常用命令:ping 命令

    Linux系统的ping 命令是常用的网络命令,它通常用来测试与目标主机的连通性,我们经常会说“ping一下某机器,看是不是开着”.不能打开网页时会说“你先ping网关地 址192.168.1.1试试 ...

  5. Javassist

    Javassist 实现动态代理 javassist 是一款非常优秀的Java 字节码引擎工具,能够在运行时编译.生成Java Class.

  6. 【运维技术】Maven + Gogs + Nexus 实现版本管理 + 代码模块开发管理

    Gogs:能够实现fork + 代码提交 + 代码框架 Nexus:进行jar包的版本管理,私服下载jar包共享jar包 Maven:在客户端进行模块管理和批量操作 1. 本地maven仓库配置配置s ...

  7. 开启你的kali linux DIY之旅

    更新源 首先 是kali2016.2更新源的问题,网上找了好久,都不是很满意.后来把kali 2016.2安装到实体机中才发现,里面自带了更新源.下面我把这个官方自带更新源分享出来(速度蛮快的) de ...

  8. 20145225唐振遠《网络对抗》Exp5 MSF基础应用

    基础问题回答 用自己的话解释什么是exploit,payload,encode? exploit就相当于是载具,将真正要负责攻击的代码传送到靶机中,我觉得老师上课举的火箭和卫星的例子非常形象,火箭只是 ...

  9. 20145307陈俊达_安卓逆向分析_Xposed的hook技术研究

    20145307陈俊达_安卓逆向分析_Xposed的hook技术研究 引言 其实这份我早就想写了,xposed这个东西我在安卓SDK 4.4.4的时候就在玩了,root后安装架构,起初是为了实现一些屌 ...

  10. 20145309李昊 WEB基础实践

    本实验同学帮助下完成 实验问题回答 1.什么是表单 表单在网页中主要负责数据采集功能 一个表单有三个基本组成部分: 表单标签 表单域:包含了文本框.密码框.隐藏域.多行文本框.复选框.单选框.下拉选择 ...