Koronavirusepidemian mallintamista on esitelty THL:n webinaareissa. Tässä kirjoituksessa esitellään mallintamisen laskentakoodeja, eli laskennan lähdekoodeja, joita kohtaan on myös ilmennyt kiinnostusta.

Mitä ovat laskentakoodit?

Kiteytetysti, laskentakoodien avulla toteutetaan mallit, jotka koronamallinnusryhmän webinaareissa on esitelty.

Ruoanlaittoon verrattuna mallit vastaavat reseptejä ja koodit kattiloita ja muita ruoanlaittovälineitä. Koodit itsessään eivät tuo mallin kuvaukseen varsinaisesti uutta sisältöä. Reseptiä eli mallin kuvausta seuraten taitava kokki voi tehdä aterian.

Jotta saadaan jotakin suuhunpantavaa, tarvitaan reseptin ja kattiloiden lisäksi tietenkin myös ruokatarvikkeet. Malleille näitä ovat erilaiset aineistot.

Yksinkertaisimmillaan aineisto voi muodostua yksittäisistä parametreista, luvuista joita malliin syötetään, mutta aineistot voivat olla myös esimerkiksi sairaaloiden potilasaineistoja.

Koronamallinnusryhmän koodien sisällön voi jakaa karkeasti kolmeen ryhmään.

Ensiksikin, varsinaiset laskentakoodit, jotka toteuttavat mallien laskentakaavat.

Toinen ryhmä on koodit, jotka lukevat aineistot eri tietolähteistä ja muokkaavat niiden tietosisällön laskentakoodin käyttämään muotoon. Ruoanlaittovertausta jatkaen nämä koodit ikään kuin käyvät kaupassa hankkimassa tarvikkeet, purkavat kauppakassit ja pilkkovat raaka-aineet kokin tarvitsemalla tavalla. Tätä osuutta eivät tosin tee pelkästään mallinnusryhmän koodit, vaan siihen osallistuu paljon asiantuntijoita esimerkiksi THL:n tietohallinnosta.

Koodien kolmas ryhmä on tulosten esittäminen ja tallentaminen. Jotta laskennasta olisi kenellekään mitään hyötyä, tulokset on luonnollisesti esitettävä erilaisina taulukkoina ja kaaviokuvina. Jokainen osaa itse kuvitella, mikä olisi tämän kohdan vastaavuus kokkailussa.

Minkälaisia malleja, sellaisia koodeja

Koronaepidemian alkuvaiheessa analyyseissä käytettiin ulkomaiseen vertailualueeseen perustuvaa mallia. Tällä hetkellä käytetään myös kotimaista korona-aineistoa hyödyntävää ”oppivaa mallia”.

Mallien avulla voi laskea erilaisia tulevaisuuden skenaarioita, eli arvioita tulevien tautitapausten ja hoidon tarpeen määristä sen mukaan, mitä tulevaisuutta koskevia parametreja malleille syötetään. Mallit eivät arvioi tällaisten skenaarioiden toteutumisen todennäköisyyttä, eivätkä esimerkiksi anna vastausta kysymykseen ”toisen aallon” saapumisesta.

Molemmat käytetyt mallit perustuvat samanlaiseen hyvin yksinkertaiseen epidemiologiseen SEIR-malliin (S = Susceptible, altis; E = Exposed, tartunnan saanut; I = Infectious, tartuttava; R = Removed, aiemmin tartuttava). Parametrien erilaisesta käsittelystä johtuen mallit eroavat kuitenkin ohjelmistoina toisistaan suuresti.

Vertailualueeseen perustuva malli on käytännössä pelkkä SEIR-malli, johon parametrit syötetään. Sellaisen voi ohjelmoida vartissa (Kuva 1) – blogia varten kokeilin tätä ja otin aikaa! Itse koodin kirjoittaminen mallin kuvauksesta on tässä tapauksessa siis hyvin yksinkertaista, lähes taskulaskintasoa.

Varsinainen työ vertailualuetta käytettäessä olikin parametrien selvittämisessä. Tätä puolta selitettiin webinaarissa.

Oppiva malli oppii parametrit kertyvästä aineistosta

Oppiva malli tarkoittaa, että malli estimoi (”oppii”) parametrit kertyvästä kotimaisesta korona-aineistosta ja muodostaa näin tilannekuvan. Tämän pohjalta voidaan paitsi saada ymmärrystä epidemiasta myös laskea lyhyen tähtäimen ennuste, esimerkiksi tulevalle viikolle. Lisäksi tilannekuvaa voi käyttää lähtökohtana erilaisille pitkän tähtäimen skenaarioille.

Oppivan mallin tapauksessa ohjelmisto sisältää kaikki alussa kuvatut vaiheet aineiston lukemisesta ja on siksi oleellisesti laajempi. Sen rakennetta on kuvattu alla tarkemmin.

Malleja ja koodeja on kehitetty pitkälti rintarinnan, muuttuvien käyttötarpeiden mukaan. Siksi mallinnusryhmän koodit ovat eräänlaisia prototyyppejä, eivätkä käytettävyydeltään yleisessä tai teollisuudessa käytössä olevien ohjelmien tasoa. Tyypillisesti ohjelmistoa kykenee käyttämään tutkija itse tai kollega perehdytyksen jälkeen.

Ryhmän tavoitteena ei ole ollut koodien hiominen yleiseen käyttöön. Sellainen vaatisi oman ohjelmistoprojektinsa, millaisessa vaadittava osaaminen on erilaista kuin mallinnusryhmän matemaattiseen laskentaan painottuva osaaminen.

SEIR-mallin koodi.
Kuva 1. SEIR-mallin koodi. Tätä blogia varten vartissa koodaamani SEIR-malli. Siinä palautetaan SEIR-tilojen lisäksi päivittäinen infektion ilmaantuvuustermi insI, johon voi tarvittaessa liittää vakavien tautien todennäköisyydet ja sairaalahoitojaksojen kestot. Tässä koodissa tilojen väliset siirtymät on toteutettu siirtymätodennäköisyyksillä, jolloin tilat pysyvät varmasti positiivisina kiinteässä aika-askelluksessa. Perustartuttavuusluku R0 syötetään ajasta riippuvana vektorina, jolloin voi kokeilla eri tavoin jaksotettujen R0 vaikutusta.

Oppivan mallin ohjelmisto

Oppivasta mallista on laadittu kolme eri laskentaohjelmistoa, kolmella eri ohjelmointikielellä.

Usean version etuna on, että laskennan toimivuutta on mahdollista tarkistaa vertailemalla tuloksia toisiinsa. Kaksi malleista on riippumattomasti toteutettuja prototyyppejä. Kolmas, vielä keskeneräinen versio on tarkoitettu jatkossa ryhmän yhteiskäyttöön.

Alla olevassa kuvassa (Kuva 2) on esitetty oppivan mallin ohjelmiston rakennetta. Siniset laatikot kuvastavat koodin osia ja punertavat nuolet tiedon siirtymistä.

Aineiston lukemisen komponentti (1) lukee ja muokkaa päivittäin kertyvän aineiston varsinaisen laskentakomponentin käyttämään muotoon. Laskentakomponentti jakaantuu kahteen osaan. Ensimmäinen osa (2) estimoi mallin parametrit aineistosta ja muodostaa näin epidemian laskennallisen tilannekuvan. Toinen osa (3) määrittelee tulevaisuuden skenaarion ja laskee tilannekuvalle pohjautuvan ennusteen kyseiselle skenaariolle.

Molempien laskentaosien ytimessä on edellä esitetyn kaltainen SEIR-mallin koodi. Suomessa kevään ensimmäinen epidemia-aalto keskittyi suurelta osin pääkaupunkiseudulle. Oppivaa mallia ajatellen muualta Suomesta kertyi niin vähän aineistoa, että malli ei kykene siitä oppimaan koronavirusepidemian ominaisuuksia. Siksi laskentakomponentit (2-3) on toteutettu pääkaupunkiseudun alueelle.

Osissa (4-5) on laskentakomponenttien laajennus Suomen muille alueille toteutettu niin, että alueellisia aineistoja yhdistetään pääkaupunkiseudulta estimoituihin parametreihin.

Voisiko oppivan mallin koodeja päästä kokeilemaan?

Python-ohjelmointikielellä toteutetun version voi ladata alla olevasta linkistä.
Linkki ohjelmistoon

Linkin takaa löytyvässä versiossa aineistona on simuloimalla tuotettu aineisto, jonka avulla mallin ajamista voi kokeilla.

Tietosuojan vuoksi todellista sairaala-aineistoa ja siihen liittyviä aineiston lukuohjelmia ei ole mahdollista laittaa sellaisenaan jakoon.Lupaa eri aineistojen tutkimuskäyttöön voi hakea normaalin menettelyn mukaisesti Findatan kautta.
Ohjeet tietoluvan hakemiseen

 .
Kuva 2. Oppivan mallin ohjelmiston rakenne.

Lue lisää:

Koronaepidemian mallinnusta
THL

Kommentit

Marko Grönroos

01.07.2020 23:52

Hienoa, että näitä nyt julkaistiin edes hieman. Sentään ihka oikeaa Matlabia eikä mitään ”syntakseja” mistä tietoylijohtaja Pekka Rissanen edellispäivänä kirjoitti! Tai niin hänen mukaansa nuokin ovat ”syntakseja”. (Mahtoi teitä oikeita kehittäjiä nolostuttaa.) Aika jännän simppelisti koodattu tuo mallinne tässä artikkelissa, vaikka käyttää kontaktimatriisia.

Sinällään puhdas SEIR-malli on lähes hyödytön, kun halutaan sovittaa mallia dataan, jossa on jokin jäävuoren osa vahvistettuja, pienempi osa sairaalahoitoon ja tehohoitoon joutuneita ja sitten kuolleita. Näemmä Python-mallissa nämä ehkä näyttäisi olevan huomioitu. Python-versiossa ei kuitenkaan, sikäli kun äkkiseltään luin, näyttäisi olevan huomioitu oireettomia tapauksia, mitkä muistaakseni oli huomioitu jossain THL:n mallinnusesityksessä. Muistaakseni siinä oli kerrottu mallinnetun, että oireettomat tartuttivat jonkin aikaa ennen kuin tulivat oireelliseksi tartuttajiksi. Sikäli esitetty Python-malli ei vaikuta samalta mallilta. Voisimmeko saada saman mallin?

Sivuhuomautuksena, olen aika pettynyt ODE-mallin käyttöön, koska se ei huomioi kontaktietäisyyttä mitenkään, paitsi mallissanne ikäryhmäkontaktien osalta. Ikäryhmäkontaktit ovat sinällään kiva lisä, mutta jättävät huomioimatta ehkä merkittävämmän spatiaalis-sosiaalisen kontaktirakenteen. Jos kontaktirakennetta ei estimoida mitenkään, johtaa se helposti R0:n aliarviointiin ja jos algoritmin on tavoitteena olla ”oppiva” näiden parametrien suhteen, johtaa se ehkä jopa merkittävässä määrin vääriin parametriarvioihin.

Tämä huolestuttaa erityisesti Kiinan datan sovituksen kohdalla, sikäli kun sillä oli ratkaiseva merkitys taudin kuolleisuuden arvioinnissa. Aluksi THL:n arviot olivat 0,05 – 0,1 %.

Tuolloin THL:n sivuilla tiedotettiin: ”Koronavirustaudin aiheuttamaa tautitaakkaa Suomessa arvioitiin aluksi Kiinan Wuhanin tietojen perusteella. SEIR-mallilla simuloitiin ensin epidemia Wuhaniin ja sen jälkeen yksittäiseen tartuntaan liittyvää vakavan sairastumisen riskiä arvioitiin Hubein maakunnan havaitun tautitaakan avulla. ”

Tässä artikkelissa kerrottiin, että Suomen datat ovat ehkä saatavissa tietopyynnöllä. Mutta miten mallia ajetaan THL:n mainitsemilla Kiinan datoilla? Onko GitLabissä tarjottu malli se, jolla arvioitiin parametrejä Kiinan datojen perusteella, ja minkä perusteella tehtiin alustavat arviot COVID-19:n oireettomien tapausten osuudesta ja kuolleisuudesta?

×
×
×

Vastaa

Käsitellään kommentteja...

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *