Talaan ng mga Nilalaman:

Upang Mabakuna o Hindi? isang Proyekto sa Pagmamasid sa Kalusugan ng Kawal sa Pamamagitan ng Simulate ng Sakit: 15 Hakbang
Upang Mabakuna o Hindi? isang Proyekto sa Pagmamasid sa Kalusugan ng Kawal sa Pamamagitan ng Simulate ng Sakit: 15 Hakbang

Video: Upang Mabakuna o Hindi? isang Proyekto sa Pagmamasid sa Kalusugan ng Kawal sa Pamamagitan ng Simulate ng Sakit: 15 Hakbang

Video: Upang Mabakuna o Hindi? isang Proyekto sa Pagmamasid sa Kalusugan ng Kawal sa Pamamagitan ng Simulate ng Sakit: 15 Hakbang
Video: Сверла больше не покупаю! Полезная самоделка в каждую мастерскую. 2024, Hulyo
Anonim
Upang Mabakuna o Hindi? isang Proyekto sa Pagmamasid sa Herd Immunity Through Disease Simulation
Upang Mabakuna o Hindi? isang Proyekto sa Pagmamasid sa Herd Immunity Through Disease Simulation

Pangkalahatang-ideya ng proyekto:

Ang aming proyekto ay tuklasin ang kawan ng kaligtasan sa sakit at inaasahan na hikayatin ang mga tao na makakuha ng mga pagbabakuna upang bawasan ang mga rate ng impeksyon sa aming mga komunidad. Ang aming programa ay tinulad kung paano ang isang sakit ay nahahawa sa isang populasyon na may iba't ibang porsyento ng mga nabakunahan at hindi nabakunahan na rate. Ipinapakita nito ang kaligtasan sa kawan sa pamamagitan ng pagpapakita kung paano maaaring mabawasan ng isang mas mataas na bilang ng nabakunahan na populasyon ang bilang ng mga taong apektado.

Ginagawa naming modelo ito sa Matlab gamit ang mga konsepto ng teorya ng grap. Ang teorya ng grap ay isang matematikal na paraan upang kumatawan sa mga ugnayan sa pagitan ng mga bagay. Sa teorya ng grap, ang mga graph ay may mga vertex (o node) na konektado sa pamamagitan ng mga gilid (o mga linya). Para sa aming proyekto, ang mga node ay ang mga indibidwal na nag-aalala at ang mga gilid ay ang kanilang mga koneksyon. Halimbawa, kung ang dalawang mga node ay konektado sa isang gilid kung gayon nangangahulugan ito na sila ay "kaibigan" o mayroong ilang form ng pakikipag-ugnay sa bawat isa. Ang pakikipag-ugnay na ito ay isang paraan upang kumalat ang sakit. Ito ang dahilan kung bakit ginamit namin ang teorya ng grap upang i-modelo ang aming konsepto dahil nais naming makita kung paano kumalat ang sakit sa mga indibidwal na konektado sa isang populasyon.

Ang aming proyekto ay nagsasangkot din ng Pamamaraan ng Monte Carlo. Ang pamamaraang Monte Carlo ay mga algorithm na lumilikha ng paulit-ulit na random sampling upang makatanggap ng mga resulta sa bilang. Sa aming proyekto, ginagamit namin ang pamamaraang ito upang patakbuhin ang aming simulation nang maraming beses na binabago ang porsyento ng paunang hindi na-pre-aksyon upang makita ang rate kung saan ang mga tao ay nahawahan.

Ang lahat ng mga code ng proyekto ay naka-link sa ibaba!

Kredito sa PC:

Matlab na link sa Graph Theory:

Hakbang 1: Lumikha ng Adjacency Matrix

Lumikha ng Adjacency Matrix
Lumikha ng Adjacency Matrix
Lumikha ng Adjacency Matrix
Lumikha ng Adjacency Matrix

Lumikha ng isang bagong script. Tatawagan namin ang aming 'infectionSim.m'.

Lilikha kami ng isang variable na 'NUMOFPEOPLE'. Maaari mong italaga ito sa anumang halaga ng integer. Kinakatawan nito ang bilang ng mga tao sa iyong populasyon.

Mula ngayon, ipapalagay natin iyan

NUMOFPEOPLE = 20;

Magsimula muna sa pamamagitan ng paggamit ng mga pagpapaandar ng teorya ng graph ng Matlab para sa isang hindi direktang grap.

Kung interesado kang matuto nang higit pa, narito ang isang link para mabasa mo nang malalim tungkol dito.

www.mathworks.com/help/matlab/math/directed-and-undirected-graphs.html

Lumikha ng isang adjacency matrix.

adjMatrix = zero (NUMOFPEOPLE);

Lilikha ito ng isang square matrix ng 0. Ang bawat hilera sa matrix ay isang tao. Ang bawat haligi sa matrix ay isang tao o kaibigan na natutugunan ng tao sa buong araw.

Tingnan ang Larawan 100 (sa itaas) upang matulungan na mailarawan kung ano ang hitsura ng adjMatrix para sa 20 tao.

** Mula sa puntong ito ay ipalagay namin ang NUMOFPEOPLE ay katumbas ng 20. **

Maaari mong subukan ang paglalagay ng adjacency matrix na ito. Narito ang kaunti pang impormasyon tungkol sa paglalagay ng mga ganitong uri ng matrices.

Tandaan: Paano gumagana ang adjacency matrix.

Hal:

% ginagawa ang katabing matrix

a = [0, 1, 0, 0, 0; 1, 0, 1, 1, 1; 0, 1, 0, 0, 0; 0, 1, 0, 0, 0; 0, 1, 0, 0, 0]% plotting g = graph (a); % gamit ang grap function (graph theory) na numero (1); h = balangkas (g);

Tingnan ang Larawan 1 (sa itaas) upang makita kung paano magdagdag ng mga gilid sa adjacency matrix, gamit ang code sa "Tandaan".

Hakbang 2: Lumikha ng Mga Pakikipag-ugnay

Lumikha ng Mga Pakikipag-ugnay
Lumikha ng Mga Pakikipag-ugnay

Ngayon na ang mga tao (mga vertex o node) ay nilikha, kailangan naming lumikha ng isang network ng mga relasyon (mga linya o gilid ng grap). Gayahin nito kung paano nakikipag-ugnay ang mga tao at nakikilala ang ibang mga tao sa buong isang araw.

Maaari itong magawa sa maraming paraan. Ang isang paraan upang makumpleto ang gawaing ito ay upang magtalaga muna ng isang random na numero sa bawat tao upang matukoy kung gaano karaming mga tao ang nakikipag-ugnay sa bawat tao sa isang araw.

numOfFriendsMatrix = randi ([leastFriendsPersonCanHave, mostFriendsPersonCanHave], 1, NUMOFPEOPLE);

Gumagawa ito ng isang 1 hanggang 20 matrix ng mga random na integer na kumakatawan sa bilang ng mga pakikipag-ugnayan sa bawat tao ay may isang araw. Ang mga haligi ng matrix na ito ay ang bilang na tumutugma sa bawat tao. Halimbawa kung magtalaga kami ng pinakamaliit na Kaibigan

Nagkakaproblema kay randi ()? Sa terminal, uri

tulungan mo si randi

Susunod, gumawa kami ng isang randomized matrix (tinatawag na "allFriendsmatrix") kung paano nakakonekta / nakikipag-ugnayan ang bawat tao sa populasyon sa loob ng populasyon.

tempMatrix = ;

bilangin = 0; allFriendsMatrix = ; para sa k = 1: NUMOFPEOPLE habang haba (tempMatrix) ~ = numOfFriendsMatrix (k) count = count +1; temp = randi ([1, NUMOFPEOPLE]); tempMatrix (count) = temp; tapusin malinaw ang bawat habang haba (tempMatrix) ~ = 9 tempMatrix = [tempMatrix, NaN]; tapusin ang lahat ng Mga Kaibigan = = lahat ng mga kaibigan; tempMatrix]; tempMatrix = ; bilangin = 0; magtapos

Sa malalim na paliwanag ng code:

Una naming nilikha ang isang walang laman na pansamantalang matrix upang i-hold ang mga kaibigan / listahan ng pakikipag-ugnayan ng bawat tao. Pinasimulan din namin ang bilang, na sinusubaybayan lamang kung saan ilalagay ang bagong random na koneksyon sa tempMatrix. Ang para sa mga loop ay tumatakbo ng 20 beses upang mangyari ito para sa bawat indibidwal na tao sa populasyon. Ang una habang tumatakbo ang loop hanggang sa ang bawat tao'y tempMatrix ay ang parehong haba ng sapalarang itinalagang bilang ng mga pakikipag-ugnay. Sa loop na ito, isang random na numero na naaayon sa tao sa populasyon ang nabuo at inilagay sa tempMatrix. Dahil ang haba ng bawat isa sa mga tempMatrixes ay magkakaiba, kailangan namin upang lumikha ng ilang mga halagang NaN upang maipagsama namin ang lahat ng mga tempMaticies na ito sa isang matrix ('allFriendsMatrix'). Ang pangalawa habang nilulutas ng loop ang problemang ito sa pamamagitan ng pagdaragdag ng NaN sa bawat tempMatrix. Ang loop habang itinakda upang tumakbo ng 9 beses dahil ito ay isang bilang na mas malaki sa 5, na kung saan ay ang pinakamataas na hangganan ng mga kaibigan na maaaring italaga sa isang tao. Ang halagang '9' ay variable at maaaring / dapat mabago kapag ang 'mostFriendsPersonCanHave' ay mas malaki sa 9. Ang huling tatlong linya ng code (hindi kasama ang pagtatapos) ay nagdaragdag ng tempMatrix sa susunod na hilera ng 'allFriendsMatrix'. Pagkatapos ay nililimas nito ang tempMatrix at bilangin para sa susunod na tao.

Paglabas

Ito ang hitsura ng output para sa unang pagpapatakbo sa pamamagitan ng for loop (bago ang huling tatlong linya).

tempMatrix = 16 8 17 16 13 NaN NaN NaN NaN

lahat ng Mga KaibiganMatrix =

16 8 17 16 13 NaN NaN NaN NaN 8 8 2 7 11 NaN NaN NaN NaN 10 13 NaN NaN NaN NaN NaN NaN NaN 11 17 2 NaN NaN NaN NaN NaN NaN 10 12 NaN NaN NaN NaN NaN NaN NaN 4 Na 2 NaN NaN NaN NaN NaN 17 10 9 3 1 NaN NaN NaN NaN 16 16 6 NaN NaN NaN NaN NaN NaN 3 3 17 17 14 NaN NaN NaN NaN NaN 20 19 3 NaN NaN NaN NaN NaN NaN NaN 13 10 NaN NaN NaN NaN NaN NaN 2 18 10 16 NaN NaN NaN NaN NaN 2 6 14 3 13 NaN NaN NaN NaN 8 16 14 8 NaN NaN NaN NaN 7 7 NaN NaN NaN NaN NaN NaN NaN 19 10 9 NaN NaN NaN NaN NaN NaN 10NNNNNNNNN NaN NaN NaN 5 18 NaN NaN NaN NaN NaN NaN NaN 1 7 NaN NaN NaN NaN NaN NaN NaN 16 7 13 10 1 NaN NaN NaN NaN

Susunod, idagdag ang mga ugnayan na ito sa adjMatrix.

para sa bawatRow = 1: NUMOFPEOPLE

para sa bawatCol = 1: 9 kung isnan (allFriendsMatrix (eachRow, eachCol)) == 0 adjMatrix (eachRow, allFriendsMatrix (eachRow, eachCol)) = 1; adjMatrix (allFriendsMatrix (eachRow, eachCol), eachRow) = 1; end end end

Paliwanag sa Code

Ang dobleng para sa loop na ito ay dumadaan sa bawat hilera at haligi ng 'allFriendsMatrix'. Tatakbo ang pahayag kung para sa lahat ng mga halagang hindi 'NaN'. Karaniwan lilikha ito ng mga gilid o linya ng grap. Kaya ang unang linya na gagawin nito ay ang tao 1 sa tao 16 at tao 16 sa tao 1. Dahil ito ay hindi nakadirekta, 1 ang dapat baguhin para sa pareho! Hindi lamang natin maaaring magkaroon ng gilid na 1 hanggang 16 at hindi 16 hanggang 1. Dapat ay simetriko para maayos itong tumakbo sa Matlab.

Sa aming simulation, naitaguyod namin na ang mga tao ay hindi maaaring makipag-ugnay sa kanilang sarili. Kapag na-randomize namin ang mga halaga, may pagkakataon na ang aming katabing matrix ay may mga error na ito.

Ayusin natin ito sa sumusunod na code:

para sa bawat = 1: NUMOFPEOPLE

adjMatrix (bawat isa, bawat isa) = 0; magtapos

Paliwanag sa Code

Tinitiyak nito para sa loop na ang tao 1 ay hindi konektado sa tao 1, ang tao 2 ay hindi konektado sa tao 2, atbp sa pamamagitan ng paggawa sa kanilang lahat ng 0. Tulad ng nakikita mo sa ibaba sa seksyon ng output, mayroon kaming dayagonal ng parisukat ang matrix mula sa kaliwang tuktok hanggang kaliwa sa ibaba ay lahat ng 0.

Paglabas

Ito ang pangwakas na adjMatrix para sa kasalukuyang simulation na ito. Ang account na ito para sa lahat ng mga linya sa grap (Larawan 2).

adjMatrix =

0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 1 0 1 1 0 0 0 1 0 1 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1 1 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 1 1 0 0 0 1 1 0 1 1 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 1 0 1 0 1 0 0 0 0 1 1 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0

Tingnan ang Larawan 2 upang makita ang grap ng 'adjMatrix'.

Hakbang 3: Magdagdag ng Mga Istatistika ng Sakit

Ngayon na ang iyong programa ay maaaring lumikha ng isang graph na may isang hanay ng mga random na tao at lumikha ng mga random na ugnayan, kailangan naming i-input ang impormasyon o mga istatistika ng sakit upang makita kung paano maaaring madagdagan o mabawasan ng impeksyon ang mga pakikipag-ugnay na ito.

Lumikha ng mga variable na ito:

uri ng unvacc%: doble; porsyento ng tsansa ng mga hindi nabuong tao na hindi nagkakasakit

uri ng bakuna%: doble; porsyento ng tsansa ng mga taong nabakunahan na hindi nakakakuha ng karamdaman unvacc_perc% uri: doble; porsyento ng populasyon na hindi nabuo na init_infect% uri: int; porsyento ng populasyon na nabakunahan

Susunod na kailangan naming gumawa ng ilang mga kalkulasyon.

Gagawa kami ng isang 'infectionMat' na isang 3 * NUMOFPEOPLE matrix.

vacc_perc = 1-unvacc_perc;

impeksyonMat = nan (3, NUMOFPEOPLE); numero = bilog (vacc_perc * NUMOFPEOPLE); impeksyonMat (1, 1: numero) = bakuna; impeksyonMat (1, numero + 1: pagtatapos) = unvacc; impeksyonMat (2, 1: katapusan) = 0; impeksyonMat (2, 1: init_infect) = 1;

Paliwanag sa Code

linya 1: Kinakalkula ang porsyento ng populasyon na hindi nabuo ng tuldok

linya 2: lumikha ng isang 3 * N bilang ng mga tao matrix

linya 3: alamin ang bilang ng mga taong nabakunahan mula sa porsyento ng nabakunahan

linya 4: para sa mga taong nabakunahan, bigyan sila ng isang kaligtasan sa sakit na nauugnay sa pagkakaroon ng bakuna. Ang halagang ito ay itinalaga batay sa pagsasaliksik tungkol sa sakit.

linya 5: para sa natitirang populasyon (mga hindi nabakunahan na tao), bigyan sila ng porsyento na kaligtasan sa sakit. Ang halagang ito ay itinalaga batay sa pagsasaliksik tungkol sa sakit.

linya 6: una na itinakda ang lahat ng mga tao na hindi nahawahan.

linya 7: para sa bilang ng mga tao na una na nahawahan, punan ang mga haligi ng unang pares nang naaayon.

Ngayon na naitakda na namin ang lahat ng mga parameter para sa simulate ng sakit, isasabay namin ang random na pagkakataon kung ang tao (parehong nabakunahan at hindi nabakunahan) ay nahawahan. Ginagawa ito sa susunod na hakbang sa pamamagitan ng pagtatalaga ng mga random na halaga sa pagitan ng 0 at 1 sa bawat tao sa ikatlong hilera ng 'infectionMat' na ito.

Hakbang 4: Ipa-randomize ang Pagkakataon na Maaaring Mahawahan ang Isang Nabakunahan at Hindi nabakunahan na Tao

Susunod, magtalaga sa bawat tao ng isang random na numero, ito ay gagamitin sa paglaon upang matukoy kung ang tao ay nahawahan o hindi.

para sa w = 1: haba (impeksyonMat)

impeksyonMat (3, w) = rand; magtapos

Pagpapaliwanag sa code

Ito ay para sa loop na pakikitungo sa pangatlong hilera ng 'infectionMat' na nilikha sa huling hakbang. Nagtatalaga ang 'rand' ng isang halaga sa pagitan ng 0 at 1 sa bawat index ng hilera 3.

Paglabas

infectionMat ay kumpleto na! Ito ay sa populasyon na may 100% pagbabakuna at 1 tao na una na nahawahan.

impeksyonMat =

Mga Haligi 1 hanggang 12 0.7500 0.7500 0.7500 0.7500 0.7500 0.7500 0.7500 0.7500 0.7500 0.7500 0.7500 0.7500 1.0000 0 0 0 0 0 0 0 0 0 0 0 0.0869 0.5489 0.3177 0.9927 0.7236 0.5721 0.7172 0.9766 0.4270 0.9130 0.8973 0.8352 0.001 0.002 0.7500 0.7500 0 0 0 0 0 0 0 0 0.0480 0.3593 0.2958 0.6291 0.1362 0.3740 0.8648 0.2503

hilera 1: Porsyento ng posibilidad na HINDI makuha ang sakit

hilera 2: Nahawa o hindi nahawahan (halaga ng boolean)

hilera 3: Bilang na ginamit upang suriin kung ang taong hindi nahawahan ay nahawahan kung makilala nila ang isang taong nahawahan. Kung ang taong hindi naka-impeksyon ay nakakatugon sa taong nahawahan, ang bilang na ito ay mas malaki kaysa sa bilang sa hilera 1 (para sa parehong haligi), pagkatapos ay nahawahan sila. Kami ay code ang pagpapaandar na ito sa hakbang 7.

Hakbang 5: Lumikha ng Mga Matrice ng Mga Tao Na Hindi Na-aktinat at Naapektuhan Mula sa Paunang Impormasyon

Lumikha ng 2 matris na tinatawag na "matrixUnvacc" at "matrixInfected" na nag-iimbak ng lahat ng mga nahawaang tao mula sa impeksyonMat. Gagamitin ito upang maaari naming makulay sa code ang grap ng mga nahawahan, hindi nabakunahan, o nabakunahan, na tumutulong na mailarawan ang epekto ng mga hindi nabakunahan kumpara sa mga nabakunahang indibidwal.

limasin ang bawat isa

matrixInfected = ; matrixUnvacc = ; para sa h = 1: haba (infectionMat) kung impeksyonMat (1, h) == unvacc matrixUnvacc = [matrixUnvacc, h]; end end para sa tao = 1: NUMOFPEOPLE kung impeksyonMat (2, tao) == 1 matrixInfected = [matrixInfected, person]; pagtatapos ng wakas

Paliwanag sa Code

Lumikha ng dalawang walang laman na matris upang maiimbak ang mga bilang ng mga tao na hindi nabakunahan at nahawahan, ayon sa pagkakabanggit. Ang parehong para sa mga loop ay tumatakbo ng 20 beses at kung ang kung pahayag ay nasiyahan, pagkatapos ang numero ay idinagdag sa tamang matrix.

Paglabas

matrixUnvacc =

matrixInfected =

[1]

Hakbang 6: Plot Initial Graph

Plot Initial Graph
Plot Initial Graph

Susunod na gagawin namin ang balangkas ng adjacency matrix.

g = grap (adjMatrix);

figure (1) p = plot (g, 'NodeColor', 'b', 'MarkerSize', 7); highlight (p, matrixUnvacc, 'NodeColor', 'g') highlight (p, matrixInfected, 'NodeColor', 'r') title_unvacc = unvacc_perc * 100; pamagat (['Porsyento ng mga taong hindi nabuo ng akusado:', num2str (title_unvacc), '%']); huminto (bilis)

Pagpapaliwanag sa code

Ang teorya ng grap sa Matlab ay nakabuo ng mga pag-andar. Kapag ginamit namin ang pag-andar ng graph (), nagawang isalin ang 'adjMatrix' sa isang aktwal na hindi na nakadirektang grap. Pagkatapos ay kailangan naming lumikha ng isang balangkas gamit ang plot () na function upang aktwal na makita kung ano ang hitsura nito. Itinakda namin ang plot na ito () sa isang variable upang maaari naming manipulahin at baguhin ang mga kulay ng isang lagay ng lupa nang mas madali sa buong simulation. Ang lahat ng mga tao (o mga node) ay paunang itinakda sa kulay na 'asul'. Susunod, ang lahat ng mga hindi nabakunahang tao ay nakatakda sa kulay na 'berde'. Ang mga nahawahan ay itinakda sa kulay na 'pula'. Ang pamagat ay itinakda alinsunod sa tiyak na porsyento na halaga ng mga hindi nabigyan ng tumpak na tao na nasubok. Ang pag-andar ng pause () ay pansamantalang humihinto sa pagpapatupad ng MatLab. Dumaan kami sa variable na bilis na kumakalat na kinakalkula sa mga segundo.

Tingnan ang larawan (sa itaas) upang makita ang isang random na kulay na naka-code na grap.

Matuto nang higit pa tungkol sa pag-andar ng highlight () sa MatLab.

Hakbang 7: Gayahin ang Pag-unlad ng Impeksyon

Susunod na kailangan namin upang malaman kung sino ang nahawahan pagkatapos ng mga pakikipag-ugnayan (naitala sa adjMatrix) at i-update ang graph kapag ang isang tao ay nahawahan.

Gamitin ang adjMatrix upang matukoy kung aling mga tao ang nahawahan pagkatapos ng kanilang pakikipag-ugnay sa mga tao sa isang araw.

para sa bawatRow = 1: haba (adjMatrix)

kung infectionMat (2, bawatRow) == 1 para sa bawatCol = 1: haba (adjMatrix) kung adjMatrix (eachRow, eachCol) == 1% eachRow = ang taong% eachCol = ang kaibigan nito% ang kaibigan ng bawat tao at tingnan kung nahawahan sila. kung impeksyonMat (3, bawatCol)> impeksyonMat (1, bawatCol) impeksyonMat (2, bawatCol) = 1; i-highlight (p, eachCol, 'NodeColor', 'r') i-pause (bilis) ang dulo ng pagtatapos ng dulo ng pagtatapos

Ang para sa loop loop sa bawat tao. Sinusuri nito na kung ang tao ay nahawahan, susuriin nito ang bawat isa sa mga tao / kaibigan na nakasalamuha nila at susuriin kung ang antas ng kaligtasan sa sakit ng kaibigan ay mas malaki kaysa sa lakas ng sakit. Dito nag-play ang 'infectionMat' na nilikha namin kanina. Ang ika-1 at ika-3 hilera ng bawat haligi ng kaibigan ay inihambing at kung ang ika-3 hilera ay mas malaki, nangangahulugan ito na ang kaibigan ay walang sapat na kaligtasan sa sakit upang makatakas sa sakit at sa huli ay mahawahan. Nagbabago rin kami sa kulay gamit ang highlight () sa pula kung nahawahan sila.

Ngayon ang iyong code para sa simulation ay dapat na gumana! at para sa anumang laki ng populasyon, baguhin lang ang NUMOFPEOPLE!

Hakbang 8: Gumamit ng Teoryang Monte Carlo

Upang maisagawa pa ang isang hakbang na ito at kumuha ng data mula sa aming simulator ('infectionSim.m'), nais naming kalkulahin at i-graph ang kalakaran sa porsyento ng mga hindi nabakunsyang taong nahawahan at ang porsyento ng mga nabakunahan na nahawahan. Naisip namin na ang porsyento ng mga taong nabakunahan na nahawahan ay dapat na mas mababa kaysa sa porsyento ng mga hindi nabakunahan na mga taong nahawahan.

Hakbang 9: Gawin ang File ('infectionSim.m') Gamit ang Simulation Sa Isang Pag-andar

Upang patakbuhin ang Monte Carlo, nais naming patakbuhin ang simulasi nang maraming beses at makaipon ng data upang magamit namin iyon upang mai-graph ang mga porsyento ng mga taong nahawahan.

Maaaring i-set up ang pagpapaandar tulad nito:

output output = infectionSim (unvacc, vacc, NUMOFPEOPLE, unvacc_perc, init_infect, bilis)

I-puna ang mga variable sa iyong simulation dahil ngayon ay ipinapasa mo ang mga ito sa pangunahing file (magsisimula kaming isulat ito sa hakbang 12):

unvacc, vacc, NUMOFPEOPLE, unvacc_perc, init_infect

Ang bagong variable

bilis

itatalaga sa pangunahing file (Monte_Carlo.m).

Tandaan: Huwag kalimutan ang dulo sa ilalim ng file ng pag-andar upang wakasan ang pagpapaandar!

Hakbang 10: Kalkulahin ang Porsyento ng Mga Hindi Nabiktima at Nabakunahan na Mga Tao na Nahawahan

Kinakalkula nito ang porsyento ng mga hindi nabakunahang tao na nahawahan. Ang code na ito ay napupunta sa ilalim ng 'infectionSim.m' na file.

number_of_unvacc = 0;

number_of_infec_unvacc = 0; Kinakalkula ng% ang porsyento ng mga taong hindi nabakunahan na nahawahan para sa x = 1: haba (impeksyonMat) kung impeksyonMat (1, x) == numero ng unvacc_of_unvacc = numero_of_unvacc + 1; tapusin kung ang impeksyonMat (1, x) == unvacc & infectionMat (2, x) == 1 numero_of_infec_unvacc = number_of_infec_unvacc +1; pagtatapos porsyento ng pagtatapos_of_unvacc_and_infec = (number_of_infec_unvacc / number_of_unvacc) * 100;

Pagpapaliwanag sa code

Sa para sa loop, ito ay loop sa loob ng NUMOFPEOPLE beses. Sa tuwing ang numero sa impeksyonMat ay tumutugma sa numero ng unvacc (ibig sabihin 0.95 == 0.95), kung gayon ang bilang ng mga hindi nabuong tao ay tataas ng 1. Sa tuwing ang numero sa impeksyonMat ay tumutugma sa numero ng unvacc at sila ay nahawahan, ang bilang ng mga nahawahan at hindi nabakunahan na pagtaas ng 1. Ang huling linya ay hinahati sa bilang ng mga nahawahan, hindi nabakunahan na mga tao sa kabuuang bilang ng mga hindi nabakunahan. Pagkatapos ang porsyento ay kinakalkula mula dito.

Hamon:

Subukang kalkulahin ang porsyento ng nabakunahan ng mga taong nahawahan! (Pahiwatig: ito ay halos kapareho ng sa itaas ng code na ito, subalit ang ilan sa mga variable ay nabago at ang mga pangalan ay nababagay.)

Susunod ang porsyento ng mga taong nahawahan batay sa kabuuang populasyon ay kinakalkula:

pre_per_infect = cumsum (infectionMat (2,:));

per_infect = (pre_per_infect (1, NUMOFPEOPLE) / NUMOFPEOPLE) * 100;

Pagpapaliwanag sa code

Ang pinagsama-samang kabuuan ay kinakalkula gamit ang pangalawang hilera ng impeksyonMat, na nag-iimbak ng 1 at 0 depende kung ang tao ay nahawahan o hindi. Dahil ang pagpapaandar ng cumsum () ay nagbabalik ng isang matrix, kinukuha namin ang huling halaga sa matrix ('pre_per_infect (1, NUMOFPEOPLE)'), na dapat ay ang aktwal na kabuuan ng lahat ng mga halaga mula sa 'infectionMat (2,:)'. Sa pamamagitan ng paghahati sa kabuuan ng NUMOFPEOPLE at pag-multiply nito sa 100, nakukuha namin ang huling porsyento ng mga nahawahan sa kabuuang populasyon.

Hakbang 11: Lumikha ng isang Variable ng Output sa Iyong Function na 'impeksyonSim.m'

output = [per_infect, porsyento_of_unvacc_and_infec, porsyento_of_vacc_and_infec];

Pagpapaliwanag sa code

Iimbak ang impormasyong ito sa output, na ibabalik sa pangunahing (Monte_Carlo.m) kapag tinawag at tapos na ang pagpapaandar. Ginagamit ang data na ito upang mai-graph ang mga puntos ng porsyento ng mga nahawahan ng mga nabakunahan at hindi nabakunahan.

Ang iyong function na 'infectionSim.m' ay dapat gawin ngayon! Gayunpaman, hindi ito tatakbo dahil kailangan pa nating isulat ang pangunahing!

Hakbang 12: Lumikha ng isang Menu upang Kumuha ng Mga Paunang Kundisyon ng Simulation Mula sa Gumagamit

Tandaan kung paano namin nasabi ang variable

bilis

ay nilikha at naipasa sa pangunahing pagpapaandar? Kailangan nating makuha ang mga halaga upang makapasa sa pagpapaandar. Tandaan, ang pagkakasunud-sunod ng mga halaga kapag tumatawag sa pagpapaandar ay mahalaga!

Magsimula sa pamamagitan ng pagtatanong sa gumagamit na mag-type ng ilang mga sagot sa terminal.

> Pumili ng isang sakit. Tandaan ito ay sensitibo sa kaso >> Pertussis >> Flu >> Campus >> Pinili ng Sakit: Flu >> Piliin ang laki ng populasyon. >> 20 >> 200 >> Pinili ang populasyon: 20 >> Pumili ng bilis ng kunwa. >> Mabilis >> Mabagal >> Bilis na napili: Mabilis

Ang code na ito sa ibaba ay nagtanong sa gumagamit kung anong sakit ang nais nilang tingnan.

disp ('Pumili ng isang sakit. Tandaan na ito ay sensitibo sa kaso')

fprintf ('Pertussis / nFlu / nMeasles / n') sakit = input ('Pinili ng Sakit:', 's'); kung isequal (sakit, 'Pertussis') na bakuna =.85; % 15 porsyento ng tsansa na makakuha ng sakit na unvacc =.20; % 80 porsyento ng tsansa na magkaroon ng sakit kung hindi man pantay (sakit, 'Flu') na bakuna =.75; % 25 porsyento ng tsansa na makakuha ng sakit na unvacc =.31; % 69 porsyento ng tsansa na magkaroon ng sakit kung hindi man pantay (karamdaman, 'Mga Pagdurusa') na bakuna =.97; % 3 porsyento ng tsansa na makakuha ng sakit na unvacc =.10; % 90 porsyento ng tsansa na matapos ang sakit

Paliwanag sa code:

Ang pagpapaandar ng disp () ay naglilimbag ng pahayag sa screen at inililimbag din nito ang iba't ibang mga pagpipilian. Ang sakit ay itatalaga alinsunod dito. Ang bersyon na ito ay hindi kasalukuyang account para sa hindi wastong pag-input. Ang di-wastong pag-input ay makakapagdulot ng isang error at ganap na ititigil ang programa. Ang bawat sakit ay may mga bakuna at hindi wastong halaga na nauugnay dito. Ang mga halagang ito ay HINDI random. Nakuha namin ang mga halagang ito mula sa pagsasaliksik ng mga istatistika tungkol sa mga sakit.

Susunod, kailangan naming tanungin ang gumagamit kung nais nilang subukan ang isang malaki o maliit na sukat ng populasyon para sa kanilang napiling sakit.

disp ('Piliin ang laki ng populasyon.')

fprintf ('20 / n200 / n ') bilis = input (' Pinili ang populasyon: ',' s '); kung pantay (bilis, '20') populasyon_size = 20; kung hindi man pantay (bilis, '200') populasyon_size = 200; magtapos

Pagpapaliwanag sa code

Ito ay naglilimbag ng isang pahayag sa gumagamit at hinihiling sa gumagamit na ipasok kung anong laki ng populasyon ang nais nitong subukan. Ang bersyon na ito ay hindi kasalukuyang account para sa hindi wastong pag-input. Ang di-wastong pag-input ay makakapagdulot ng isang error at ganap na ititigil ang programa. 20 ang napili sapagkat ito ay isang maliit na sukat ng sample na nagbibigay pa rin ng isang magandang ideya kung paano kumalat ang impeksyon sa isang maliit na populasyon. 200 katao ang napili bilang mas malaking pagpipilian sapagkat ang 200 puntos na naka-plot sa grap ay halos walang anumang magkakapatong na mga puntos sa gayon ang lahat ay madaling makita at makilala mula sa bawat isa.

Susunod, kailangan nating hanapin ang bilis ng simulation.

disp ('Pumili ng bilis ng kunwa.')

fprintf ('Mabilis / nSlow / n') bilis = input ('Napili ang bilis:', 's'); kung pantay (bilis, 'Mabilis') sim_speed = 0; ifif isequal (bilis, 'Mabagal') sim_speed = 0.25; magtapos

Pagpapaliwanag sa code

Ang prosesong ito ay kapareho ng pagkuha ng uri ng sakit at laki ng populasyon. Para sa mabilis, walang paghinto. at para sa mabagal, magkakaroon ng isang 0.25 segundo na pagkahuli sa para sa loop kapag nagpapatakbo ng simulation.

Malaki! Ngayon mayroon kaming lahat ng mga input mula sa gumagamit na kailangan namin! Magpatuloy tayo sa pagkolekta ng data para sa iba't ibang mga porsyento ng mga hindi nabakunsyang tao.

Hakbang 13: Pumili ng isang% ng Mga Tao na Walang Tuntok at Kalkulahin ang Karaniwan ng Hindi na-aktinat at Nahawahan para sa Piniling Porsyento

Ang code na ito ay para sa 0% ng mga hindi nabakunahang tao.

% -------% 0 Hindi nabakunahan ------------

per_infect_av_0 = ; porsyento_of_unvacc_and_infec_av_0 = ; para sa i = 1:20 out = infectionSim (unvacc, vacc, populasyon_size, 0, 1, sim_speed); per_infect_av_0 = [per_infect_av_0, palabas (1, 1)]; porsyento_of_unvacc_and_infec_av_0 = [porsyento_of_unvacc_and_infec_av_0, palabas (1, 2)]; tapusin ang average_infected_0 = ibig sabihin (per_infect_av_0); average_unvacc_and_infected_0 = ibig sabihin (porsyento_of_unvacc_and_infec_av_0);

Paliwanag sa code:

Ang for loop ay pinapatakbo ng 20 beses. Ang output mula sa pagpapaandar, impeksyonSim (), ay nakaimbak sa labas. Sa tuwing tumatakbo ang loop, pagkatapos ang porsyento ng mga nahawahan sa kabuuang populasyon ay idinagdag sa matrix, 'per_infect_av_0'. Bukod pa rito, ang porsyento ng hindi nabuo at nahawahan ay idinagdag sa bawat oras sa 'porsyento_of_unvacc_and_infec_av_0' matrix. Sa huling dalawang linya, ang dalawang nabanggit sa itaas na mga matris ay na-average at naimbak sa mga variable. Sa kabuuan, ang mga porsyento ay nakaimbak para sa bawat kunwa, average, at graphed. Ginagamit ang Monte Carlo upang ipakita ang average na halaga ng pagpapatakbo ng isang simulation at ipakita ang resulta. Para sa aming mga layuning pang-eksperimentong, pinili naming patakbuhin ang simulation ng 20 beses at average ang mga halagang iyon.

Hamon:

Ulitin para sa lahat ng mga porsyento na nais mong subukan! Magagawa ito sa pamamagitan ng pagbabago ng mga variable na pangalan ayon sa porsyento ng mga numero. Sinubukan namin para sa 0%, 5%, 10%, 20%, 30%, at 50%.

Pahiwatig:

Ang linya lamang na dapat mabago sa aktwal na code ay

out = infectionSim (unvacc, vacc, populasyon_size, 0, 1, sim_speed);

Baguhin ang zero sa porsyento sa decimal form. Halimbawa, para sa 5% na hindi nabuong simulate, ang 0 ay dapat mapalitan ng 0.5.

Hakbang 14: Grap: 'Ang Uso ng Impeksyon sa Mga Hindi na-akdang Vs. Nabakunahan para sa Tinukoy na Sakit '

Ito ang code upang makagawa ng isang grapiko ng takbo ng impeksiyon sa mga hindi nabakunahan na tao kumpara sa mga hindi nabakunahan.

graph_mat_y = [average_infected_0, average_infected_5, average_infected_10, average_infected_20, average_infected_30, average_infected_50];

graph_mat_x = [0, 5, 10, 20, 30, 50]; slope = (average_infected_5-average_infected_0) / 5; line_y = [average_infected_0, (slope * 50) + average_infected_0]; line_x = [0, 50]; figure (2) plot (graph_mat_x, graph_mat_y); linya (line_x, line_y, 'Kulay', 'pula', 'LineStyle', '-'); pamagat (['Trend in Unvaccination for', disease]); xlabel ('Porsyento ng Paunang Hindi na-akdang'); ylabel ('Porsyento ng Huling Nahawahan')

Pagpapaliwanag sa code

linya 1: itinalaga y halaga sa mga average ng porsyento na nahawahan

linya 2: itinalaga x mga halaga sa porsyento ng paunang porsyento na hindi na-aayos

linya 3: kalkulahin ang slope ng 0% at 5%

linya 4: mag-imbak ng mga halagang y ng linya. Ito ay pagpapatuloy ng seksyong 0% hanggang 5%.

linya 5: mag-imbak ng mga halagang y ng linya. Ang linya na ito ay sumasaklaw sa haba ng grap.

linya 6: lumikha ng pigura

linya 7: balangkas ang mga halagang grapiko x at y ng porsyento na nahawahan, na hindi nabakunahan.

linya 8: balangkas ang linya. Ginagamit ito upang maipakita na hindi ito tumataas nang linear, ngunit exponentially.

linya 9: Itakda ang pamagat para sa grap.

linya 10-11: Itakda ang x at y mga label para sa grap.

Ngayon ay dapat mong makita na ang mas malaking porsyento ng populasyon na hindi nabakunahan, ang mas maraming impeksyon. Makikita mo rin na ang karamihan sa mga tuldok na namumula ay mga berdeng tuldok, na ipinapakita na ang bakuna ay makakatulong sa ilang antas! Sana nagustuhan mo ang tutorial na ito. Magkomento kung mayroon kang anumang mga katanungan!

Hakbang 15: Pangwakas na Produkto: Ano ang Mukha ng Simulation

Ang lahat ng mga code ay matatagpuan dito

Inirerekumendang: