ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

你们做核算检测了吗?一个算法让核算检测成本降低到千分之一?

2022-02-02 10:30:23  阅读:215  来源: 互联网

标签:10 arr Python 检测 RNA num 千分之一 核算


10人一组混检

到了过年的时候了,你要回老家过年吗?如果回老家过年,需要做核算检测。我也正在犹豫中。你们做了吗?

在这里插入图片描述

核酸检测本身是一个比较费时,费力,费钱的复杂过程,所以现在低风险地区都是采用的10人一组混合检验的。

具体来说就是将采集自10个人的10支拭子样本集合于1个采集管中进行核酸检测。

混检筛查中一旦发现阳性或弱阳性,将会立即进行追溯,通知相关部门对该混采管的10个受试者暂时单独隔离,并重新采集单管拭子进行复核,再确定这10个人当中到底哪一个是阳性。

如果检测结果是阴性,意味着这10个样本全是阴性,混检的10个人都是安全的。

看到这个过程后,作为程序员的我禁不住拍了一下自己的大腿,这不就是个很简单算法嘛!但是这个小小的算法把检验的成本降低了接近90%,把检验的速度提高了近10倍!算法真是太奇妙了!

在这里插入图片描述

顺着这个思路,有没有更好的算法,进一步加快这个过程呢?理论上来说,如果用二分法,可以把14亿次检测减少到大概23万次左右。而现在10比1混合检验的次数大约是1.4亿次。

关于算法,本文下面再讨论。咱们先说一个大家关心的问题。

混检是否安全

把10个人的样本混在一起,咋一听觉得很不靠谱,实际上还是很靠谱的。但是会不会出现检验不准的情况呢?确实存在一些潜在问题。

假阴性率会增加,准确度下降。举两个假设的情况给大家解释为什么假阴性率会增加:

情况1:假设使用的是饱受争议的美国CDC的核酸RT-PCR检测试剂盒。这个试剂盒一共测三个新冠基因片段,其中两个是新冠特异的基因片段,第三个是所有类似于SARS的冠状病毒都有的基因片段。除此以外,还包括一个控制探针
(control probe)针对人的RNase P基因。这个探针的目的是用来保障取样足够和RNA提纯过程没有出错。

如果取样不够,或者RNA纯化出错导致RNA降解,探针就读不出数值,检测结果就是“无效(invalid)”,还需要重新再测。

如果有位阳性感染者,在鼻咽拭子取样的时候,样本量取得不够。如果对这个样本用美国CDC的核酸试剂盒进行单独的核酸检测,虽然新冠基因是阴性,RNase
P控制探针的结果也是阴性,最终结果就显示“无效(invalid)”,还需要重新再测。

然而,如果把这个人的样本和其他4个人混合在一起,进行混合核酸测试——其他4位都是核酸阴性,且取到了足够的样本。这时,用美国CDC的核酸试剂盒去检测5个人的混合样本,测出新冠基因是阴性,RNase
P的控制探针是阳性(表明样本取样提纯没有出错),因此得出结论:这5位都是核酸阴性。那位阳性感染者得到的就是一个“假阴性”结果。

情况2:不同核酸检测的设计不同,导致试剂盒的敏感度和特异性也不同。假设所用核酸试剂盒的敏感度是500个新冠RNA/毫升。有一位阳性感染者取样,提纯样本里面的RNA以后,用1µg总RNA量来做RT-PCR,里面包含了500个新冠RNA/毫升,那么检测结果是阳性。可是如果他的样本和其他4个人混在一起检测,还是用1µg总RNA量来做RT-PCR,假设是等量混合,那么他的RNA实际只占~20%。1µg总混合RNA里面大约只有100个新冠RNA/毫升。受试剂盒敏感度的限制,结果会是假阴性。

但这不是说混检就不能实行,而是有一定的限制:

1.每个样本的采集量要足,否则会出现稀释后出现假阴性的问题

2.只对低风险地区实行混检

混检的算法

下面用算法简单模拟采样数量和检测数量,其实也不是什么算法,就是两个数学公式:

total_pop = 1400000000  #总人口
rate = 0.00001  #感染率
group_size = 10  #每组人数

check_num = 0
caiyang_num = 0

#计算采用数量:总人数 + 要重复采样的数量
caiyang_num = total_pop + (total_pop * rate) * group_size
#计算检测次数:人数除以10 + 重复检测数
check_num = total_pop / group_size + (total_pop * rate) * group_size

print(f'采用数:{caiyang_num:,}, 检测数量:{check_num:,}')

运行结果:采用数:1,400,140,000.0, 检测数量:140,140,000.0

假设感染率为10万分之一的情况下,要采样14亿零14万次;要检测1亿4千万零14万次。

如果调整每100人一组检测:采用数:1,401,400,000.0, 检测数量:15,400,000.0

采用数增加了100多万次,而检测次数减少了1亿2千多万次。也就是说分组能极大的减少检测次数。

但是受制于准确度的影响,我们这里只是探讨一下算法。这些算法在计算机的数据处理上,确实起到了把效率提高几万,甚至几十几百万次的效果。

用二分查找混检

如果用二分查找法,可以进一步减少检测次数减少到23万次。

这里仍然假设10万人有一个感染,也就是10万个人里面找一个人出来。用二分法需要找约17次,那么总的检测次数就是:

group_size = 100000  #10万人一组
group_num = 1400000000 / 100000 # 共1400组
from math import log
# 用2分法每10万人只需要log(10w,2),大约16次检测
check_num = round(log(group_size, 2) * group_num)
print(f'检测数量:{check_num:,}')

计算结果:检测数量:232,535

虽然由于检测准确度的问题,二分法不能实施,但算法的世界真的很奥妙。大家都应该学点编程,学点算法。

在这里插入图片描述

下面是二分查找法的Python非递归实现:

#二分查找法,非递归实现
def binary_search(arr, x): 
    low = 0
    high = len(arr) - 1
    mid = 0
  
    while low <= high: 
        mid = (high + low) // 2
        if arr[mid] < x: 
            low = mid + 1 
        elif arr[mid] > x: 
            high = mid - 1
        else: 
            return mid 
    return -1
  
  
arr = [ 2, 3, 4, 10, 40 ] 
x = 10
result = binary_search(arr, x) 

下面是递归实现:

def binary_search(arr, low, high, x): 
      if high >= low: 
        mid = (high + low) // 2
        if arr[mid] == x: 
            return mid 
        elif arr[mid] > x: 
            return binary_search(arr, low, mid - 1, x) 
        else: 
            return binary_search(arr, mid + 1, high, x) 
    else: 
        return -1
  
arr = [ 2, 3, 4, 10, 40 ] 
x = 10
result = binary_search(arr, 0, len(arr)-1, x) 

关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。


这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

在这里插入图片描述

标签:10,arr,Python,检测,RNA,num,千分之一,核算
来源: https://blog.csdn.net/JAVAmonster12/article/details/122759528

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有