Ero sivun ”Pneumokokkirokotteen hankinta kansalliseen rokotusohjelmaan” versioiden välillä

Opasnet Suomista
Siirry navigaatioon Siirry hakuun
(→‎Laskenta: tehty ovariablet ja saatu ne toimimaan)
Rivi 171: Rivi 171:
  effect 82.3 79.3 42.8 40.9 41.6 24 21.1 20.8 20.3 17.7 15.2 15.1 13.6 13.7 8.6 6.1 6.5
  effect 82.3 79.3 42.8 40.9 41.6 24 21.1 20.8 20.3 17.7 15.2 15.1 13.6 13.7 8.6 6.1 6.5


<rcode embed=1>
==== Esimerkkejä ====
 
* VT: vaccine serotypes, i.e. pneumococcus serotypes that are found in a vaccine.
* NVT: non-vaccine serotypes, i.e. pneumococcus serotypes that are not found in the vaccine.
 
<rcode embed=1 graphics=1 variables="
name:q_user|description:Proportion of VT carriage removed by vaccination|default:1|
name:p_user|description:Proportion of VT carriage removed by vaccination that is replaced by NVT|default:1|
name:VT_rows_user|description:Serotypes in a vaccine to look at|type:checkbox|options:
'19F';19F;'23F';23F;'6B';6B;'14';14;'9V';9V;'4';4;'18C';18C;'1';1;'7';7;
'6A';6A;'19A';19A;'3';3;'8';8;'9N';9N;'10';10;'11';11;'12';12;'15';15;
'16';16;'20';20;'22';22;'23A';23;'33';33;'35';35;'38';38;'6C';6C;'Oth';Other|
default:'19F';'23F';'6B';'14';'9V';'4';'18C';'1';'7';'6A';'19A';'3'
">
library(OpasnetUtils)
library(OpasnetUtils)
library(ggplot2)


objects.latest("Op_fi4305", code_name = "alusta")
objects.latest("Op_fi4305", code_name = "alusta") # [[Pneumokokkirokote]]
objects.latest("Op_en6007", code_name = "answer") # [[OpasnetUtils/Drafts]]


## Read the annual IPD and carriage incidence data.
## Read the annual IPD and carriage incidence data.
Rivi 213: Rivi 228:
## Figure 2 (there given as per 100K incidences).
## Figure 2 (there given as per 100K incidences).
postvacc <-Vaccination(IPD,Car,VT_rows=pcv13rows,p=1,q=1)
postvacc <-Vaccination(IPD,Car,VT_rows=pcv13rows,p=1,q=1)
cat("Incidence of invasive pneumococcal disease after vaccination program (p=1, q=1).\n")
oprint(cbind(serotypes,postvacc[[1]]))
oprint(cbind(serotypes,postvacc[[1]]))
cat("Number of carriers after vaccination program.\n")
oprint(cbind(serotypes,postvacc[[2]]))


## Example S1.2B: Decrease in IPD incidence after adding a single new serotype
## Example S1.2B: Decrease in IPD incidence after adding a single new serotype
Rivi 219: Rivi 238:
next_under5<-NextVT(IPD[,1],Car[,1], VT_rows=pcv13rows,p=1)
next_under5<-NextVT(IPD[,1],Car[,1], VT_rows=pcv13rows,p=1)
next_over5 <-NextVT(IPD[,2],Car[,2], VT_rows=pcv13rows,p=1)
next_over5 <-NextVT(IPD[,2],Car[,2], VT_rows=pcv13rows,p=1)
cat("Next serotype to add to a vaccine (p=1).\n")
oprint(rbind(serotypes, next_under5, next_over5))
oprint(rbind(serotypes, next_under5, next_over5))
# Nämä taulukot kannattaisi transposata niin näyttäisivät siistimmiltä.
# Nämä taulukot kannattaisi transposata niin näyttäisivät siistimmiltä.
Rivi 228: Rivi 248:
## replacing serotype at each stage.
## replacing serotype at each stage.
opt<-OptimalSequence(IPD[,1],Car[,1],VT_rows=0,Excluded_rows=27,p=1.0,HowmanyAdded=20)
opt<-OptimalSequence(IPD[,1],Car[,1],VT_rows=0,Excluded_rows=27,p=1.0,HowmanyAdded=20)
cat("Optimal sequence of serotypes to add to a vaccine (p=1, HowmanyAdded=20).\n")
oprint(rbind(serotypes[opt[1,]],opt[2,]))
oprint(rbind(serotypes[opt[1,]],opt[2,]))


Rivi 234: Rivi 256:
opt<-OptimalSequence(IPD,Car, VT_rows=pcv7rows,Excluded_rows=length(serotypes),
opt<-OptimalSequence(IPD,Car, VT_rows=pcv7rows,Excluded_rows=length(serotypes),
p=0.5,HowmanyAdded=17)
p=0.5,HowmanyAdded=17)
cat("Optimal sequence of serotypes to add to a vaccine (p=0.5, HownamyAdded=17).\n")
oprint(rbind(serotypes[opt[1,]],opt[2,]))
oprint(rbind(serotypes[opt[1,]],opt[2,]))
###################################
## Read the annual IPD and carriage incidence data.
## The 0 entries in IPD and carriage data are replaced by small values.
IPD <- Ovariable("IPD", ddata = "Op_fi4305.pneumokokki_vaestossa")
IPD@data <- IPD@data[IPD@data$Observation == "Incidence" , colnames(IPD@data) != "Observation"]
Car <- Ovariable("Car", ddata = "Op_fi4305.pneumokokki_vaestossa")
Car@data <- Car@data[Car@data$Observation == "Carrier" , colnames(Car@data) != "Observation"]
p <- p_user
q <- q_user
VT_rows <- VT_rows_user
VacCar <- EvalOutput(VacCar)
VacIPD <- EvalOutput(VacIPD)
cat("Number of carriers\n")
oprint(VacCar)
cat("Incidence of invasive pneumococcal disease.\n")
oprint(VacIPD)
ggplot(VacCar@output, aes(x = Serotype, weight = result(VacCar))) + geom_bar() + theme_gray(base_size = 24) +
labs(title = "Carriers", y = "Number of carriers in Finland")
ggplot(VacIPD@output, aes(x = Serotype, weight = result(VacIPD))) + geom_bar() + theme_gray(base_size = 24) +
labs(title = "Incidence of invasive pneumococcal disease", y = "Number of cases / 100000 py")


</rcode>
</rcode>
=== Funktioiden alustus ===


<rcode name="alusta" label="Alusta funktiot" embed=1>
<rcode name="alusta" label="Alusta funktiot" embed=1>
Rivi 394: Rivi 449:
}
}


objects.store(Vaccination, NextVT, OptimalSequence, OptimalVacc)
VacCar <- Ovariable("VacCar",
dependencies = data.frame(Name = c(
"IPD", # incidence of pneumococcus disease
"Car", # number of carriers of pneumococcus
"VT_rows", # vector of names of serotypes in vaccine
"p", # proportion of eliminated VT carriage that is replaced by NVT carriage
"q" # proportion of of VT carriage eliminated by vaccine
)),
formula = function(...) {
##
## Result:
## An ovariable of carriage incidences
## after vaccination (corresponding to Car).
## [Markku Nurhonen 2013, Jouni Tuomisto 2014]
if (length(VT_rows) > 0) {
# Post vaccination carriage incidences
# Sum over serotypes and drop extra columns
Car_Total<- unkeep(oapply(Car, cols = "Serotype", FUN = sum) * 1, prevresults = TRUE)
# Car2 is a temporary ovariable with NVT carriers only
Car2 <- unkeep(Car * 1, prevresults = TRUE)
result(Car2)[Car2@output$Serotype %in% VT_rows] <- 0
Car_NVT <- oapply(Car2, cols = "Serotype", FUN = sum) # Carriers of serotypes not in vaccine (NVT)
Car_VT <- Car_Total - Car_NVT # Carriers of vaccine serotypes
 
CarNew <- q * (1 + p * Car_VT / Car_NVT) * Car2 + (1 - q) * Car
} else {
CarNew <- Car
}
return(CarNew)
}
)
VacIPD <- Ovariable("VacIPD",
dependencies = data.frame(Name = c(
"IPD", # incidence of pneumococcus disease
"Car", # number of carriers of pneumococcus
"VT_rows", # vector of names of serotypes in vaccine
"p", # proportion of eliminated VT carriage that is replaced by NVT carriage
"q" # proportion of of VT carriage eliminated by vaccine
)),
formula = function(...) {
##
## Result:
## An ovariable of IPD incidence
## after vaccination (corresponding to ovariable IPD).
## [Markku Nurhonen 2013, Jouni Tuomisto 2014]
if (length(VT_rows) > 0) {
# Post vaccination carriage incidences (same code as in VacCar)
Car_Total <- unkeep(oapply(Car, cols = "Serotype", FUN = sum) * 1, prevresults = TRUE) # Sums over serotypes
Car2 <- unkeep(Car * 1, prevresults = TRUE)
result(Car2)[Car2@output$Serotype %in% VT_rows] <- 0
Car_NVT <- oapply(Car2, cols = "Serotype", FUN = sum) # Carriers of serotypes not in vaccine (NVT)
Car_VT <- Car_Total - Car_NVT # Carriers of vaccine serotypes
CarNew <- q * (1 + p * Car_VT / Car_NVT) * Car2 + (1 - q) * Car
# Post vaccination IPD incidences
# CCR=Case-to-carrier ratios
CCR <- IPD / Car
 
# Apply the equation appearing above
# equation (1) in text for each serotype.
# First term applies to VTs.
IPDNewVT <- (1 - q) * IPD
result(IPDNewVT)[!IPDNewVT@output$Serotype %in% VT_rows] <- 0
# Second term applies to NVTs.
IPDNewNVT <- (Car_NVT + p * q * Car_VT) * (Car / Car_NVT) * CCR
result(IPDNewNVT)[IPDNewNVT@output$Serotype %in% VT_rows] <- 0
IPDNew <- IPDNewVT + IPDNewNVT
} else {
IPDNew <- IPD
}
return(IPDNew)
}
)
 
objects.store(Vaccination, NextVT, OptimalSequence, OptimalVacc, VacCar, VacIPD)


cat("Funktiot Vaccination, NextVT, OptimalSequence, OptimalVacc tallennettu. \n")
cat("Funktiot Vaccination, NextVT, OptimalSequence, OptimalVacc sekä ovariablet VacCar, VacIPD tallennettu. \n")


</rcode>
</rcode>

Versio 27. toukokuuta 2014 kello 11.24



Rajaus

Kysymys

Miten pitäisi toteuttaa keskustelu pneumokokkirokotteesta avoimen arvioinnin mukaisesti?

Rajaus

Tarkastellaan tilannetta Suomessa nykypäivänä.

Osallistujat

  • Avoimen päätöksentekokäytännön taitajat:
    • Jouni Tuomisto (ohjaaja)
    • Teemu Rintala (mallintaja)
    • Pauli Orden (moderaattori)
    • Timo Koski (moderaattori)
    • Matleena Tuomisto (moderaattori)
    • Tuukka Hämynen (moderaattori)
    • Julia Rintala (osa-aikainen moderaattori)
  • Rokoteasiantuntijat (tämä lista päivitettävä PCV:n mukaiseksi):
    • Hanna Nohynek (vastaava tutkija)
    • Heini Salo
    • Terhi Kilpi
    • Pertti Sormunen
    • Kari Auranen
    • Tuija Leino
    • Simopekka Vänskä

Oletettu käyttö ja käyttäjät

Tämän työn tulosten odotetaan kehittävän jäsentynyttä, perusteltua ja kriittistä rokotekeskustelua Suomessa. Lisäksi se voi jatkossa auttaa rokotehankintoihin liittyviä päätösprosesseja. Tärkeimmät käyttäjät ovat:

  • THL
  • Sosiaali- ja terveysministeriö
  • Lääke- ja rokoteteollisuusteollisuus
  • Kansainväliset rokotetutkijat
  • Kansalaiset

Päätökset

Vastaus

Työssä on ainakin seuraavat osat

  • Keskustelutilan luominen eli osakysymysten päättäminen ja sivujen luonti niille.
  • Keskustelutilan jatkuva seuraaminen ja häiriköinnin siivoaminen.
  • Kommentointityökalun seuraaminen ja kommenttien nosto varsinaiseen tekstiin. Tämä työkalu on niille jotka eivät halua kirjautua.
  • Tägikone on työkalu tekstin jäsentämiseen ja asiasanoittamiseen. Se on koekäytössä.
  • Varsinaisen keskustelun tueksi tuotettava taustamateriaali: wikistetään erilaisia rokotteeseen liittyviä yleisiä ja spesifisiä raportteja ja yhteenvetoja sen hyödyistä, haitoista ja tehosta. Tätä materiaalia voisi alkaa listata ja työstää jo nopeasti.
  • Kustannus-hyötymallin toteutus R:llä JAGSilla.
  • Mallin parametritietojen kerääminen ja syöttäminen malliin.
  • Päätösvaihtoehtojen kuvaaminen (suoraviivainen)
  • Eri vaikutusten kuvaaminen ovariableina osana kausaalimallia. (Nämä lienevät pääosin tiedossa yleistasolla)
  • Lopputuloksia koskevien arvojen kuvaaminen. Tämä on iso työ ja vaatii myös teoriapohdintaa siitä, käytetäänkö esim MCDAta tai kahdesta paremman valitsemista. Molemmat olisi kiinnostavin. Muitakin vaihtoehtoja voi harkita.
  • Osallistujien kouluttaminen keskeisiin menetelmiin tarpeen mukaan. Näitä ovat Keskustelu ja [op_en:Modelling in Opasnet|Opasnet-mallinnus]].
  • Päivitettyjen ohjeiden kirjoittaminen näistä menetelmistä. Menetelmien edelleen kehittäminen tämän hankkeen oppien perusteella.

Kustannukset

  • Jouni Tuomisto: ohjaus ja avoimen päätöksentekokäytännön koordinointi: 3 htkk virkatyönä
  • Opasnet-moderaattorit: 4.5 hlö * 3 kk * 150 h/kk * 12 e/h * 1.35 sivukulut = 32805 e (oletetaan maksimityöllisyys kaikille, vaikka moderaattorit tuskin työskentelevät täyspäiväisesti)
  • R-mallinnus Opasnettiin: 1 hlö * 3 kk * 150 h/kk * 17 e/h * 1.35 sivukulut = 10328 e
  • Rokoteasiantuntijatyö: 3 hlö * 1.5 kk virkatyönä


Vertailun vuoksi: LVMn Liikenne ja viestintä digitaalisessa Suomessa 2020 on houkutellut viikossa toistakymmentä uutta käyttäjää ja n. 50000 merkkiä uutta tekstiä jäsennettäväksi.

Perustelut

Riippuvuudet

  • Päätökset:
  • Muuttujat:
    • rokotuskattavuus
    • rokotteen teho eri kantoihin
    • rokotteen haittavaikutukset
    • rokotteen hinta
    • pneumokokin terveyshaitat: invasiivinen pneumokokki-infektio, välikorvantulehdus, aivokalvontulehdus
    • rokotteen epäsuorat vaikutukset muiden kantojen ja bakteerien yleisyyteen
    • rokotteen epäsuorat vaikutukset antibioottien tarpeeseen ja hoitokustannuksiin
    • laumaimmuniteetti
  • Arvot
    • kustannustehokkuus
    • sairauksien laatupainokertoimet (op_en:Disability weights)
    • sairauksien, rokotteiden ja hoitojen nettikustannukset
    • rokotehaittojen kohdistuminen (ei saisi tulla haittaa niille jotka eivät rokotteesta hyödy)


Wikistettävää aineistoa

  • Tartuntataudit Suomessa 2012 [1] luku Invasiivinen pneumokokkitauti, ss. 30-32.
  • Pneumokokki-konjugaattirokotteen vaikuttavuuden seuranta osana kansallista rokotusohjelmaa - Prosessikuvausasiakirja [2] Kokonaan

Käytettäviä menetelmiä

Muuta aineistoa

Laskenta

Nurhonen M, Auranen K: Optimal serotype compositions for pneumococcal conjugate vaccination under serotype replacement [[5]

The program code with instructions and examples.

This file contains a core set of functions implementing the basic tools presented in the manuscript and instructions on how to use the code. The code is written in the R programming language, which is freely available at www.r-project.org. To run the examples in Sections S1.1-S1.3, first load the functions listed in Section S1.4. The calculation of the projected net effectiveness of a vaccination programme assuming a given vaccine composition is demonstrated in Section S1.2 and Section S1.3 shows how to use the code in searching for optimal vaccine compositions.

S1.1. Data preparation

In our example, we apply the code to the IPD data from Finland and carriage data from Finland and the UK. The data contain 24 serotypes and 2 age categories, the <5 and 5+ year olds.

S1.2 Predicting the net effectiveness under a given vaccine composition

The function Vaccination is an implementation of equation (1). Its arguments are the pre-vaccination IPD and carriage incidences by age category and serotype. It returns the predicted post-vaccination versions of these two matrices. If only one age category is considered, the arguments can be vectors.

Example S1.2A: Calculate the predicted incidence of IPD for the non-vaccine types(NVTs) under PCV13. The predictions are calculated separately for the two age classes. These are the values reported on the bottom panel in Figure 2 (there given as per 100K incidences).

serotypes 8 9N 10 11 12 15 16 20 22 23A 33 35 38 6C Oth
ipd_under5 0.4 3 1.5 1.5 0.8 7.2 0.8 0 3.4 0.4 1.5 1.1 1.5 0 2.7
ipd_over5 30.2 67.8 16.9 34.3 37.4 24.7 12.7 8.9 78.1 11.8 15.2 33.4 3.8 14.8 30.1

Example S1.2B: Decrease in IPD incidence after adding a single new serotype to PCV13 separately for the two age categories.

serotypes 8 9N 10 11 12 15 16 20 22 23A 33 35 38 6C
ipd_under5 0.2 0.8 1.1 -8.9 0.8 4.2 0.4 0 2.2 0 1.5 -2.4 1.1 -3.2
ipd_over5 26.4 64.5 7.7 -10.9 37.3 24.7 -93.3 -2.5 49.2 1.9 15.1 1.2 3.8 -23
S1.3. Finding optimal vaccine serotype compositions

The search for optimal vaccine compositions is implemented in the function “OptimalSequence”. The optimum is found for the entire data, i.e. taking into account all age categories (columns) included in the matrix arguments. If optimum is intended to be found only for one age category, the arguments for “OptimalSequence” should be vectors corresponding to this category.

Example S1.3A: The optimal sequence for under 5 year olds when replacement is 100%. The output shows the decreases in IPD incidence for each step, corresponding to Figure 5(C). The last serotype (row 27, the category "Other") is excluded from any vaccine composition but is taken into account as a replacing serotype at each stage.

rank 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
stype 14 6B 19A 18C 7 4 9V 6A 23F 19F 15 3 22 33 9N 38 10 1 12 16
eff 16.8 15.4 10.3 7.8 2.9 3 2.5 2.2 2.4 5.1 3.3 3.7 2.7 1.8 1.9 1.7 1.8 1.6 1.1 0.9

Example S1.3B: The optimal sequence for the whole population when replacement is 50% and the current composition includes the PCV7 serotypes.

rank 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
stype 3 7 19A 9N 22 12 6A 15 8 35 11 1 33 10 23A 6C 20
effect 82.3 79.3 42.8 40.9 41.6 24 21.1 20.8 20.3 17.7 15.2 15.1 13.6 13.7 8.6 6.1 6.5

Esimerkkejä

  • VT: vaccine serotypes, i.e. pneumococcus serotypes that are found in a vaccine.
  • NVT: non-vaccine serotypes, i.e. pneumococcus serotypes that are not found in the vaccine.

Proportion of VT carriage removed by vaccination:

Proportion of VT carriage removed by vaccination that is replaced by NVT:

Serotypes in a vaccine to look at:
19F
23F
6B
14
9V
4
18C
1
7
6A
19A
3
8
9N
10
11
12
15
16
20
22
23
33
35
38
6C
Other

+ Näytä koodi

Funktioiden alustus

+ Näytä koodi

Data

Pneumokokin esiintyvyys suomalaisessa väestössä. Carrier: (oireettomien) kantajien lukumäärä, Incidence: invasiivisen pneumokokkitaudin ilmaantuvuus 100000 henkilövuotta kohti.

Pneumokokki väestössä(#, #/100000py)
ObsSerotypeAgeCarrierIncidence
119FUnder 51560307.78
223FUnder 51560307.88
36BUnder 512699024.39
414Under 54120020.76
59VUnder 5222902.91
64Under 5128302.91
718CUnder 5101306.64
81Under 5100.31
97Under 5141803.02
106AUnder 5549403.94
1119AUnder 5243209.88
123Under 5121601.25
138Under 513500.1
149NUnder 5209400.83
1510Under 540500.41
1611Under 5722700.42
1712Under 5100.21
1815Under 5331001.98
1916Under 533800.21
2020Under 513500.01
2122Under 5121600.93
2223AUnder 533800.1
2333Under 56800.42
2435Under 5304000.31
2538Under 540500.42
266CUnder 5274700.01
27OthUnder 5243200.73
2819FOver 516810028.51
2923FOver 531480053.72
306BOver 525670029.53
3114Over 520980099.43
329VOver 511410043.07
334Over 56250076.99
3418COver 520070024.39
351Over 51006.58
367Over 510046.88
376AOver 515880017.42
3819AOver 55490020.54
393Over 53080055.04
408Over 5880011.21
419NOver 5880025.2
4210Over 5208006.28
4311Over 59770012.76
4412Over 510013.89
4515Over 51009.18
4616Over 51919004.73
4720Over 5252003.29
4822Over 57250029.03
4923AOver 5220004.4
5033Over 51005.64
5135Over 57130012.41
5238Over 51001.43
536COver 5794005.5
54OthOver 533010011.2

Katso myös

Viitteet