Sisällysluettelo:

Rokotettava vai ei? hanke paimen immuniteetin havaitsemisesta sairaussimulaation avulla: 15 vaihetta
Rokotettava vai ei? hanke paimen immuniteetin havaitsemisesta sairaussimulaation avulla: 15 vaihetta

Video: Rokotettava vai ei? hanke paimen immuniteetin havaitsemisesta sairaussimulaation avulla: 15 vaihetta

Video: Rokotettava vai ei? hanke paimen immuniteetin havaitsemisesta sairaussimulaation avulla: 15 vaihetta
Video: Rokotukset ennen ja nyt - symposium 30.3.2021 2024, Marraskuu
Anonim
Rokotettava vai ei? hanke paimen immuniteetin havaitsemisesta sairaussimulaation avulla
Rokotettava vai ei? hanke paimen immuniteetin havaitsemisesta sairaussimulaation avulla

Katsaus projektiin:

Projektimme tutkii karjan koskemattomuutta ja toivoo rohkaisevansa ihmisiä rokotuksiin, jotta voidaan vähentää tartuntatautia yhteisöissämme. Ohjelmamme simuloi, kuinka sairaus tartuttaa väestön, jolla on eri prosenttiosuus rokotetuista ja rokottamattomista. Se osoittaa karjan koskemattomuuden osoittamalla, kuinka lisääntynyt määrä rokotettua väestöä voi vähentää tartunnan saaneiden ihmisten määrää.

Mallinnamme tämän Matlabissa graafiteorian käsitteiden avulla. Graafiteoria on matemaattinen tapa esittää objektien välisiä suhteita. Graafiteoriassa kuvaajalla on kärkiä (tai solmuja), jotka on liitetty reunoilla (tai viivoilla). Projektissamme solmut ovat asianomaisia henkilöitä ja reunat ovat niiden yhteyksiä. Jos esimerkiksi kaksi solmua on liitetty reunaan, se tarkoittaa, että he ovat "ystäviä" tai että heillä on jonkinlainen yhteys toisiinsa. Tämä kosketus on tapa taudin leviämiseen. Siksi käytimme graafiteoriaa konseptimme mallintamiseen, koska halusimme nähdä, miten tauti leviää populaatiossa olevien yksilöiden kesken.

Projektimme sisältää myös Monte Carlon menetelmän. Monte Carlo -menetelmä on algoritmeja, jotka luovat toistuvan satunnaisnäytteenoton numeeristen tulosten saamiseksi. Projektissamme käytämme tätä menetelmää simulaation suorittamiseen useita kertoja muuttamalla alkuperäisten rokottamattomien prosenttiosuutta nähdäksemme ihmisten tartuntaprosentin.

Kaikki projektikoodit on linkitetty alareunaan!

PC-luotto:

Matlab-linkki kuvaajateoriaan:

Vaihe 1: Luo vierekkäismatriisi

Luo vierekkäismatriisi
Luo vierekkäismatriisi
Luo vierekkäismatriisi
Luo vierekkäismatriisi

Luo uusi käsikirjoitus. Alamme kutsua infektiomme Sim.m.

Luomme muuttujan 'NUMOFPEOPLE'. Voit määrittää sen mihin tahansa kokonaislukuarvoon. Tämä edustaa väestönne ihmisten määrää.

Tästä lähtien oletamme sen

NUMOFPEOPLE = 20;

Aloita ensin käyttämällä Matlabin graafiteoriafunktioita ohjaamattomalle kuvaajalle.

Jos olet kiinnostunut oppimaan lisää, tässä on linkki, josta voit lukea siitä tarkemmin.

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

Luotu vierekkäismatriisi.

adjMatrix = nollia (NUMOFPEOPLE);

Tämä luo neliömatriisin 0s. Matriisin jokainen rivi on henkilö. Jokainen matriisin sarake on henkilö tai ystävä, jonka henkilö tapaa päivän aikana.

Katso kuva 100 (yllä) auttaaksesi visualisoimaan, miltä adjMatrix näyttää 20 henkilölle.

** Tästä lähtien oletamme, että NUMOFPEOPLE on 20. **

Voit yrittää piirtää tämän vierekkäismatriisin. Tässä on hieman lisätietoja tämän tyyppisten matriisien piirtämisestä.

Huomautus: Kuinka vierekkäismatriisi toimii.

Esimerkki:

%tekee viereisen matriisin

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] %piirtäminen g = kaavio (a); %käyttäen kuvaajafunktiota (kuvaajateoria) kuva (1); h = käyrä (g);

Katso kuva 1 (yllä), kuinka reunat lisätään vierekkäiseen matriisiin käyttämällä huomautuksen koodia.

Vaihe 2: Luo suhteita

Luo suhteita
Luo suhteita

Nyt kun ihmiset (pisteet tai solmut) on luotu, meidän on luotava suhteiden verkosto (kaavion viivat tai reunat). Tämä simuloi ihmisten vuorovaikutusta ja tapaa muita ihmisiä koko päivän.

Tämä voidaan tehdä monella tavalla. Yksi tapa suorittaa tämä tehtävä on antaa jokaiselle henkilölle ensin satunnaisluku sen määrittämiseksi, kuinka monen ihmisen kanssa hän on vuorovaikutuksessa päivässä.

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

Tämä tekee 1: 20 -matriisin satunnaisia kokonaislukuja, jotka edustavat vuorovaikutusten lukumäärää jokaisella päivässä. Tämän matriisin sarakkeet olisivat kutakin henkilöä vastaava luku. Jos esimerkiksi määritämme vähintäänFriendsPersonCanHave = 2 ja mostFriendsPersonCanHave = 5, saisimme satunnaiset arvot välillä 2 ja 5.

Onko sinulla vaikeuksia randin () kanssa? Kirjoita terminaaliin

apua randi

Seuraavaksi teemme satunnaistetun matriisin (nimeltään "allFriendsmatrix") siitä, miten jokainen väestön henkilö on yhteydessä/vuorovaikutuksessa populaation sisällä.

tempMatrix = ;

määrä = 0; allFriendsMatrix = ; k = 1: NUMOFPEOPLE, kun pituus (tempMatrix) ~ = numOfFriendsMatrix (k) count = count +1; lämpötila = randi ([1, NUMOFPEOPLE]); tempMatrix (count) = lämpötila; loppu tyhjä jokaisen kun pituus (tempMatrix) ~ = 9 tempMatrix = [tempMatrix, NaN]; end allFriendsMatrix = [allFriendsMatrix; tempMatrix]; tempMatrix = ; määrä = 0; loppuun

Koodin perusteellinen selitys:

Luomme ensin tyhjän väliaikaisen matriisin jokaisen kaveri-/vuorovaikutusluettelon säilyttämiseksi. Alustamme myös laskennan, joka vain seuraa, minne liittää uusi satunnainen yhteys tempMatrixiin. For -silmukat suoritetaan 20 kertaa niin, että tämä tapahtuu jokaiselle väestön henkilölle. Ensimmäinen silmukka kulkee, kunnes kunkin henkilön tempMatrix on sama pituus satunnaisesti määritellystä vuorovaikutuksesta. Tässä silmukassa luodaan satunnaisluku, joka vastaa väestön henkilöä ja sijoitetaan tempMatrixiin. Koska jokaisen tempMatrixin pituus on erilainen, meidän oli luotava joitakin NaN -arvoja, jotta voimme yhdistää nämä kaikki tempMaticies yhdeksi matriisiksi ('allFriendsMatrix'). Toinen silmukka ratkaisee tämän ongelman lisäämällä NaN -yhdisteitä kuhunkin tempMatrixiin. While -silmukka asetettiin toimimaan 9 kertaa, koska se on numero, joka on suurempi kuin 5, joka oli kavereiden yläraja, jolle henkilö voidaan määrittää. Arvo "9" on muuttuva ja sitä voidaan/täytyy muuttaa, kun "mostFriendsPersonCanHave" on suurempi kuin 9. Kolme viimeistä koodiriviä (lukuun ottamatta loppua) lisää tempMatrixin "allFriendsMatrix" -riville. Sitten se tyhjentää tempMatrixin ja laskee seuraavan henkilön.

Lähtö

Tämän ulostulon pitäisi näyttää ensimmäiseltä for -silmukan läpi (ennen kolmea viimeistä riviä).

tempMatrix = 16 8 17 16 13 NaN NaN NaN NaN

allFriendsMatrix =

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 13 2 12 NaN NaN NaN NaN NaN 17 10 9 3 1 NaN NaN NaN NaN 16 16 6 NaN NaN NaN NaN NaN NaN 3 8 17 17 14 NaN NaN NaN NaN 20 19 3 NaN NaN NaN NaN NaN NaN 13 10 NaN NaN 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 NaN 7 7 NaN NaN NaN NaN NaN NaN NaN 19 10 9 NaN NaN NaN NaN NaN NaN NaN 10 19 NaN NaN NaN NaN NaN NaN NaN 5 18 NaN 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 NaN

Lisää seuraavaksi nämä suhteet adjMatrixiin.

jokaiselle riville = 1: NUMOFPEOPLE

for eachCol = 1: 9 if isnan (allFriendsMatrix (eachRow, eachCol)) == 0 adjMatrix (eachRow, allFriendsMatrix (eachRow, eachCol)) = 1; adjMatrix (allFriendsMatrix (eachRow, eachCol), eachRow) = 1; loppu loppu loppu

Koodin selitys

Tämä kaksinkertainen silmukka kulkee jokaisen allFriendsMatrix -rivin ja sarakkeen läpi. If -lause suoritetaan kaikille arvoille, jotka eivät ole "NaN". Pohjimmiltaan se luo kaavion reunat tai viivat. Joten ensimmäinen rivi, jonka tämä tekee, on henkilö 1 henkilölle 16 ja henkilö 16 henkilölle 1. Koska se on suunnaton, 1 on muutettava molemmille! Meillä ei voi olla vain reuna 1-16 eikä 16-1. Niiden on oltava symmetrisiä, jotta se toimii oikein Matlabissa.

Simulaatiossamme totesimme, että ihmiset eivät voi olla vuorovaikutuksessa itsensä kanssa. Kun satunnaistimme arvot, on mahdollista, että viereisessä matriisissa on tämä virhe.

Korjataan tämä seuraavalla koodilla:

jokaiselle = 1: NUMOFPEOPLE

adjMatrix (kukin, jokainen) = 0; loppuun

Koodin selitys

Tämä silmukalle varmistaa, että henkilö 1 ei ole yhteydessä henkilöön 1, henkilö 2 ei ole yhteydessä henkilöön 2 jne. Tekemällä ne kaikki 0: ksi. matriisi vasemmalta ylhäältä alas oikealle ovat kaikki 0.

Lähtö

Tämä on viimeinen adjMatrix tälle nykyiselle simulaatiolle. Tämä vastaa kaikkia kaavion rivejä (kuva 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

Katso kuva 2 nähdäksesi adjMatrix -kaavion.

Vaihe 3: Lisää sairaustilastoja

Nyt kun ohjelmasi voi luoda kaavion, jossa on joukko satunnaisia ihmisiä ja luoda satunnaisia suhteita, meidän on syötettävä taudin tiedot tai tilastot nähdäksemme, kuinka nämä vuorovaikutukset populaatiossa voivat lisätä tai vähentää infektiota.

Luo nämä muuttujat:

unvacc %tyyppi: kaksinkertainen; prosenttiosuus siitä, että rokottamattomat ihmiset eivät saa sairautta

rokote %tyyppi: kaksinkertainen; prosenttiosuus siitä, että rokotetut eivät saa sairautta unvacc_perc %type: double; prosenttiosuus rokottamattomia init_infect %type: int; prosenttia rokotetuista väestöstä

Seuraavaksi meidän on tehtävä joitakin laskelmia.

Aiomme tehdä 'infektioMat', joka on 3*NUMOFPEOPLE -matriisi.

vacc_perc = 1-unvacc_perc;

infektioMat = nan (3, NUMOFPEOPLE); numero = pyöreä (vacc_perc * NUMOFPEOPLE); infektioMat (1, 1: luku) = rokote; infektioMat (1, luku+1: loppu) = unvacc; infektioMat (2, 1: loppu) = 0; infektioMat (2, 1: init_infect) = 1;

Koodin selitys

rivi 1: Rokottamattoman populaation prosenttiosuus laskettu

rivi 2: luo 3*N ihmismatriisi

rivi 3: selvitä rokotettujen määrä rokotetuista prosenttiosuuksista

rivi 4: Anna rokotetuille ihmisille rokotteen saamiseen liittyvä immuniteetti. Tämä arvo määritetään tautia koskevan tutkimuksen perusteella.

rivi 5: Muille väestöryhmille (rokottamattomat) annetaan heille prosenttiosuus. Tämä arvo määritetään tautia koskevan tutkimuksen perusteella.

rivi 6: aseta aluksi kaikki ihmiset tarttumatta.

rivi 7: alun perin tartunnan saaneiden lukumäärän osalta täytä pari ensimmäistä saraketta.

Nyt kun olemme asettaneet kaikki parametrit taudinsimulaatioon, aiomme satunnaistaa mahdollisuuden saada henkilö (sekä rokotettu että rokottamaton) tartunnan. Tämä tehdään seuraavassa vaiheessa määrittämällä satunnaisarvot väliltä 0 ja 1 kullekin tämän infektioMatin kolmannen rivin henkilölle.

Vaihe 4: Satunnaista mahdollisuus, että rokotettu ja rokottamaton henkilö voi saada tartunnan

Määritä seuraavaksi jokaiselle henkilölle satunnaisluku, jota käytetään myöhemmin sen määrittämiseen, saako henkilö tartunnan vai ei.

w = 1: pituus (infektioMat)

infektioMat (3, w) = randi; loppuun

Koodin selitys

Tämä silmukka käsittelee viimeisessä vaiheessa luodun infektioMatin kolmatta riviä. 'rand' määrittää arvon väliltä 0 ja 1 kullekin rivin 3 indeksille.

Lähtö

Matto on nyt valmis! Tämä oli väestö, joka oli 100% rokotettu ja 1 henkilö sai alkunsa.

infektioMat =

Sarakkeet 1-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,00 0,7500 Sarakkeet 0.7500 0.7500 0 0 0 0 0 0 0 0 0 0.0480 0.3593 0.2958 0.6291 0.1362 0.3740 0.8648 0.2503

rivi 1: prosenttiosuus siitä, että EI saa tautia

rivi 2: Tartunnan saaneita tai ei tartunnan saaneita (boolen arvo)

rivi 3: Numero, jolla tarkistetaan, saako tartunnan saamaton henkilö, jos hän tapaa tartunnan saaneen henkilön. Jos tartunnan saamaton henkilö kohtaa tartunnan saaneen henkilön, tämä luku on suurempi kuin rivillä 1 (samassa sarakkeessa) oleva luku, niin hän on saanut tartunnan. Koodaamme tämän toiminnon vaiheessa 7.

Vaihe 5: Luo matriiseja rokottamattomista ja tartunnan saaneista ihmisistä alustavien tietojen perusteella

Luo kaksi matriisia nimeltä "matrixUnvacc" ja "matrixInfected", jotka tallentavat kaikki tartunnan saaneet ihmiset infektioMat. Tätä käytetään, jotta voimme värikoodata kaavion tartunnan saaneista, rokottamattomista tai rokotetuista, mikä auttaa visualisoimaan rokottamattomien ja rokotettujen yksilöiden vaikutuksen.

tyhjennä jokainen

matrixInfected = ; matrixUnvacc = ; h = 1: pituus (infektioMat), jos infektioMat (1, h) == unvacc matrixUnvacc = [matrixUnvacc, h]; loppu loppu henkilölle = 1: NUMOFPEOPLE, jos infektioMat (2, henkilö) == 1 matrixInfected = [matrixInfected, henkilö]; loppu loppu

Koodin selitys

Luo kaksi tyhjää matriisia rokottamattomien ja tartunnan saaneiden lukujen tallentamiseksi. Sekä silmukoille, jotka suoritetaan 20 kertaa, ja jos if -lauseke täyttyy, luku lisätään oikeaan matriisiin.

Lähtö

matrixUnvacc =

matrixInfected =

[1]

Vaihe 6: Piirrä alkukaavio

Piirrä alkukaavio
Piirrä alkukaavio

Seuraavaksi piirrämme vierekkäismatriisin.

g = kuvaaja (adjMatrix);

kuva (1) p = kaavio (g, 'NodeColor', 'b', 'MarkerSize', 7); korosta (p, matrixUnvacc, 'NodeColor', 'g') korosta (p, matrixInfected, 'NodeColor', 'r') title_unvacc = unvacc_perc*100; title (['Prosentti rokottamattomista:', num2str (title_unvacc), '%']); tauko (nopeus)

Koodin selitys

Graafiteoria Matlabissa on sisäänrakennettuja toimintoja. Kun käytämme graph () -funktiota, pystymme kääntämään adjMatrixin todelliseksi suunnattuna kuvaajaksi. Meidän on sitten luotava juoni plot () -funktiolla nähdäksemme miltä se näyttää. Asetamme tämän käyrän () muuttujaksi, jotta voimme manipuloida ja muuttaa juonen värejä helpommin koko simulaation ajan. Kaikki ihmiset (tai solmut) on alun perin asetettu värille "sininen". Seuraavaksi kaikki rokottamattomat ihmiset asetetaan värille "vihreä". Tartunnan saaneet ihmiset asetetaan sitten punaiseksi. Otsikko määritetään testattavien rokottamattomien henkilöiden tietyn prosenttiosuuden mukaan. Pause () -toiminto pysäyttää väliaikaisesti MatLab -suorituksen. Kuljemme muuttuvan nopeuden läpi, joka leviää sekunneissa.

Katso kuva (yllä) nähdäksesi satunnainen värikoodattu kuvaaja.

Lue lisää MatLabin kohokohdasta ().

Vaihe 7: Simuloi infektion etenemistä

Seuraavaksi meidän on selvitettävä, kuka saa tartunnan vuorovaikutusten jälkeen (tallennettu adjMatrixiin) ja päivitettävä kaavio, kun joku saa tartunnan.

Käytä adjMatrixia määrittääksesi, mitkä ihmiset ovat saaneet tartunnan, kun he ovat vuorovaikutuksessa ihmisten kanssa päivässä.

jokaiselle riville = 1: pituus (adjMatrix)

jos infektioMat (2, jokainen rivi) == 1 jokaiselleCol = 1: pituus (adjMatrix) jos adjMatrix (eachRow, eachCol) == 1 % eachRow = henkilö % eachCol = sen ystävä % jokaisen ystävä ja katso, ovatko he saaneet tartunnan. jos infektioMat (3, jokainenCol)> infektioMat (1, jokainenCol) infektioMat (2, jokainenCol) = 1; korosta (p, eachCol, 'NodeColor', 'r') tauko (nopeus) loppu loppu loppu loppu

For -silmukka kiertää jokaisen henkilön läpi. Se tarkistaa, että jos henkilö on saanut tartunnan, se tarkistaa jokaisen ihmisen/ystävän, jonka kanssa hän on ollut vuorovaikutuksessa, ja tarkistaa, onko ystävän immuniteetti korkeampi kuin taudin vahvuus. Tässä tulee aikaisemmin luomamme 'infektioMat'. Ystävän jokaisen sarakkeen ensimmäistä ja kolmatta riviä verrataan, ja jos kolmas rivi on suurempi, se tarkoittaa, että ystävällä ei ollut riittävän korkeaa vastustuskykyä paeta tautia ja lopulta tarttuu. Vaihdamme myös värin korostamalla () punaiseksi, jos he saavat tartunnan.

Nyt simulaation koodisi pitäisi toimia! ja mitä tahansa väestökokoa varten, vaihda vain NUMOFPEOPLE!

Vaihe 8: Käytä Monte Carlo -teoriaa

Ottaaksemme tämän askeleen pidemmälle ja poimiaksemme tietoja simulaattoristamme ('infektioSim.m') halusimme laskea ja esittää kaavion trendistä prosenttiosuudesta rokottamattomista tartunnan saaneista ja tartunnan saaneista rokotetuista. Oletamme, että tartunnan saaneiden rokotettujen prosenttiosuuden tulisi olla paljon pienempi kuin rokottamattomien tartunnan saaneiden prosenttiosuus.

Vaihe 9: Tee tiedosto ('infektioSim.m') simulaatiolla toimivaksi

Jos haluat käyttää Monte Carloa, haluamme suorittaa simulaation useita kertoja ja kerätä tietoja, jotta voimme käyttää sitä kaavioon tartunnan saaneiden ihmisten prosenttiosuuksista.

Toiminto voidaan määrittää seuraavasti:

funktion lähtö = infektioSim (unvacc, rokote, NUMOFPEOPLE, unvacc_perc, init_infect, speed)

Kommentoi simulaatiosi muuttujia, koska nyt siirrät ne päätiedoston läpi (aloitamme tämän kirjoittamisen vaiheessa 12):

unvacc, vacc, NUMOFPEOPLE, unvacc_perc, init_infect

Uusi muuttuja

nopeus

määritetään päätiedostoon (Monte_Carlo.m).

Huomaa: Älä unohda funktiotiedoston alareunassa olevaa päätä lopettaaksesi toiminnon!

Vaihe 10: Laske rokottamattomien ja rokotettujen henkilöiden prosenttiosuus, jotka ovat saaneet tartunnan

Tämä laskee prosenttiosuuden rokottamattomista ihmisistä, jotka ovat saaneet tartunnan. Tämä koodi on infektioSim.m -tiedoston alareunassa.

lukumäärä_vahvistamaton = 0;

lukumäärä_infec_unvacc = 0; %laskee prosenttiosuuden rokottamattomista ihmisistä, jotka saivat tartunnan x = 1: pituus (infektioMat), jos infektioMat (1, x) == unvacc -lukumäärä_un_cc = lukumäärä_unvacc++; lopeta, jos infektioMat (1, x) == unvacc & infektioMat (2, x) == 1 luku_infec_unvacc = lukumäärä_infec_unvacc +1; lopussa loppu prosenttiosuus_unvaccc_and_infec = (lukumäärä_infec_unvacc / number_of_unvacc)*100;

Koodin selitys

For -silmukassa se silmukkaa yli NUMOFPEOPLE kertaa. Joka kerta, kun infektioMat -numero vastaa rokottamattomien lukumäärää (eli 0,95 == 0,95), rokottamattomien ihmisten lukumäärä kasvaa yhdellä. tartunnan saaneiden ja rokottamattomien määrä kasvaa yhdellä. Viimeinen rivi jakaa tartunnan saaneiden, rokottamattomien ihmisten määrän rokottamattomien henkilöiden kokonaismäärällä. Sitten lasketaan prosenttiosuus tästä.

Haaste:

Yritä laskea rokotettujen prosenttiosuus tartunnan saaneista! (Vinkki: se on hyvin samanlainen kuin yllä oleva koodi, mutta joitakin muuttujia muutetaan ja nimiä muutetaan.)

Seuraavaksi lasketaan tartunnan saaneiden prosenttiosuus koko väestön perusteella:

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

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

Koodin selitys

Kumulatiivinen summa lasketaan käyttämällä infektioMatin toista riviä, joka tallentaa 1s ja 0s riippuen siitä, onko henkilö saanut tartunnan vai ei. Koska cumsum () -funktio antaa matriisin takaisin, otamme matriisin viimeisen arvon ('pre_per_infect (1, NUMOFPEOPLE)'), jonka pitäisi olla kaikkien infektionMat (2,:) 'arvojen todellinen summa. Jakamalla summa NUMOFPEOPLE: lla ja kertomalla sen 100: lla, saamme lopullisen tartunnan saaneiden prosenttiosuuden koko väestöstä.

Vaihe 11: Luo tulostusmuuttuja toimintoon 'infekcijaSim.m'

tuotos = [per_infect, prosenttiosuus_unvacc_and_infec, percent_of_vacc_and_infec];

Koodin selitys

Tallenna nämä tiedot ulostuloon, joka lähetetään takaisin pääkirjaan (Monte_Carlo.m), kun toiminto kutsutaan ja suoritetaan. Näitä tietoja käytetään kuvaamaan rokotettujen ja rokottamattomien tartunnan saaneiden prosenttiosuudet.

InfektioSim.m -toiminto on suoritettava nyt! Se ei kuitenkaan käynnisty, koska meidän on vielä kirjoitettava tärkein!

Vaihe 12: Luo valikko saadaksesi simulaation alkuehdot käyttäjältä

Muista, kuinka sanoimme muuttujan

nopeus

luodaan ja siirretään päätoiminnon kautta? Meidän on hankittava arvot, jotka välitetään funktiolle. Huomaa, että arvojärjestyksellä funktiota kutsuttaessa on väliä!

Aloita pyytämällä käyttäjää kirjoittamaan joitakin vastauksia päätteeseen.

> Valitse sairaus. Huomaa, että kirjainkoolla on merkitystä >> Hinkuyskä >> Flunssa >> Tuhkarokko >> Tauti Valittu: Flunssa >> Valitse populaation koko. >> 20 >> 200 >> Väestö valittu: 20 >> Valitse simulaation nopeus. >> Nopea >> Hidas >> Nopeus valittu: Nopea

Tämä alla oleva koodi kysyy käyttäjältä, mitä tautia hän haluaa tutkia.

disp ('Valitse tauti. Huomaa, että kirjainkoko on herkkä')

fprintf ('Pertussis / n Influenssa / nTuhkarokko / n') tauti = input ('Valittu tauti:', 's'); jos itsequal (tauti, 'hinkuyskä') rokote = 0,85; %15 prosentin mahdollisuus saada tauti unvacc =.20; %80 prosentin mahdollisuus saada tauti, jos rokote on sama (sairaus, 'flunssa') = 0,75; %25 prosentin mahdollisuus saada tauti unvacc =.31; %69 prosenttia mahdollisuus saada tauti, jos rokote on sama (sairaus, tuhkarokko) = 0,97; %3 prosentin mahdollisuus saada tauti unvacc =.10; 90 %todennäköisyys sairastua

Koodin selitys:

Disp () -toiminto tulostaa lausunnon näytölle ja tulostaa myös eri vaihtoehdot. Sairaus määritetään sen mukaan. Tämä versio ei tällä hetkellä ota huomioon virheellisiä syötteitä. Virheellinen syöttö aiheuttaa virheen ja pysäyttää ohjelman kokonaan. Jokaisella sairaudella on rokotus- ja rokottamattomat arvot. Nämä arvot EI ole satunnaisia. Nämä arvot saimme tutkimalla sairauksia koskevia tilastoja.

Seuraavaksi meidän on kysyttävä käyttäjältä, haluavatko he testata suuren tai pienen populaation kokoa valitulle taudilleen.

disp ('Valitse väestön koko.')

fprintf ('20 / n200 / n ') speed = input (' Väestö valittu: ',' s '); jos isequal (nopeus, '20') populaation_koko = 20; elseif isequal (nopeus, '200') populaation_koko = 200; loppuun

Koodin selitys

Tämä tulostaa käyttäjälle lausunnon ja pyytää käyttäjää syöttämään, minkä kokoisen väestön se haluaa testata. Tämä versio ei tällä hetkellä ota huomioon virheellisiä syötteitä. Virheellinen syöttö aiheuttaa virheen ja pysäyttää ohjelman kokonaan. 20 valittiin, koska se on pieni otoskoko, joka antaa edelleen hyvän käsityksen siitä, miten infektio leviää pienessä populaatiossa. Suuremmaksi vaihtoehdoksi valittiin 200 ihmistä, koska kaavioon piirretyissä 200 pisteessä oli tuskin päällekkäisyyksiä, joten kaikki oli helppo nähdä ja erottaa toisistaan.

Seuraavaksi meidän on löydettävä simulaation nopeus.

disp ('Valitse simulaation nopeus.')

fprintf ('Nopea / nHidas / n') nopeus = tulo ('Valittu nopeus:', 's'); jos isequal (nopeus, 'Nopea') sim_speed = 0; elseif isequal (nopeus, 'Hidas') sim_speed = 0.25; loppuun

Koodin selitys

Tämä prosessi oli sama kuin sairauslajin ja populaation koon saaminen. Nopeasti, taukoa ei tule. ja hitaalle, for -silmukassa on 0,25 sekunnin viive simulaatiota suoritettaessa.

Loistava! Nyt meillä on kaikki tarvitsemamme käyttäjän syötteet! Siirrytään keräämään tietoja eri prosenttiosuuksista rokottamattomia ihmisiä.

Vaihe 13: Valitse % rokottamattomista ihmisistä ja laske rokottamattomien ja tartunnan saaneiden keskiarvo valitulle prosenttiosuudelle

Tämä koodi on 0% rokottamattomista.

% ------- % 0 rokottamaton ------------

per_infect_av_0 = ; prosenttiosuus_unvacc_and_infec_av_0 = ; i = 1:20 ulos = infektioSim (unvacc, rokote, populaation koko, 0, 1, sim_nopeus); per_infect_av_0 = [per_infect_av_0, out (1, 1)]; percent_of_unvacc_and_infec_av_0 = [percent_of_unvacc_and_infec_av_0, out (1, 2)]; loppuun keskimääräinen_infektoitu_0 = keskiarvo (per_infect_av_0); keskimääräiset_vahingoittamattomat_ja tartunnan saaneet_0 = keskiarvo (prosenttiosuus_unvacc_and_infec_av_0);

Koodin selitys:

For -silmukka suoritetaan 20 kertaa. Funktion infektio Sim () ulostulo tallennetaan sisään. Aina kun for -silmukka suoritetaan, tartunnan saaneiden prosenttiosuus koko väestöstä lisätään matriisiin 'per_infect_av_0'. Lisäksi rokottamattomien ja tartunnan saaneiden prosenttiosuus lisätään joka kerta matriisiin 'percent_of_unvacc_and_infec_av_0'. Kahdella viimeisellä rivillä nämä kaksi edellä mainittua matriisia lasketaan keskiarvoksi ja tallennetaan muuttujiin. Yhteenvetona voidaan todeta, että prosentit tallennetaan kullekin simulaatiolle, lasketaan keskiarvo ja piirretään. Monte Carloa käytetään osoittamaan simulaation suorittamisen ja tuloksen näyttämisen keskiarvo. Kokeellisia tarkoituksia varten päätämme suorittaa simulaation 20 kertaa ja keskiarvoa nämä arvot.

Haaste:

Toista kaikki testattavat prosenttiosuudet! Tämä voidaan tehdä muuttamalla muuttujien nimiä prosenttilukujen mukaan. Testasimme 0%, 5%, 10%, 20%, 30%ja 50%.

Vihje:

Ainoa rivi, joka on muutettava todellisessa koodissa, on

ulos = infektioSim (unvacc, rokote, populaation_koko, 0, 1, sim_nopeus);

Muuta nolla prosentiksi desimaalimuodossa. Esimerkiksi 5%: n rokottamattoman simulaation tapauksessa 0 tulee korvata arvolla 0,5.

Vaihe 14: Kaavio: 'Infektion suuntaus rokottamattomissa vs. Rokotettu spesifiseen sairauteen '

Tämä on koodi, jonka avulla voidaan laatia kuvaaja rokottamattomien ja rokottamattomien henkilöiden tartunnan trendistä.

kaavio_mat_y = [keskimääräinen_infektoitu_0, keskimääräinen_infektoitu_5, keskimääräinen_infektoitu_10, keskimääräinen_infektoitu_20, keskimääräinen_infektoitu_30, keskimääräinen_infektoitu_50];

kaavio_mat_x = [0, 5, 10, 20, 30, 50]; kaltevuus = (keskimääräinen_infektoitu_5-keskimäärin_infektoitu_0)/5; line_y = [keskimääräinen_infektoitu_0, (kaltevuus*50)+keskimääräinen_infektoitu_0]; line_x = [0, 50]; kuvio (2) kuvaaja (graph_mat_x, graph_mat_y); line (line_x, line_y, 'Color', 'red', 'LineStyle', '-'); otsikko (['Trend in Unvaccination for', tauti]); xlabel ('Prosentti alkuperäisestä rokottamattomasta'); ylabel ('Prosenttiosuus lopullisista tartunnan saaneista')

Koodin selitys

rivi 1: määritetty y -arvot tartunnan saaneiden prosenttiosuuksien keskiarvoille

rivi 2: määritetty x -arvo alkuperäisen rokottamattoman prosenttiosuuden prosenttiosuudelle

rivi 3: laske kaltevuus 0% ja 5%

rivi 4: tallenna rivin y -arvot. Tämä on jatkoa osuudelle 0–5 prosenttia.

rivi 5: tallenna rivin y -arvot. Tämä viiva ulottuu kaavion pituuteen.

rivi 6: luo kuva

rivi 7: Piirrä kaavion x ja y arvot rokottamattomien tartunnan saaneiden prosenttiosuuksista.

rivi 8: piirrä viiva. Tätä käytetään osoittamaan, että se ei kasva lineaarisesti, vaan eksponentiaalisesti.

rivi 9: Aseta kaavion otsikko.

rivi 10-11: Aseta x- ja y-tarrat kuvaajalle.

Nyt sinun pitäisi pystyä näkemään, että mitä suurempi prosenttiosuus väestöstä on rokottamattomia, sitä suurempia määriä tartuntoja. Näet myös, että suurin osa punaisista pisteistä on vihreitä, mikä osoittaa, että rokote auttaa jossain määrin! Toivottavasti pidit tästä opetusohjelmasta. Kommentoi, jos sinulla on kysyttävää!

Vaihe 15: Lopputuote: Miltä simulaatio näyttää

Kaikki koodit löytyvät täältä

Suositeltava: