R-ohjelmointi.org

Tilastotieteellistä ohjelmointia R-kielellä

Epidemiologinen riski ja sen visualisointi – esimerkkinä statiinit

Mikä on riski?

Riskille on useita erilaisia määritelmiä:

1. Riskienhallintamallit määrittelevät riskin usein epätoivottavan tapahtuman todennäköisyyden (vaara, hazard) ja sen aiheuttaman vaikutuksen (tappion määrä) tuloksi (risk = hazard * dose of exposure). Esimerkiksi autokolarin riski on sen todennäköisyyden (1/100) ja vaikutuksen (20 000€) tulo eli annetuilla luvuilla 200 €.

Riskienhallinnan tavoitteena on pienentää riskejä. Useimmat arkielämässä kohdatut riskit ovatkin jo riskienhallinnan seurauksena pienentyneitä riskejä (residual risk). Riskienhallinnan ja arkikielen riski voivat erota toisistaan huomattavasti joko käsitteellisesti ja/tai suuruudeltaan.

2. Epidemiologiassa vaara (hazard) tarkoittaa jotakin altistetta (myös risk factor), josta syntyy riski (todennäköisyys) sairastua. Absoluuttisella riskillä tarkoitetaan samaa asiaa kuin insidenssillä eli tietyssä populaatiossa tiettynä aikana (esim. Suomessa yhden vuoden aikana) sattuneiden sairastumisten suhteellista osuutta. Insinööritieteissä insidenssistä puhutaan myös failure rate -nimellä.

Seuraavassa käsitellään lähinnä epidemiologista riskiä. Käytän esimerkkinä JUPITER-statiinitutkimusta, jossa on tutkittu statiinien vaikuttavuutta sydän- ja verisuonitautien primääripreventiossa eli lääkkeen tehokkuutta on arvioitu terveillä henkilöillä.

Epidemiologisen riskin mittaaminen

Epidemiologiassa riskiä voidaan mitata joko absoluuttisena riskinä (insidenssi), kahden absoluuttisen riskin suhdelukuna (riskisuhde) tai kahden absoluuttisen riskin erotuksena (riskiero).

Absoluuttinen riski
JUPITER-tutkimuksen plasebo-ryhmään kuului 8901 henkilöä (60-71 vuotiaita), joille sattui seuranta-aikana 251 primääripäätetapahtumaa (tietyt kardiovaskulaaritapahtumat). Plasebo-ryhmän absoluuttinen riski on siten 251/8901 eli 0.028. Koska riski on varsin pieni, ilmoitetaan tulos usein esimerkiksi tuhatta henkilöä kohden, jollon absoluuttinen riski on siis 0.028 * 1000 = 28. Vastaavasti primääripäätetapahtuman absoluuttinen riski rosuvastatiinilla hoidetussa ryhmässä oli 142/8901*1000 = 16. Absoluuttinen kardiovaskulaaritapahtuman riski on rosuvastatiinilla hoidetussa ryhmässä siis pienempi kuin verrokkiryhmässä.

Suhteellinen riski
Suhteellinen riski (relative risk, riskisuhde) on kahden absoluuttisen riski suhde Suhteellinen riski on päätetapahtuman ja altisteen välisen riippuvuuden mitta. Primääripäätetapahtuman riskisuhde on JUPITER-tutkimuksessa (142/8901) / (251/8901) = 0.57. Statiini näyttää siis suojaavan päätetapahtumilta.

Absoluuttinen ja suhteellinen riskiero
Absoluuttinen riskiero (absolute risk reduction) on kahden riskin erotus. Primääripäätetapahtuman riskiero on JUPITER-tutkimuksessa 0.016 – 0.028 = 0.012. Suhteellinen riskiero on puolestaan 0.012 / 0.028 = 0.43 tai 43 %.

Absoluuttisen riskieron perusteella voidaan myös johtaa NNI (number needed to treat) -arvo, joka kuvastaa sitä henkilömäärää, joka tulisi hoitaa, jotta yksi primääritapahtuma voitaisiin estää. JUPITER-tutkimuksen NNI on esitetyillä luvuilla 1 / 0.012 = 83.

Riskin visualisointi

Riskin visualisointi liittyy likeisesti riskin ymmärrettäväksi tekemiseen ja potilaille kommunikointiin, mutta myös tieteellisten artikkelien tulosten viestintään. Useasti on havaittu, että ihmiset ymmärtävät esimerkiksi luonnollisilla luvuilla tapahtuvan viestinnän helpommin kuin suhteellisilla luvuilla tai prosenttiosuuksilla tapahtuvan viestinnän. Niinpä viesti kannattaa rakentaa kokonaislukuja käyttäen.

Lisäksi viestinnässä olisi hyvä pystyä antamaan mahdollisimman kattava kuva ilmiöstä. Esimerkiksi riskisuhteiden ilmoittaminen ei vielä kerro mitään absoluuttisesta riskistä populaatiossa, ainoastaan sen muutoksesta tutkittujen ryhmien välillä. Siksi kannattaisi aina pitää mukana myös absoluuttista riskiä kuvastavat suureet.

Riskin visualisointiin liittyvistä artikkeleista olen erityisen tykästynyt Virtual Mentorin julkaisuun. Se esittelee useita erilaisia tapoja visualisoida riskejä.

Seuraavat kuvat on tehty visualisointiartikkelin pohjalta JUPITER-tutkimuksen tuloksista. Käytetty R-koodi on tämän artikkelin lopussa. Kuvissa on verrattu rosuvastatiinin hyötyjä kardiovaskulaaritapahtumia ajatellen ja sen aiheuttamia haittoja diabetes-esiintyvyyden kasvun kannalta.

Absoluuttinen riski

Alla oleva kuva suhteuttaa absoluuttisen riskin koko tutkimusjoukon kokoon. Punaisella on merkitty sairastuneiden lukumäärä koko tutkimusjoukossa.

Suhteellinen riski

Seuraava kuva esittää kardiovaskulaaritapahtumien määrän vähenemisen ja diabetes-tapausten kasvun tuhatta henkilöä kohden. Kuvasta näkee helposti, että kardiovaskulaaritapausten määrä tippuu enemmän kuin diabeteksen esiintyvyys kasvaa.

Sama tulos voidaan esittää myös viivakaaviona:

Kardiovaskulaaritapahtumien ja diabetestapausten määrä voidaan esittää myös riskiteatterimuodossa:

NNI

NNI-arvot voidaan visualisoida vaikkapa teatterimuodossa:

Kuvassa käytetyt ukot olen piirtänyt omin käsin (ja sen ovat kyllä näköisiäkin!), ja ne voi tarvittaessa ladata seuraavista linkeistä: musta, sininen, punainen.

Yhteenveto

Yllä olevan kaltaisia kuvia voi käyttää riskeistä ja niiden suuruuseroista viestittäessä. Niiden avulla potilaan pitäisi olla mahdollista päättää, haluaako kenties aloittaa vaikkapa lääkärin suositteleman lääkehoidon. Esimerkiksi ylläolevassa tapauksessa statiinin käyttö aiheuttaa käyttämättömyyttä pienemmän sydän- verisuonitautiriskin, mutta vastaavasti hieman suuremman diabetesriskin. Jos 160 henkilöä käyttää lääkitystä vuoden, heistä noin kaksi välttyy joltakin sydän- ja verisuonitautitapahtumalta, mutta yksi sairastuu diabetekseen.

Tämä ei yksinään ehkä mahdollista päätöksentekoa, sillä siihen voi vaikuttaa myös esimerkiksi tieto siitä, että akuuttiin sydänkohtaukseen liittyy jopa 50% kuolleisuus, kun taas kakkostyypin diabeteksen akuutti kuolleisuus on paljon alhaisempi. Tällainen esitystapa voi sen sijaan toimia keskustelun tukena henkilökohtaisen hyödyn arvioinnissa.

R-koodi

# Absoluuttinen riski
par(mfrow=c(1,2))
barplot(c(270, 216)/8901*1000, names.arg=c("Rosuvastatin","Kontrolli"), main="Uudet diabetes-diagnoosit",
        xlab="Ryhmä", ylab="Esiintyvyys (/1000)", las=1, col=c("black","black"), ylim=c(0,30))
barplot(c(142, 251)/8901*1000, names.arg=c("Rosuvastatin","Kontrolli"), main="Uudet kardiovaskulaaritapahtumat",
        xlab="Ryhmä", ylab="Esiintyvyys (/1000)", las=1, col=c("black","black"), ylim=c(0,30))
 
# Absoluuttisen riskin ero
par(mfrow=c(1,2))
m1<-matrix(ncol=2, data=c(270, 216, 8901-270, 8901-216))
m2<-matrix(ncol=2, data=c(142, 251, 8901-142, 8901-251))
barplot(t(m1), names.arg=c("Rosuvastatin","Kontrolli"), main="Uudet diabetes-diagnoosit",
        xlab="Ryhmä", ylab="Lukumäärä", las=1, col=c("red", "black"), border=c("red", "black"))
barplot(t(m2), names.arg=c("Rosuvastatin","Kontrolli"), main="Uudet kardiovaskulaaritapahtumat",
        xlab="Ryhmä", ylab="Lukumäärä", las=1, col=c("red", "black"), border=c("red", "black"))
 
# Riskiteatteri
par(mfrow=c(1,2))
e<-expand.grid(1:40, 1:25)
# Rosuvastatin
plot(e$Var1, e$Var2, pch=16, axes=F, xlab="", ylab="", cex=1.3, col=c(rep("blue", round(142/8901*1000)), rep("black", round((8901-142-270)/8901*1000)), rep("red", round(270/8901*1000))), main="Rosuvastatin")
par(xpd=NA)
legend(x=1, y=27.5, ncol=3, col=c("black", "red", "blue"), pch=16, legend=c("Ei muutosta (954)","Diabetes (30)","Päätetapahtuma (16)"), bty="n", cex=0.75)
# Kontrolli
plot(e$Var1, e$Var2, pch=16, axes=F, xlab="", ylab="", cex=1.3, col=c(rep("blue", round(251/8901*1000)), rep("black", round((8901-251-216)/8901*1000)), rep("red", round(216/8901*1000))), main="Kontrolli")
legend(x=1, y=27.5, ncol=3, col=c("black", "red", "blue"), pch=16, legend=c("Ei muutosta (948)","Diabetes (24)","Päätetapahtuma (28)"), bty="n", cex=0.75)
 
# Absoluuttisen riskin ero
par(mar=c(5,4,4,6))
plot(x=c(1,1,2,2), y=c(24,28,30,16), col="white", las=1, type="p", axes=F, xlab="Ryhmä", ylab="Esiintyvyys (/1000)", ylim=c(0,30), main="Haitat versus hyödyt")
grid(col="grey85", lty=1)
lines(x=c(1,2), y=c(24,30), lwd=4, type="b", col="red") 
lines(x=c(1,2), y=c(28,16), lwd=4, type="b", col="blue") 
axis(side=1, at=c(1,2), labels=c("Kontrolli", "Rosuvastatin"))
axis(side=2, las=1)
mtext(side=4, at=c(16, 30), text=c("Päätetapahtuma", "Diabetes"), las=1)
box(bty="c")
 
 
 
 
# NNI-kuva
# Diabetes
# kontrolli, absoluuttinen riski
ic<-216/8901
# rosuvastatiini, absoluuttinen riski
it<-270/8901
# absolute risk increase
ari.db<-it-ic
# number needed to treat (164)
nni.db<-1 / ari.db
 
# Kardiovaskulaaritapahtuma
# kontrolli, absoluuttinen riski
ic<-251/8901
# rosuvastatiini, absoluuttinen riski
it<-142/8901
# absolute risk reduction
arr.st<-it-ic
# number needed to treat (82)
nni.st<-abs(1 / arr.st)
 
library(png)
library(raster)
black<-readPNG("man_black.png")
blue<-readPNG("man_blue.png")
red<-readPNG("man_red.png")
 
par(mar=c(0,0,0,0))
plot(NA,xlim=c(-10,10),ylim=c(0,10), axes=F, xlab="", ylab="")
#abline(v=0, col="grey85")
#abline(h=05, col="grey85")
#axis(1)
#axis(2)
leveys<-0.3
korkeus<-0.7
 
for(i in 1:20) {
   for(j in 1:8) {
      rasterImage(black, 0+i*leveys, j, 0.3+i*leveys, j+0.7)
   }
}
 
for(i in 1:20) {
   for(j in 1:8) {
      rasterImage(black, 0-i*leveys, j, -0.3-i*leveys, j+0.7)
   }
}
 
rasterImage(red,-0.3,8,-0.6,8.7)
rasterImage(blue,0.3,8,0.6,8.7)
rasterImage(blue,0.3,7,0.6,7.7)
 
text(x=3.3, y=9.5, labels="Hyöty\nkardiovaskulaaritapahtumien esto", font=2)
text(x=-3.3, y=9.5, labels="Haitta\ndiabetes", font=2)
 
text(x=-8.5, y=8, labels="160 hoidettua potilasta\n1 ylimääräinen diabetes-tapaus", col="#CC0000")
text(x=8.5, y=8, labels="160 hoidettua potilasta\n2 estettyä päätetapahtumaa", col="blue")


Vastaa

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