草庐IT

【数学建模】大区域核酸检测中分组的诀窍

遥望山海 2023-06-05 原文

1 问题描述

在全员核酸筛查中,为减少检验次数,通常采用分组检测的办法,将一组人的样本混合在一起化验。当某组的混合样本呈阳性时,则可判定该组至少有一人样本为阳性。于是,有三个问题需要解决:

问题(一): 假如对样本进行第一次分组检测后,再对混合样本呈阳性的小组进行全员检测,则当给定样本为阳性的先验概率 p p p时,应如何分组,可使平均总检验次数与不分组的情况相比更少?
问题(二): 当 p p p多大时不应分组检验?
问题(三) :假如第一次分组检测后,再对混合样本呈阳性的小组人员进行二次分组检测,则当给定 p p p时,这两次分组应该怎么分,可使平均总检验次数最小?

2 问题(一)分析与建模

(1) 符号定义与问题分析

n n n: 待查人员总数
k k k: 每组 k k k
x x x: 将总人数 n n n分成 x x x组, x = n k x=\frac{n} {k} x=kn
p p p: 样本为阳性的先验概率
q q q: 样本为阴性的先验概率, q = 1 − p q=1-p q=1p

问题分析:
不论怎么分组,首先必须对每组的混合样本检测一次,也就是先检测 x x x次。如果混合样本为阳性,还需对小组成员再逐一检测一次。
小组检测中,至少一个样本呈阳性的概率为: 1 − q k 1-q^{k} 1qk,也就是说平均有 [ ( 1 − q k ) ⋅ x ] [(1-q^{k})\cdot x] [(1qk)x]个阳性小组。那么检测总次数 N = x + ( 1 − q k ) ⋅ x ⋅ k N=x+(1-q^{k})\cdot x \cdot k N=x+(1qk)xk.

(2) 建立模型
根据上述分析,现用 E ( k ) E(k) E(k)表示单人阳性概率为 p p p k k k人一组时的人均检测次数,
E ( k ) = N n = x + ( 1 − q k ) ⋅ x ⋅ k n = 1 k + 1 − q k E(k)=\frac{N}{n}=\frac{x+(1-q^{k})\cdot x \cdot k}{n}=\frac{1}{k}+1-q^{k} E(k)=nN=nx+(1qk)xk=k1+1qk
q = 1 − p q=1-p q=1p代入上式得,
E ( k ) = 1 k + 1 − ( 1 − p ) k    ( 1 ) E(k)=\frac{1}{k}+1-(1-p)^{k} \space \space (1) E(k)=k1+1(1p)k  (1)
现在问题转化为,给定 p p p,求 k k k,使得 E ( k ) E(k) E(k)最小。

(3) 问题求解
p p p很小时, ( 1 − p ) k ≈ 1 − k p (1-p)^k\approx 1-kp (1p)k1kp,代入公式(1)可得,
E ( k ) = 1 k + k p    ( 2 ) E(k)=\frac{1}{k}+kp \space \space (2) E(k)=k1+kp  (2)

容易求得函数E(k)的极小值点为 k = p − 1 2 k=p^{-\frac{1}{2}} k=p21. 由于 k k k应为整数,所以取 k = [ p − 1 2 ] k=[p^{-\frac{1}{2}}] k=[p21] k = [ p − 1 2 ] + 1 k=[p^{-\frac{1}{2}}]+1 k=[p21]+1,代入公式(2),比较 E ( k ) E(k) E(k)的值,取较优的 k k k.
现取 p = 0.0001 , 0.001 , 0.01 , 0.02 , 0.05 p=0.0001, 0.001, 0.01, 0.02, 0.05 p=0.0001,0.001,0.01,0.02,0.05,求得较优的 k k k和较小的 E ( k ) E(k) E(k),见表-1.

表-1 一次分组检验结果
p0.00010.0010.010.020.05
k100321085
E(k)0.0200.0630.1960.2740.426

3 问题(二)分析与证明

(1) 分析
显然,当人均检测次数大于1时,不应分组,即,当 E ( k ) > 1 E(k)>1 E(k)>1时不应分组。也就是
E ( k ) = 1 k + 1 − ( 1 − p ) k > 1    ( 3 ) E(k)=\frac{1}{k}+1-(1-p)^{k}>1 \space \space(3) E(k)=k1+1(1p)k>1  (3)
时,不应该分组。

(2) 求解
由不等式(3)解得 p > 1 − k − 1 k p>1-k^{-\frac{1}{k}} p>1kk1.
观察表-1可知,随着阳性概率 p p p增大,要使 E ( k ) E(k) E(k)取得最小值,小组人数 k k k随之减小。为了得到较大的 p p p,我们从 k = 2 k=2 k=2 k = 3 k=3 k=3开始试. 求得 p p p后,再验证 p p p是否为可分组的最大阳性概率。经计算,
k = 2 k=2 k=2时, p ≈ 0.293 p\approx 0.293 p0.293
k = 3 k=3 k=3时, p ≈ 0.307 p\approx 0.307 p0.307

从计算结果看,似乎与表-1反应的规律有些矛盾。不是说 k k k越小时, p p p就越大吗,怎么反过来了。这里需要注意, k k k越小时, p p p越大是指,满足 E ( k ) E(k) E(k)取得最小值的 k k k越小, p p p就越大。
现在我们来验证,当 p = 0.293 p=0.293 p=0.293时,满足 E ( k ) E(k) E(k)取得最小值的 k k k是否为2.
k = 2 k=2 k=2 k = 3 k=3 k=3 k = 4 k=4 k=4 p = 0.293 p=0.293 p=0.293代入公式(3),得
E ( 2 ) = 1 + 1 2 − ( 1 − 0.293 ) 2 ≈ 1.0001 E(2)=1+\frac{1}{2}-(1-0.293)^{2} \approx 1.0001 E(2)=1+21(10.293)21.0001
E ( 3 ) = 1 + 1 3 − ( 1 − 0.293 ) 3 ≈ 0.9799 E(3)=1+\frac{1}{3}-(1-0.293)^{3} \approx0.9799 E(3)=1+31(10.293)30.9799
E ( 4 ) = 1 + 1 4 − ( 1 − 0.293 ) 4 ≈ 1.0001 E(4)=1+\frac{1}{4}-(1-0.293)^{4} \approx1.0001 E(4)=1+41(10.293)41.0001
从计算结果可知,当 k = 3 k=3 k=3 p = 0.293 p=0.293 p=0.293时, E ( k ) < 1 E(k)<1 E(k)<1,所以 p = 0.293 p=0.293 p=0.293不是不可分组的最大阳性概率.

(3) 验证 p = 0.307 p=0.307 p=0.307是可分组的最大阳性概率

用反证法
假设 ∃ ε ∈ ( 0.307 , 1 ) \exists \varepsilon \in(0.307,1) ε(0.307,1) k ∈ [ 2 , + ∞ ) k\in [2,+\infty) k[2,+),使得 E ( k ) < 1 E(k)<1 E(k)<1,即下面不等式成立,
1 + 1 k − ( 1 − ε ) k < 1      ( 4 ) 1+\frac{1}{k}-(1-\varepsilon)^{k} <1 \space \space\space\space(4) 1+k1(1ε)k<1    (4)
化简后得,
ε < 1 − k − 1 k      ( 5 ) \varepsilon<1-k^{-\frac{1}{k}} \space \space\space\space (5) ε<1kk1    (5)

y = k − 1 k y=k^{-\frac{1}{k}} y=kk1,求 y y y的极值点。
d y d k = e − 1 k l n k ⋅ 1 k 2 ⋅ ( l n k − 1 ) \frac{dy}{dk}=e^{-\frac{1}{k}lnk} \cdot \frac{1}{k^{2}} \cdot(lnk-1) dkdy=ek1lnkk21(lnk1)
d y d k = 0 , \frac{dy}{dk}=0, dkdy=0求得函数 y y y的极小值点 k = e k=e k=e,极小值 y = 0.693 y=0.693 y=0.693. 也就是函数 z ( k ) = 1 − k − 1 k z(k)=1-k^{-\frac{1}{k}} z(k)=1kk1的极大值为 z = ( 1 − 0.693 ) = 0.307 z=(1-0.693)=0.307 z=(10.693)=0.307,因此得,当 ε ∈ ( 0.307 , 1 ) \varepsilon \in(0.307,1) ε(0.307,1) k ∈ [ 2 , + ∞ ) k\in [2,+\infty) k[2,+)时, ε < 1 − k − 1 k \varepsilon <1-k^{-\frac{1}{k}} ε<1kk1。结论与原假设矛盾,所以当 p > 0.307 p>0.307 p>0.307时不应分组。

4 问题(三)分析与建模

(1) 符号定义与问题分析

n n n: 待查人员总数
k k k:第一次分组的小组人数
x x x:第一次分组的分组总数, x = n k x=\frac{n} {k} x=kn
m m m:第二次分组的小组人数
y y y:将第一次检测呈阳性的小组再分 y y y小组, y = k / m y=k/m y=k/m
p p p: 样本为阳性的先验概率
q q q::样本为阴性的先验概率, q = 1 − p q=1-p q=1p
p 1 p_{1} p1:第一次检测,小组呈阳性的概率, p 1 p_{1} p1=1- q k q^{k} qk
p 2 p_{2} p2:第二次检测,小组呈阳性的概率。为简化问题,这里将第一次检验呈阳性小组全部组合在一起,然后再重新分组,因此, p 2 p_{2} p2=1- q m q^{m} qm

分析:
第一次检验呈阳性组的平均值为 x p 1 xp_{1} xp1,将 x p 1 xp_{1} xp1个小组组合起来再进行第二次分组,得到 x p 1 ⋅ y xp_{1} \cdot y xp1y个小组。所以,第二次检验阳性组的平均值为 x p 1 ⋅ y ⋅ p 2 xp_{1} \cdot y \cdot p_{2} xp1yp2
所以平均总检验次数为:第一次分组的检验次数,加上第二次分组的检验次数,再加上对所有阳性组成员进行检验的次数,即, N = x + x p 1 ⋅ y + x p 1 ⋅ y ⋅ p 2 ⋅ m N=x+xp_{1} \cdot y+xp_{1} \cdot y \cdot p_{2} \cdot m N=x+xp1y+xp1yp2m.

(2) 建立模型
E ( k , m ) E(k,m) E(k,m)表示单人平均检验次数,即, E ( k , m ) = N n E(k,m)=\frac{N}{n} E(k,m)=nN,则有,
KaTeX parse error: No such environment: equation at position 8: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲ \begin{aligned…

(3) 问题求解
现在问题转化为给定 p p p,求 k k k m m m使 E ( k , m ) E(k,m) E(k,m)最小。 p p p很小时, ( 1 − p ) k ≈ 1 − k p (1-p)^{k} \approx1-kp (1p)k1kp,代入公式(6)得,
E ( k , m ) ≈ 1 k + k p m + k m p 2    ( 7 ) E(k,m)\approx \frac{1}{k}+\frac{kp}{m} +kmp^{2} \space \space(7) E(k,m)k1+mkp+kmp2  (7)

z = 1 k + k p m + k m p 2 z=\frac{1}{k}+\frac{kp}{m} +kmp^{2} z=k1+mkp+kmp2,求 z z z关于自变量 k , m k,m k,m的二元函数的最小值点,得
k = 1 2 p − 3 4 , m = p − 1 2    ( 8 ) k=\frac{1}{\sqrt{2}} p^{-\frac{3}4{}}, m=p^{-\frac{1}{2}} \space \space (8) k=2 1p43,m=p21  (8)
根据题目要求, k , m , k / m k, m, k/m k,m,k/m均为整数。将 p = 0.0001 , 0.001 , 0.01 , 0.02 , 0.05 p=0.0001, 0.001, 0.01, 0.02, 0.05 p=0.0001,0.001,0.01,0.02,0.05代入公式(7)、公式(8),并比较 E ( k , m ) E(k,m) E(k,m),得到 k , m k,m k,m的最优值,见表-2.

表-2 二次分组检验结果
p0.00010.0010.010.020.05
k70012424168
m100311284
E(k,m)0.00280.01590.09050.15370.3050

由表-2可知,与表-1比较可知,采用两次分组办法的效果比一次分组办法的效果更好。

有关【数学建模】大区域核酸检测中分组的诀窍的更多相关文章

  1. ruby-on-rails - 建模收藏夹 - 2

    我希望将Favorite模型添加到我的User和Link模型。业务逻辑用户可以有多个链接(即可以添加多个链接)用户可以收藏多个链接(他们自己的或其他用户的)一个链接可以被多个用户收藏,但只有一个所有者我对如何为这种关联建模以及在模型就位后如何创建用户收藏夹感到困惑?classUser 最佳答案 下面的数据模型怎么样:classUser:destroyhas_many:favorite_links,:through=>:favorites,:source=>:linkendclassLink:destroyhas_many:favor

  2. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  3. ruby - 鸭子输入字符串、符号和数组的优雅方式? - 2

    这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby​​。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac

  4. ruby-on-rails - 在 rails 中分配/替换参数哈希 - 2

    我在RailsController操作中有下面的代码序列。在IF之前,params包含请求参数,正如预期的那样。在它之后,params为零。谁能解释一下这里发生了什么?iffalseparams={:user=>{:name=>"user",:comment=>'comment'}}end谢谢。 最佳答案 params其中包含请求参数实际上是一个方法调用,它返回包含参数的散列。你的params=行正在分配给一个名为params的局部变量.iffalse之后block,Ruby已经看到了本地params变量,所以当你引用params时

  5. ruby - 检测由 RSpec、Ruby 运行的代码 - 2

    我想知道我的代码是否在rspec下运行。这可能吗?原因是我正在加载一些错误记录器,这些记录器在测试期间会被故意错误(expect{x}.toraise_error)弄得乱七八糟。我查看了我的ENV变量,没有(明显的)测试环境变量的迹象。 最佳答案 在spec_helper.rb的开头添加:ENV['RACK_ENV']='test'现在您可以在代码中检查RACK_ENV是否经过测试。 关于ruby-检测由RSpec、Ruby运行的代码,我们在StackOverflow上找到一个类似的问题

  6. ruby - 使用 Ruby Daemons gem 检测停止 - 2

    我正在使用rubydaemongem。想知道如何向停止操作添加一些额外的步骤?希望我能检测到停止被调用,并向其添加一些额外的代码。任何人都知道我如何才能做到这一点? 最佳答案 查看守护程序gem代码,它似乎没有用于此目的的明显扩展点。但是,我想知道(在守护进程中)您是否可以捕获守护进程在发生“停止”时发送的KILL/TERM信号...?trap("TERM")do#executeyourextracodehereend或者你可以安装一个at_exit钩子(Hook):-at_exitdo#executeyourextracodehe

  7. ruby - 将 ruby​​ 哈希转换为数组的最佳方法是什么 - 2

    我有一个像这样的ruby​​散列{"stuff_attributes"=>{"1"=>{"foo"=>"bar","baz"=>"quux"},"2"=>{"foo"=>"bar","baz"=>"quux"}}}我想把它变成一个看起来像这样的散列{"stuff_attributes"=>[{"foo"=>"bar","baz"=>"quux"},{"foo"=>"bar","baz"=>"quux"}]}我还需要保留键的数字顺序,并且键的数量是可变的。上面是super简化的,但我在底部包含了一个真实的例子。执行此操作的最佳方法是什么?附言还需要递归就递归而言,这是我们可以假设的:1)

  8. ruby - 我可以在 Ruby 中动态调用数学运算符吗? - 2

    ruby中有这样的东西吗?send(+,1,2)我想让这段代码看起来不那么冗余ifop=="+"returnarg1+arg2elsifop=="-"returnarg1-arg2elsifop=="*"returnarg1*arg2elsifop=="/"returnarg1/arg2 最佳答案 是的,只需像这样使用send(或者更好的是public_send):arg1.public_send(op,arg2)这是可行的,因为Ruby中的大多数运算符(包括+、-、*、/、andmore)只需调用方法。所以1+2与1.+(2)相同

  9. ruby - Ruby 脚本如何检测到它正在 irb 中运行? - 2

    我有一个定义类的Ruby脚本。我希望脚本执行语句BoolParser.generate:file_base=>'bool_parser'仅当脚本作为可执行文件被调用时,而不是当它被irbrequire(或通过-r在命令行上传递)时。我可以用什么来包装上面的语句,以防止它在我的Ruby文件加载时执行? 最佳答案 条件$0==__FILE__...!/usr/bin/ruby1.8classBoolParserdefself.generate(args)p['BoolParser.generate',args]endendif$0==_

  10. Ruby 无法检测字符串中的换行符 - 2

    我有以下字符串,我想检测那里的换行符。但是Ruby的字符串方法include?检测不到它。我正在运行Ruby1.9.2p290。我哪里出错了?"/'ædres/\nYour".include?('\n')=>false 最佳答案 \n需要在双引号内,否则无法转义。>>"\n".include?'\n'=>false>>"\n".include?"\n"=>true 关于Ruby无法检测字符串中的换行符,我们在StackOverflow上找到一个类似的问题: h

随机推荐