简单的群体测试方案C++代码(Group testing against Covid-19)
原理參考鏈接
https://www.econstor.eu/handle/10419/221811
http://www.magigen.com/h-nd-348.html
文章原理回顧
文章比較了兩種估計人群中病毒流行率的方法:
1、個體測試,即對12000人的樣本進(jìn)行病毒測試,并采用標(biāo)準(zhǔn)二項(xiàng)測試得出95%的置信區(qū)間;
2、群體測試,即對500組35人進(jìn)行測試(總?cè)丝谏婕?7500人)
關(guān)于置信區(qū)間(概率論的知識):
置信區(qū)間是從bai樣本統(tǒng)計du量派生的值范圍,可能包含zhi未知總體參dao數(shù)的值。由于置信區(qū)間zhuan具有隨機(jī)性,因此來shu自特定總體的兩個樣本將不可能生成相同的置信區(qū)間。但是,如果將樣本重復(fù)多次,則在所生成的置信區(qū)間中有特定百分比的置信區(qū)間將包含未知總體參數(shù)。
使用置信區(qū)間可以評估總體參數(shù)的估計值。例如,制造商想要知道他們生產(chǎn)的鉛筆的平均長度是否不同于目標(biāo)長度。制造商隨機(jī)抽取鉛筆樣本,并確定樣本的平均長度為 52 毫米,95% 置信區(qū)間為 (50,54)。因此,所有鉛筆的平均長度介于 50 毫米和 54 毫米之間的可信度為 95%。
簡單的群體測試方案代碼
簡單的群體測試方案需要樣本池和第二輪RNA提取的所有樣本陽性池。
#include <iostream> #include<stdlib.h> #include <vector> #include <ctime>using namespace std; //函數(shù)1,生成一個長度為100的vector,輸入M,生成的一維數(shù)組里面有M個1,100-M個0. void Initial_Group(vector<int>& group,int M) {if (group.empty()){cout <<"group initial failed"<<endl;return;}srand((unsigned)time(NULL));for(int i = 0;i < M;i++){int num = rand() % group.size();//如果已經(jīng)存在了,重新初始化一個numwhile (group[num] == 1){num = rand() % group.size();}//如果不存在的話group[num] = 1;}return; } //函數(shù)2,打印函數(shù) void Pirnt_Group(vector<int>& group) {int length = sqrt(group.size());if (length * length == group.size()){for (int i = 0; i < length; i++){for (int j = 0; j < length; j++){cout << group[i * length + j] << " ";}cout << endl;}}else{for (int i = 0; i < group.size(); i++)cout << group[i] << " ";cout << endl;}return; } //函數(shù)3,分組函數(shù) //輸入:一維序列vector<int>Group ,分組大小num //輸出:二維數(shù)組vector<vector<int>>,將Group分割為大小num的子序列 //A.assign(B.begin(),B.end());將區(qū)間[first,last)的元素賦值到當(dāng)前的vector容器中 void Split_Group(vector<int>& group , vector<vector<int>>& splited_group , int num) {if (group.empty()){cout << "group split falied"<<endl;return;}vector<int>::iterator itr = group.begin();int it = 0;while (it < group.size()){vector<int> tmp;if (it + num <= group.size()){tmp.assign(itr, itr + num);splited_group.emplace_back(tmp);}it = it + num;if(it < group.size())itr = itr + num;}return; } //合成血液函數(shù) //輸入一維序列,只要其中有1,則結(jié)果為1 //輸出結(jié)果矩陣 void Synthetic_Blood(vector<vector<int>>& splited_group, vector<int>& result) {for (int i = 0; i < splited_group.size(); i++){int flag = 0;for (int j = 0; j < splited_group[i].size(); j++){if (splited_group[i][j] == 1){flag = 1;break;}}result.emplace_back(flag);}for (int i = 0; i < result.size(); i++)cout << result[i] << " ";cout << endl;return; } //計算人力物力、時間消耗函數(shù) int Cal_Times(int all_groups, int posi_group_nums,int group_nums_size) {//計算檢測的次數(shù) = 組數(shù) +陽性組數(shù)*陽性組中的樣本大小int result = all_groups + group_nums_size * posi_group_nums;return result; } //將合成血液的結(jié)果中為陽性的序列進(jìn)行單個測試,并記錄結(jié)果到Positive_Samples void Further_Test(vector<vector<int>>& splited_group, vector<int>& result,vector<int>& Positive_Samples) {int posi_group_nums = 0;for (int i = 0; i < result.size(); i++){//說明該分組中有陽性樣本if (result[i] == 1){posi_group_nums++;for (int j = 0; j < splited_group[i].size(); j++){//記錄在原序列中的坐標(biāo)if (splited_group[i][j] == 1)Positive_Samples.emplace_back(i* splited_group[0].size()+j);}}}for (int i = 0; i < Positive_Samples.size(); i++)cout << Positive_Samples[i] + 1 << " ";cout << endl;int spend_time = Cal_Times(result.size(),posi_group_nums, splited_group[0].size());cout <<"時間花費(fèi)" <<endl;cout << spend_time<<endl;return; }int Cal_Money() {return 0; } int main() {int sample_nums = 17500;int positive_sample_nums = 350;int sec_group_sample_nums = 35;vector<int> Positive_Samples;vector<int> Group(sample_nums,0);vector<int> Result;vector<vector<int>> Splited_Group;Initial_Group(Group, positive_sample_nums);//Pirnt_Group(Group);cout << endl;Split_Group(Group, Splited_Group, sec_group_sample_nums);//Pirnt_Split_Group(Splited_Group);cout << endl;Synthetic_Blood(Splited_Group,Result);Further_Test(Splited_Group,Result,Positive_Samples);return 0; }總結(jié)
以上是生活随笔為你收集整理的简单的群体测试方案C++代码(Group testing against Covid-19)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 海思3798机顶盒的用户名和密码多少
- 下一篇: 酒精多少钱啊?