计算panel bed编码区长度
Bash | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
注意
要注意bedtools的版本问题,我测试的 v2.30.0可以,v2.30.1 不行
Bash | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
要注意bedtools的版本问题,我测试的 v2.30.0可以,v2.30.1 不行
Precision 准确度:指找出来的突变中的真阳性有多少
Recall 召回率:指总突变集合有多少可以被找出来
准确度(Precision):
准确度是指在所有被预测为阳性(即突变)的样本中,实际为阳性(真阳性)的比例。换句话说,它衡量的是预测结果中真阳性的比例。其计算公式为:
\(\text{Precision} = \frac{TP}{TP + FP}\)
其中,TP是真阳性的数量,FP是假阳性的数量。
召回率(Recall)或 灵敏度/敏感度(Sensitivity):
召回率是指在所有实际为阳性的样本中,被正确预测为阳性(即真阳性)的比例。它衡量的是测试方法捕捉到所有实际阳性样本的能力。其计算公式为:
\(\text{Recall} = \frac{TP}{TP + FN}\)
其中,TP是真阳性的数量,FN是假阴性的数量。
这两个指标通常用于评估分类模型的性能,特别是在医学和生物学研究中,它们帮助研究者理解一个测试或分析方法在识别阳性样本方面的准确性和完整性。在体细胞变异检测的背景下,这两个指标对于评估变异检测算法的性能至关重要。
特异性(Specificity):
特异性是指在实际没有某种疾病的人群中,诊断测试能够正确排除非患者的能力。它衡量了测试对非患者的"特异性",即测试能够准确地排除非患者的能力。 特异性的计算公式为:
特异性 = 真阴性(True Negative)/(真阴性 + 假阳性(False Positive))
\(\text{Specificity}= \frac{TN}{FP + TN}\)
注意: 这里不使用 特异性 这一概念,原因是在NGS数据calling中,难以确定真阴性位点的数量,特异性无法计算。
F1_score
F1_score,是评估分类模型性能的一种指标,特别是在二分类问题中。它结合了精确度(Precision)和召回率(Recall)两个指标来提供一个单一的评分,以衡量模型的整体性能。 F1_score 是精确度和召回率的调和平均数,公式为:
\(F1 = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}}\)
F1_score 的值范围是0到1,1表示完美的精确度和召回率,0表示模型性能很差。
在处理不平衡的数据集时,F1_score 特别有用,因为它同时考虑了精确度和召回率,而不是仅仅关注其中一个。这使得 F1_score 成为一个在多种情况下都相对平衡的性能度量标准。
使用 MkDocs 的原因是 语雀没有会员的话,即使是(设置过的)互联网访问的文库,新创建的文档他人也无法打开链接,想来还是重新回转到博客了
ref1: https://wcowin.work/blog/Mkdocs/mkdocs1.html
ref2: https://www.cnblogs.com/chinjinyu/p/17610438.html
具体操作参考 ref1中的步骤,有几个坑需要注意:
1. 我之前使用过GithuaPage,我没有删除旧项目,而是保留了.git
文件夹,清除了其文件,此时,我的主要分支是 master
, 因此 ci.yml
中需要对于的修改:
YAML | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
blog
插件,配置 authors
信息时,自23-08之后,.authors.yml
文件路径修改了,默认路径是在 docs
文件夹下:YAML | |
---|---|
1 2 3 4 5 |
|
● 利用贝叶斯定理判断SNV 一个位点所有可能的genotype如下图: ["AA", "CC", "TT", "GG", "AC", "AT", "AG", "CT", "CG", "TG"]
利用贝叶斯定理判断SNV的方法就是根据测序数据(D)计算每一种genotype(G)的概率,即Pr(G|D)。
也就是计算所有十种可能性的概率, 那么,概率最高的就是该位点的genotype。
根据贝叶斯定理计算Pr(G|D)公式如下:
我们的目的是比较不同genotype的概率,因此计算Pr(G)*Pr(D|G)/Pr(D)即可。
现在有两个问题:
1.如何计算Pr(D|G)? 下面通过一个例子来说明计算Pr(D|G)的方法。data如下:
假设G为A1A2,如下:
Pr(D|G)的计算公式如下:
P(b|A)的概率如下, 其中e为对应碱基的质量值:
当Genotype=AG时,套用上面的公式,首先分别计算不同碱基对应的结果:
最终的结果如下:
计算P(G), 就是计算10种可能的genotype的概率, 即Pr(AA),Pr(TT),Pr(CC)等等。
假定参考碱基为G,如果杂合突变率为0.001, 纯合突变率为0.0005。genotype的概率如下: 有了Pr(D|AG)和Pr(G)的概率, Pr(AG|D)就可以计算出来了, 如下:
同理可以计算出其他genotype的概率, 如下:
因此Pr(AG)是10种genotype的概率最高的, 该位点的genotype为AG。
实际SNV calling的方法,可能还有很多细节, 或者其他方法,我这里分享的东西也可能存在不少错误,如果你发现了, 欢迎留言。
Python | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
|
看到适用于绝大部分临床NGS数据分析的底层高度性能优化方案想测试一下效果
cat fq2fa.c
C | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
|
Bash | |
---|---|
1 |
|
Text Only | |
---|---|
1 |
|
Text Only | |
---|---|
1 |
|
fq2fa
文件夹Bash | |
---|---|
1 |
|
Bash | |
---|---|
1 2 |
|
fast_zlib/Sources/match.h
到 zlib-1.2.12
cd zlib-1.2.12
mv deflate.c deflate.old.c
vim deflate.c
C | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 |
|
Bash | |
---|---|
1 2 |
|
下载klib
Text Only | |
---|---|
1 |
|
Text Only | |
---|---|
1 2 |
|
查看 MD5:
Text Only | |
---|---|
1 2 3 |
|
生成测试文件, in.fq.gz 太小,体现不出速度差异
Bash | |
---|---|
1 2 3 |
|
fq2fa_zlib:
Bash | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
fq2fa_fast_zlib:
Bash | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
查看输出结果一致性:
Bash | |
---|---|
1 2 3 |
|
或者 直接用
Bash | |
---|---|
1 2 3 4 5 |
|
Bash | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
可以看到,速度明显快了⅓
Bash | |
---|---|
1 2 |
|
Bash | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
Bash | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
fast_zlib
对 longest_match
函数的实现 与 CentOS 系统上的不同,所以相同的修改效果不显著,甚至是无用的fast_zlib
对 longest_match
函数的优化仅能在 较少CPU和较少内存是体现优势cp -r zlib-1.2.12 fast_zlib-1.2.12
zlib-1.2.12
fast_zlib-1.2.12
fq2fc
gcc -o fq2fa_fast_zlib fq2fa.c /home/lixy/myproject/fast_zlib_test/fast_zlib-1.2.12/build/lib/libz.a -I/home/lixy/myproject/fast_zlib_test/fast_zlib-1.2.12/build/include
gcc -o fq2fa_zlib fq2fa.c /home/lixy/myproject/fast_zlib_test/zlib-1.2.12/build/lib/libz.a -I/home/lixy/myproject/fast_zlib_test/zlib-1.2.12/build/include
测试两个文件的速度:
Bash | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
Bash | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
结论:在 ubuntu系统中,fast_zlib
项目对 zlib
代码的修改,依旧有较大的速度提升
gcc -o fq2fa_zlib_u fq2fa.c -lz -Lzlib
编译链接,速度比 fast_zlib
修改版的尽然还要稍微快一点,原因是什么?-lz -Lzlib
时候,使用的是系统的 zlib
, 该版本比 zlib-1.2.12
有较大的速度提升 ?Bash | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
Bash | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
zlib-1.2.11
会比 zlib-1.2.12
更快吗?测试如下:
Text Only | |
---|---|
1 |
|
Text Only | |
---|---|
1 2 |
|
编译安装
Text Only | |
---|---|
1 2 3 |
|
编译
Bash | |
---|---|
1 2 3 4 5 6 7 8 9 |
|
Bash | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
|
zlib-1.2.11
速度和 zlib-1.2.12
一样,但是却比使用系统默认zlib的版本慢很多gcc -o fq2fa_zlib-ubuntu fq2fa.c -lz -Lzlib
出的程序,确实比 使用 zlib-1.2.11
速度和 zlib-1.2.12
快,原因未知。Bash | |
---|---|
1 2 3 4 5 6 |
|
网上搜索ubuntu 中得这些包,找到了 build.log 文件 - https://www.ubuntuupdates.org/pm/zlib1g-dev - https://www.ubuntuupdates.org/pm/zlib1g
build.log 文件 编译命令就是:
Text Only | |
---|---|
1 |
|
创建 build.sh
Bash | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
执行 bash ./build
重新编译链接程序,发现 手动编译的程序的速度也来到了 22s
, 可以确定确实是不同的编译参数导致zlib库文件的执行效率不同
fq2fa_fast_zlib-1.2.11
速度还是在 24s
, 和未使用 ubuntu zlib的编译参数 前的速度一致最近 zlib 升级到了 1.3.1 , fast_zlib 也升级到了 zlib-1.2.13
Bash | |
---|---|
1 |
|
Bash | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
|
-03
优化后Bash | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
|
-03
时, fast_zlib-1.2.13 和 zlib-1.3.1 耗时比是 24.74 / 37.48 = 0.6601 , 可节约 ⅓ 的时间-03
时, fast_zlib-1.2.13 和 zlib-1.3.1 耗时比是 23.84 / 21.42, 不能节约时间-O3
推荐 Linux就该这么学 (0-5章节,其他的可选择性学习)
输入参数: positionFile, genomeFa, outfa (pos坐标文件,包含四列 chrom start end strand)
使用Python脚本
Python | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
|
S | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
|
Text Only | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
|
Python | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
创建一个垃圾回收站,保存被删除距今3天的文件,过期则被删除
Bash | |
---|---|
1 2 |
|
Bash | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 |
|
Bash | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
Bash | |
---|---|
1 2 3 4 |
|
rm
删除的文件,会被移动到 /home/lixy/.trash 文件夹,并且会在文件后添加 .1555481687
的后缀,该后缀为删除时的时间(秒)
Bash | |
---|---|
1 |
|
.trash
文件夹下的文件,脚本中会根据文件移动到.trash 时添加的后缀,判断移动时间,移动时间大于3天的,即被 /usr/bin/rm
强制删除
该docker包含几个我常用的软件:
基于 CentOS Linux release 7.3.1611 (Core)
axel 下载数据用
Text Only | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
|
Text Only | |
---|---|
1 |
|
参考