Difference between revisions of "Assessment of the health impacts of H1N1 vaccination"

From Testiwiki
Jump to: navigation, search
m (Formula)
m
 
(46 intermediate revisions by 5 users not shown)
Line 1: Line 1:
 
[[Category:DARM exercise]]
 
[[Category:DARM exercise]]
{{assessment|moderator=Teemu R|stub=Yes}}
+
[[Category:Online model]]
 +
[[Category:THL publications 2011]]
 +
{{assessment|moderator=Teemu R
 +
| reference = {{publication
 +
| authors        = Teemu Rintala, Jouni T. Tuomisto, Mikko V. Pohjola, Kati Iso-Markku, Virpi Kollanus, Marko Tainio et al.
 +
| page          = Assessment of the health impacts of H1N1 vaccination
 +
| explanation    = Comparison of swine flu vaccination strategies in Finland
 +
| publishingyear = 2011
 +
| urn            =
 +
| elsewhere      =
 +
}}
 +
}}
 +
[[op_fi:Sikainfluenssarokotteen terveyshaitat]]
 +
 
 +
<big> This assessment was completed in 2011, it is no longer actively updated. </big>
 +
 
 +
{{summary box
 +
|question = What was the overall health impact of the H1N1 (swine flu) vaccination in Finland in 2009-2010? Given current knowledge, which was the better decision between vaccinating as happened versus vaccinating no-one versus not vaccinating the population aged 5-19?
 +
|answer = Given current (2011) knowledge, the decision to vaccinate the whole population was the best decision even when narcolepsy is included in the assessment. Results of the [[Value of information]] analysis suggest that further knowledge about the uncertain variables considered very likely would not have changed the decision.}}
 +
 
 +
This assessment is about the total health effects the 2009 swine flu pandemic. It utilizes data from the Infectious disease registry (TTR) maintained by THL, the National narcolepsy task force report from 31.1.2011 and WHO. The current model is a simplification with no time dimension. The assessment has been evaluated. Evaluation results are displayed on the [[Talk:Assessment of the health impacts of H1N1 vaccination#Evaluation of the H1N1 assessment|discussion page]]
  
 
==Scope==
 
==Scope==
  
What was the overall health impact of the H1N1 vaccination, given that there is some evidence of it having caused narcolepsy.
+
*What was the overall health impact of the H1N1 vaccination in Finland in 2009-2010?
 +
*Given current knowledge, which was the better decision between vaccinating as happened versus vaccinating no-one versus not vaccinating the population aged 5-19?
 +
*Monetary impact is not considered.
 +
 
 +
===Participants===
 +
 
 +
* THL: [[User:Virpi Kollanus|Virpi Kollanus]], M.Sc., [[User:Marko|Marko Tainio]], Ph.D., [[User:Mikko Pohjola|Mikko V. Pohjola]], M.Tech.Sci., [[User:Jouni|Jouni T. Tuomisto]], M.D., Dr.Med.Sci., [[User:Teemu R|Teemu Rintala]]
 +
* This is an [[open assessment]]. Anyone can participate.
 +
 
 +
==Result==
 +
 
 +
{{resultlink}}
 +
 
 +
===Results===
 +
 
 +
[[File:Swinefluxnarc prob.dens.png|thumb|500px|Distributions of the results for the different scenarios/decisions.]]
  
==Definition==
+
[[File:Swineflubargraph.png|thumb|500px|Comparison between scenarios and outcomes; onarc is DALYs from narcolepsy, osf is DALYs from having swine flu and osfm is DALYs from swine flu related mortality.]]
 +
 
 +
*From initial results it would appear like swine flu is more significant than narcolepsy in terms of DALYs.
 +
**Vaccinating as planned would result in approximately 1850 DALYs due to swine flu and narcolepsy combined.
 +
**Vaccinating no-one would result in approximately 4400 DALYs due to swine flu.
 +
**Vaccinating everyone but people aged 5-19 would result in about a total of 2000 DALYs.
 +
 
 +
*Probability of swine flu variable is revealed by both the sensitivity- and [[Value of information]]-analyses to have the most impact on the outcome.
 +
**The VOI analysis also reveals that further knowledge about the uncertain variables in the model is only worth up to ~80 DALYs, when considering the decision by age group, and less than 1 DALY when considering the decision as on/off as defined in the decision variable above. Which is only a small fraction of the total DALYs.
 +
 
 +
*Suggested statement: Pandemrix should not be used any more anywhere because its narcolepsy risk is too high.
 +
**Resolution: '''Not accepted'''. Pandemrix is still an effective and safe vaccine. However, due to precautionary reasons, other alternatives should be used when available, because the occurrence of narcolepsy is not understood. {{reslink|Pandemrix should not be used because of narcolepsy risk}}
 +
 
 +
===Conclusions===
 +
 
 +
Given current knowledge, the decision to vaccinate the whole population was the best decision. Results of the [[Value of information]] analysis suggest that further knowledge about the uncertain variables considered very likely would not have changed the decision. The total impact of the swine flu pandemic and related narcolepsy cases in Finland in terms of DALYs is slightly smaller than that of [[Health impact of radon in Europe|radon]] (~6700 DALYs yearly) and slightly larger than that of [[Assessment of building policies' effect on dampness and asthma in Europe|moisture damage]] (~650 DALYs yearly) for instance. It should be noted that only three variables had their uncertainty taken into account, although they should represent the major uncertainties present. Also, herd immunity is assumed not to affect the probability of a non immune subject to catch swine flu, this results in an underestimation of the number of swine flu cases in scenarios where the vaccination coverage is less than what was observed.
 +
 
 +
==Rationale==
  
 
[[File:H1N1 vaccination health impact.png|thumb|500px|Causal diagram.]]
 
[[File:H1N1 vaccination health impact.png|thumb|500px|Causal diagram.]]
 +
 +
;Decisions
 +
*Vaccination decision
 +
**Vaccinate everyone (observed vaccination coverage)
 +
**Vaccinate no-one (0 vaccination coverage)
  
 
;Variables
 
;Variables
 
*[[H1N1 vaccination coverage in Finland]]
 
*[[H1N1 vaccination coverage in Finland]]
 
*[[ERF of H1N1 vaccination on Narcolepsy]]
 
*[[ERF of H1N1 vaccination on Narcolepsy]]
 +
**Assumed lognormally distributed
 
*[[A(H1N1)v immunity in the Finnish population]]
 
*[[A(H1N1)v immunity in the Finnish population]]
 +
**P(immune) = 1 - P(not vaccinated) * P(no base immunity)
 
*[[Population of Finland]]
 
*[[Population of Finland]]
 
*[[Disability weights]]
 
*[[Disability weights]]
 +
**DALY weight of narcolepsy equals roughly that of epilepsy (0.065)
 +
**DALY weight of swine flu for the duration of the disease ~ 0.5 (~ 0.007 DALYs per case when adjusted for duration)
 
*Life expectancy by age groups in Finland<ref>[http://www.who.int/healthinfo/statistics/mortality_life_tables/en/ WHO life table estimates for 2008, Finland]</ref>
 
*Life expectancy by age groups in Finland<ref>[http://www.who.int/healthinfo/statistics/mortality_life_tables/en/ WHO life table estimates for 2008, Finland]</ref>
 
*Probability of catching swine flu given subject is not immune
 
*Probability of catching swine flu given subject is not immune
 +
**Estimated from data available (population, total immunity, number of cases) by fitting the number of cases to a poisson distribution and calculating probability from the mean estimate by dividing by the non-immune population
 
*Fraction of all cases represented by lab confirmed cases (which we have data on)
 
*Fraction of all cases represented by lab confirmed cases (which we have data on)
 +
**Estimated as beta-distributed with mean of 0.2 and some sd
 
*Probability of death due to swine flu given a subject has swine flu and belongs to a risk group
 
*Probability of death due to swine flu given a subject has swine flu and belongs to a risk group
 +
**Estimated from data available
 +
**Assumed all deaths will be lab confirmed cases
 +
**Assumed that all deaths belonged to a risk group (had some base condition)
 
*Fraction of population belonging to a risk group
 
*Fraction of population belonging to a risk group
*Length of swine flu
+
**Arbitrary values; trying to account for kids of age <1 and old folks with heart conditions etc.
 +
*Duration of swine flu
 +
**Assumed to be flat 5 days (mildly incapacitated for this duration)
 +
*[[Narcolepsy in Finland]]
 +
*[[AH1N1 cases in Finland]]
  
 
;Indicators
 
;Indicators
*[[Narcolepsy in Finland]]
+
*DALYs from narcolepsy caused by vaccination
*[[AH1N1 cases in Finland]]
+
*DALYs from having swine flu
 +
*DALYs from deaths caused by swine flu
  
=== Formula ===
+
== R code ==
  
*Basic model, works.
+
*Basic model
**Uncertainties of ERF of vaccine on narcolepsy and probability of catching swine flu are implemented.  
+
**Uncertainties of ERF of vaccine on narcolepsy, fraction of all cases represented by lab confirmed cases and probability of catching swine flu are implemented.  
  
<rcode graphics="1">
+
<rcode graphics="1" variables="name:narcweight|description:Disability weight for narcolepsy|default:0.065|
 +
name:n|description:How many iterations do you want to run? (Full model is 1000 but it is slow)|default:200">
 
# Model; original data inputs are disability weights (isfw, inarcw), population (ipop/dpop), (atm) ERF of vaccine on narcolepsy (NERF),  
 
# Model; original data inputs are disability weights (isfw, inarcw), population (ipop/dpop), (atm) ERF of vaccine on narcolepsy (NERF),  
 
# vaccination coverage (ivac_cov), base immunity in the population (ibimm) and observed number of sf cases (dsf)
 
# vaccination coverage (ivac_cov), base immunity in the population (ibimm) and observed number of sf cases (dsf)
 +
# i in the beginning of the name of an object signifies 'input', d signifies 'data' and t signifies 'temporary'
  
# Function for aggregating indicators into DALYs
+
# Function for aggregating indicators into DALYs. At the moment _narcolepsy cases_ and _swine flu cases_ are considered indicators,
 +
# however mortality due to swine flu should also be considered and indicator and calculated separately from this function.
 
# Narcolepsy DALY weight taken as 0.065 (that of treated epilepsy)
 
# Narcolepsy DALY weight taken as 0.065 (that of treated epilepsy)
 
# iEl is expectation of remaining life in an age group, value for "All" is arbitrary for now
 
# iEl is expectation of remaining life in an age group, value for "All" is arbitrary for now
 
# ilsf is the length of swine flu (e.g. how long was the subject absent frow work) in years
 
# ilsf is the length of swine flu (e.g. how long was the subject absent frow work) in years
 
# ifrg is the fraction of population belonging to a risk group of dying from swine flu, default values are arbitrary
 
# ifrg is the fraction of population belonging to a risk group of dying from swine flu, default values are arbitrary
# iElrgc is the expected life correction for the risk group (people with heart conditions etc are likely to die earlier)
+
# iElrgc is the expected life correction for the risk group (people with heart conditions etc are likely to die earlier anyway)
  
outcome <- function(inarc = narc(), isf = sf(), inarcw = data.frame(Result=0.065),#op_baseGetData("opasnet_base", "Op_en2307")[,-c(1,2)],  
+
outcome <- function(inarc = narc(), isf = sf(), inarcw = data.frame(Result=narcweight),#op_baseGetData("opasnet_base", "Op_en2307"),  
isfw = data.frame(Result=0.5), iEl = data.frame(Age=c("0-4 ","5-9","10-14","15-19","20-24","25-29","30-34","35-39","40-44","45-49",
+
isfw = data.frame(Result=0.5), iEl = data.frame(Age=c("0-4","5-9","10-14","15-19","20-24","25-29","30-34","35-39","40-44","45-49",
 
"50-54","55-59","60-64","65-69","70-74","75-79","80+","All"), Result = c(79,75.1,70.1,65.1,60.3,55.5,50.7,45.9,41.1,36.5,31.9,27.6,
 
"50-54","55-59","60-64","65-69","70-74","75-79","80+","All"), Result = c(79,75.1,70.1,65.1,60.3,55.5,50.7,45.9,41.1,36.5,31.9,27.6,
23.5,19.5,15.7,12.1,9,50)), ilsf = data.frame(Result=5/365), isfpd = sfpd(), ifrg = data.frame(Age = c("0-4 ","5-9","10-14","15-19",
+
23.5,19.5,15.7,12.1,9,50)), ilsf = data.frame(Result=5/365), isfpd = sfpd(), ifrg = data.frame(Age = c("0-4","5-9","10-14","15-19",
 
"20-24","25-29","30-34","35-39","40-44","45-49","50-54","55-59","60-64","65-69","70-74","75-79","80+"), Result = c(0.1, rep(0.001,
 
"20-24","25-29","30-34","35-39","40-44","45-49","50-54","55-59","60-64","65-69","70-74","75-79","80+"), Result = c(0.1, rep(0.001,
11), rep(0.5,5))), iElrgc = data.frame(Age = c("0-4 ","5-9","10-14","15-19","20-24","25-29","30-34","35-39","40-44","45-49","50-54",
+
11), rep(0.5,5))), iElrgc = data.frame(Age = c("0-4","5-9","10-14","15-19","20-24","25-29","30-34","35-39","40-44","45-49","50-54",
 
"55-59","60-64","65-69","70-74","75-79","80+"), Result = c(rep(1,12), rep(0.5,5))), ...) {
 
"55-59","60-64","65-69","70-74","75-79","80+"), Result = c(rep(1,12), rep(0.5,5))), ...) {
 
 
Line 95: Line 169:
 
# Function for calculating narcolepsy cases, depends on erf of vac on narc, pop, vac_cov and background incidence (fraction)
 
# Function for calculating narcolepsy cases, depends on erf of vac on narc, pop, vac_cov and background incidence (fraction)
  
narc <- function(iNERF = op_baseGetData("opasnet_base", "Op_en4923")[,-c(1)], ipop = op_baseGetData("opasnet_base", "Op_en2949")[,-c(1,2)],  
+
narc <- function(iNERF = op_baseGetData("opasnet_base", "Op_en4923"), ipop = op_baseGetData("opasnet_base", "Op_en2949"),  
ivac_cov = op_baseGetData("opasnet_base", "Op_en4925")[,-c(1,2)], ibgi = data.frame(Result=1.4e-5), ...) {
+
ivac_cov = op_baseGetData("opasnet_base", "Op_en4925"), ibgi = data.frame(Result=1.4e-5), ...) {
 +
iNERF <- iNERF[, !colnames(iNERF)%in%c("id", "Result.Text")]
 +
ipop <- ipop[, !colnames(ipop)%in%c("id", "obs", "Result.Text")]
 +
ivac_cov <- ivac_cov[, !colnames(ivac_cov)%in%c("id", "obs", "Result.Text")]
 
names(iNERF)[names(iNERF)=="Result"] <- "iNERF"
 
names(iNERF)[names(iNERF)=="Result"] <- "iNERF"
 
names(ipop)[names(ipop)=="Result"] <- "ipop"
 
names(ipop)[names(ipop)=="Result"] <- "ipop"
Line 109: Line 186:
 
}
 
}
  
# A function for calculating iNERF might be added later
+
# A function for calculating NERF might be added later
  
 
# Function for calculating swine flu cases
 
# Function for calculating swine flu cases
 
# ilcf is the fraction of actual swine flu cases represented by the lab confirmed cases
 
# ilcf is the fraction of actual swine flu cases represented by the lab confirmed cases
# assumed binomially distributed, if uncertainty of probability of getting swine flu is not  
+
# (scrapped)assumed binomially distributed, if uncertainty of probability of getting swine flu is not  
 
# present, the point estimate will be used as such and n samples sampled from the same distribution;
 
# present, the point estimate will be used as such and n samples sampled from the same distribution;
 
# however if the probability has an uncertainty, only 1 sample from each distribution is sampled where
 
# however if the probability has an uncertainty, only 1 sample from each distribution is sampled where
# samples of the probability will be used as inputs; disabled sampling here since it would make different scenarios incomparable
+
# samples of the probability will be used as inputs;(/scrapped) disabled sampling here since it would make different scenarios incomparable
 
 
tlcf <- data.frame(Result = 0.1)#obs = 1:n, Result=rbeta(n, paralpha(0.1, 0.05^2), parbeta(0.1, 0.05^2)))
 
  
sf <- function(isfp = sfp(), ipop = op_baseGetData("opasnet_base", "Op_en2949")[,-c(1,2)], iimm = imm(), n = 1000,  
+
sf <- function(isfp = sfp(), ipop = op_baseGetData("opasnet_base", "Op_en2949"), iimm = imm(), n = 1000,  
ilcf = tlcf, ...) {
+
ilcf = data.frame(Result = 0.2), ...) {
 +
ipop <- ipop[, !colnames(ipop)%in%c("id", "obs", "Result.Text")]
 
names(isfp)[names(isfp)=="Result"] <- "isfp"
 
names(isfp)[names(isfp)=="Result"] <- "isfp"
 
names(ipop)[names(ipop)=="Result"] <- "ipop"
 
names(ipop)[names(ipop)=="Result"] <- "ipop"
Line 146: Line 222:
 
# dsf, dpop and dimm are the actual data we have
 
# dsf, dpop and dimm are the actual data we have
 
# uncertainty: number of cases is binomially distributed, number of trials (n) is the number of people who were not immune to swine-flu
 
# uncertainty: number of cases is binomially distributed, number of trials (n) is the number of people who were not immune to swine-flu
# outcome (x) is known, p is unknown. P can be easily calculated from x = p*n, when we assume that x is the expected value of the  
+
# outcome x is known, p is unknown. P can be easily calculated from x = p*n, when we assume that x is the expected value of the  
 
# distribution. But we're interested in the uncertainty of the estimate... When n is suitably large a poisson distribution becomes  
 
# distribution. But we're interested in the uncertainty of the estimate... When n is suitably large a poisson distribution becomes  
 
# an excellent approximation of the binomial distribution. So we can fit the poisson distribution using an R function (I didn't find
 
# an excellent approximation of the binomial distribution. So we can fit the poisson distribution using an R function (I didn't find
# one for binomial) from just one observation -> acquire value of x with standard error -> use as uncertainty of estimate.
+
# one for binomial) from just one observation -> acquire value of x with standard error -> use as uncertainty of estimate; which produces
 +
# rubbish because we only have a single observation, sd of the mean estimate of the poisson distribution appears to be (n*p)^0.5, so the
 +
# variance of the parameter is n * p, which divided by n gives p ... so the expected value is p and the variance is p, which causes problems
 +
# with the beta distribution (shape parameters become negative), so I've used standard error^4 as the variance...
 +
# Somebody with real knowledge about these things should check this sometime, I'm just playing around with some numbers to get more
 +
# uncertainty in the model.
  
sfp <- function(dsf = op_baseGetData("opasnet_base", "Op_en4933")[,-c(1,2)], dpop = op_baseGetData("opasnet_base", "Op_en2949",  
+
sfp <- function(dsf = op_baseGetData("opasnet_base", "Op_en4933"), dpop = op_baseGetData("opasnet_base", "Op_en2949"), #series_id = 970),
series_id = 970)[,-c(1,2)], dimm = imm(), n = 1000, ...) {
+
dimm = imm(), n = 1000, ...) {
 +
dsf <- dsf[, !colnames(dsf)%in%c("id", "obs", "Result.Text")]
 +
dpop <- dpop[, !colnames(dpop)%in%c("id", "obs", "Result.Text")]
 
names(dsf)[names(dsf)=="Result"] <- "dsf"
 
names(dsf)[names(dsf)=="Result"] <- "dsf"
 
names(dpop)[names(dpop)=="Result"] <- "dpop"
 
names(dpop)[names(dpop)=="Result"] <- "dpop"
Line 164: Line 247:
 
for (i in 1:nrow(out)) {
 
for (i in 1:nrow(out)) {
 
temp2 <- data.frame(obs=1:n, Age=out$Age[i], fitp=rbeta(n, paralpha(fitdistr(round(out$dsf[i]), "poisson")[[1]] /  
 
temp2 <- data.frame(obs=1:n, Age=out$Age[i], fitp=rbeta(n, paralpha(fitdistr(round(out$dsf[i]), "poisson")[[1]] /  
out$popnonimm[i], fitdistr(round(out$dsf[i]), "poisson")[[2]]^2 / out$popnonimm[i]^2),  
+
out$popnonimm[i], (fitdistr(round(out$dsf[i]), "poisson")[[2]]^2 / out$popnonimm[i])^2),  
parbeta(fitdistr(round(out$dsf[i]), "poisson")[[1]] / out$popnonimm[i], fitdistr(round(out$dsf[i]),  
+
parbeta(fitdistr(round(out$dsf[i]), "poisson")[[1]] / out$popnonimm[i], (fitdistr(round(out$dsf[i]),  
"poisson")[[2]]^2 / out$popnonimm[i]^2)))
+
"poisson")[[2]]^2 / out$popnonimm[i])^2)))
 
out2 <- rbind(out2, merge(out[i,], temp2, all.x = TRUE, all.y = FALSE))
 
out2 <- rbind(out2, merge(out[i,], temp2, all.x = TRUE, all.y = FALSE))
 
}
 
}
Line 174: Line 257:
 
}
 
}
  
# Function for calculating probability of mortality after catching swine flu given that a subject belongs to a risk group
+
# Function for calculating probability of mortality after catching swine flu given that the subject belongs to a risk group
 
# children of age < 1 and adults of 60+ afflicted by heart conditions etc are considered to belong to a risk group
 
# children of age < 1 and adults of 60+ afflicted by heart conditions etc are considered to belong to a risk group
 
# ifrg is the fraction belonging to the risk group in a given age group
 
# ifrg is the fraction belonging to the risk group in a given age group
 
# p(death|sf&rg)) assumed constant in all age groups
 
# p(death|sf&rg)) assumed constant in all age groups
 +
# dsf is the data we have on the number of swine flu cases, dmsf is the data on mortality caused by swine flu, dfrg is the data on
 +
# the fraction of population belonging to risk groups (arbitrary default values included)
  
sfpd <- function(dsf = op_baseGetData("opasnet_base", "Op_en4933")[,-c(1,2)], dmsf = data.frame(Result=44),  
+
sfpd <- function(dsf = op_baseGetData("opasnet_base", "Op_en4933"), dmsf = data.frame(Result=44),  
 
dfrg = data.frame(Age = c("0-4 ","5-9","10-14","15-19","20-24","25-29","30-34","35-39","40-44","45-49",
 
dfrg = data.frame(Age = c("0-4 ","5-9","10-14","15-19","20-24","25-29","30-34","35-39","40-44","45-49",
 
"50-54","55-59","60-64","65-69","70-74","75-79","80+"), Result = c(0.1, rep(0.001,11), rep(0.5,5))), ilcf = tlcf, ...) {
 
"50-54","55-59","60-64","65-69","70-74","75-79","80+"), Result = c(0.1, rep(0.001,11), rep(0.5,5))), ilcf = tlcf, ...) {
 +
dsf <- dsf[, !colnames(dsf)%in%c("id", "obs", "Result.Text")]
 
names(dsf)[names(dsf)=="Result"] <- "dsf"
 
names(dsf)[names(dsf)=="Result"] <- "dsf"
 
names(dmsf)[names(dmsf)=="Result"] <- "dmsf"
 
names(dmsf)[names(dmsf)=="Result"] <- "dmsf"
Line 191: Line 277:
 
out <- model.frame(I(dfrg * dsf / ilcf) ~., data = out)
 
out <- model.frame(I(dfrg * dsf / ilcf) ~., data = out)
 
colnames(out)[1] <- "Result"
 
colnames(out)[1] <- "Result"
out <- data.frame(Result=dmsf$dmsf/sum(out$Result))
+
if (sum(as.numeric(colnames(out)=="obs"))>0) {#out <- as.data.frame(as.table(tapply(out$)))
 +
out <- data.frame(obs = levels(factor(out$obs)), Result = dmsf$dmsf/tapply(out$Result, out$obs, sum))
 +
} else {out <- data.frame(Result=dmsf$dmsf/sum(out$Freq))}
 
return(out)
 
return(out)
 
}
 
}
Line 197: Line 285:
 
# Function for calculating total immunity to swine flu in the whole population
 
# Function for calculating total immunity to swine flu in the whole population
 
# P(imm) = P(vac or base_imm)
 
# P(imm) = P(vac or base_imm)
 +
# ibimm is the input background immunity
 +
# ivac_cov is the input vaccination coverage
  
imm <- function(ibimm = op_baseGetData("opasnet_base", "Op_en4943", series_id = 994)[,-c(1,2)],  
+
imm <- function(ibimm = op_baseGetData("opasnet_base", "Op_en4943"), #series_id = 994),  
ivac_cov = op_baseGetData("opasnet_base", "Op_en4925")[,-c(1,2)], ...) {
+
ivac_cov = op_baseGetData("opasnet_base", "Op_en4925"), ...) {
 +
ibimm <- ibimm[, !colnames(ibimm)%in%c("id", "obs", "Result.Text")]
 +
ivac_cov <- ivac_cov[, !colnames(ivac_cov)%in%c("id", "obs", "Result.Text")]
 
names(ibimm)[names(ibimm)=="Result"] <- "ibimm"
 
names(ibimm)[names(ibimm)=="Result"] <- "ibimm"
 
names(ivac_cov)[names(ivac_cov)=="Result"] <- "ivac_cov"
 
names(ivac_cov)[names(ivac_cov)=="Result"] <- "ivac_cov"
Line 208: Line 300:
 
}
 
}
  
# Calculating the outcome with different scenarios
+
######################################################################3
 +
## Calculating the outcome with different scenarios
 +
 
 +
# Libraries loaded and some basic functions defined
  
paralpha <- function(imean, ivar) imean * (imean * (1 - imean) / ivar - 1)
+
paralpha <- function(imean, ivar) imean * (imean * (1 - imean) / ivar - 1) # beta distribution parameters
 
parbeta <- function(imean, ivar) (1 - imean) * (imean * (1 - imean) / ivar - 1)
 
parbeta <- function(imean, ivar) (1 - imean) * (imean * (1 - imean) / ivar - 1)
library(OpasnetBaseUtils)
+
library(OpasnetUtils)
 
library(MASS)
 
library(MASS)
 
library(ggplot2)
 
library(ggplot2)
 +
library(xtable)
 +
 +
# Common variable generation
 +
 +
#n <- 1000
 +
tlcf <- data.frame(obs = 1:n, Result=rbeta(n, paralpha(0.2, 0.1^2), parbeta(0.2, 0.1^2)))
 +
#ggplot(tlcf, aes(x=Result)) + geom_density()
 +
#tlcf <- data.frame(Result = 0.1)
 +
 +
tsfp <- sfp()
 +
 +
#test2 <- data.frame(obs = 1:n, Result=rbeta(n, paralpha(0.2, 0.2^2+0.01), parbeta(0.2, 0.2^2+0.01)))
 +
#ggplot(test2, aes(x=Result)) + geom_density()
  
 
# Default, model based on current knowledge
 
# Default, model based on current knowledge
  
# fast version below
+
test <- op_baseGetData("opasnet_base", "Op_en4926") # Old run
#vacscenario <- outcome(inarc = narc(iNERF = data.frame(Age = c("0-4 ","5-9","10-14","15-19","20-24","25-29","30-34","35-39","40-44","45-49",
+
test <- test[, !colnames(test)%in%c("id", "Result.Text")]
# "50-54","55-59","60-64","65-69","70-74","75-79","80+","All"), Result = c(1,rep(9.2, 3), rep(1, 13), 4))))
+
temp2 <- as.data.frame(as.table(apply(tapply(test$Result, test[,c("Age","Scenario","Outcome")], mean), c(2,3), sum)))
#novacscenario <- outcome(inarc = narc(iNERF = data.frame(Age = c("0-4 ","5-9","10-14","15-19","20-24","25-29","30-34","35-39","40-44","45-49",
+
#ggplot(temp2, aes(x = Scenario, weight = Freq, fill = Outcome)) + geom_bar(position = "stack") # position = "dodge"
# "50-54","55-59","60-64","65-69","70-74","75-79","80+","All"), Result = c(1,rep(9.2, 3), rep(1, 13), 4)),
+
#head(temp2)
# ivac_cov=data.frame(Result=0)), sf(iimm=imm(ivac_cov=data.frame(Result=0))))
+
# For further analysis we need to use our recently generated lab confirmed fraction, this should be uploaded somewhere
#colnames(vacscenario)[ncol(vacscenario)] <- "vacscenario"
 
#colnames(novacscenario)[ncol(novacscenario)] <- "novacscenario"
 
#fout <- merge(vacscenario, novacscenario)
 
#fout
 
 
 
# slow ver below
 
  
tvac_cov <- data.frame(op_baseGetData("opasnet_base", "Op_en4925")[,-c(1,2)], Scenario = "vacscenario")
+
temp <- op_baseGetData("opasnet_base", "Op_en4925") # New run. Op_en4925 = Vaccination coverage in Finland
tvac_cov <- rbind(tvac_cov, data.frame(Age=tvac_cov[,"Age"], Result = 0, Scenario = "novacscenario"))
+
temp <- temp[, !colnames(temp)%in%c("id", "obs", "Result.Text")]
 +
tvac_cov <- data.frame(temp, Scenario = "Vaccinate all")
 +
tvac_cov <- rbind(tvac_cov, data.frame(Age=tvac_cov[,"Age"], Result = 0, Scenario = "Vaccinate nobody"))
 +
temp[2:4,2] <- 0
 +
tvac_cov <- rbind(tvac_cov, data.frame(temp, Scenario = "Vaccinate all but 5-19 a"))
  
test <- outcome(inarc = narc(ivac_cov = tvac_cov), sf(iimm = imm(ivac_cov = tvac_cov)))
+
test <- outcome(inarc = narc(ivac_cov = tvac_cov), isf = sf(isfp = tsfp, iimm = imm(ivac_cov = tvac_cov), ilcf = tlcf))
 +
test[test$Outcome=="onarc", "Outcome"] <- "Narcolepsy"
 +
test[test$Outcome=="osf", "Outcome"] <- "Swine flu morbidity"
 +
test[test$Outcome=="osfm", "Outcome"] <- "Swine flu mortality"
 
temp <- as.data.frame(as.table(tapply(test$Result, test[,c("obs","Scenario")], sum)))
 
temp <- as.data.frame(as.table(tapply(test$Result, test[,c("obs","Scenario")], sum)))
 
ggplot(temp, aes(x = Freq, fill = Scenario)) + geom_density(alpha = 0.2)
 
ggplot(temp, aes(x = Freq, fill = Scenario)) + geom_density(alpha = 0.2)
 +
temp4 <- as.data.frame(as.table(tapply(temp$Freq, temp[,c("Scenario")], mean)))
 +
colnames(temp4) <- c("Decision option", "DALYs")
 +
print(xtable(temp4), type = 'html')
 +
ggplot(test, aes(x = Scenario, weight = Result, fill = Outcome)) + geom_bar(position = "stack") # position = "dodge"
 +
 +
#op_baseWrite("opasnet_base", test)
 +
 +
# Sensitivity and value of information analysis
 +
 +
#test <- op_baseGetData("opasnet_base", "Op_en4926")
 +
temp2 <- as.data.frame(as.table(tapply(test$Result, test[,(colnames(test)%in%c("Result","Outcome"))==FALSE], sum)))
 +
tNERF <- op_baseGetData("opasnet_base", "Op_en4923")
 +
tNERF <- tNERF[, !colnames(tNERF)%in%c("id", "Result.Text")]
 +
colnames(tNERF)[colnames(tNERF)=="Result"] <- "tNERF"
 +
colnames(tlcf)[colnames(tlcf)=="Result"] <- "tlcf"#tlcf from above
 +
colnames(tsfp)[colnames(tsfp)=="Result"] <- "tsfp"#tsfp from above
 +
temp2 <- merge(temp2, tNERF)
 +
temp2 <- merge(temp2, tlcf)
 +
temp2 <- merge(temp2, tsfp)
 +
 +
temp2$NERFbin <- cut(temp2$tNERF, c(-Inf, 1, quantile(temp2$tNERF[temp2$tNERF>1], 1:9/10), Inf))
 +
temp2$lcfbin <- cut(temp2$tlcf, c(-Inf, quantile(temp2$tlcf, 1:9/10), Inf))
 +
temp2$sfpbin <- cut(temp2$tsfp, c(-Inf, quantile(temp2$tsfp, 1:9/10), Inf))
 +
 +
temp3 <- as.data.frame(as.table(tapply(temp2$Freq, temp2[,(colnames(temp2)%in%c("Freq","obs","tNERF","tlcf","tsfp",
 +
"lcfbin","sfpbin"))==FALSE], mean)))
 +
colnames(temp3)[ncol(temp3)] <- "EogNERF"
 +
temp2 <- merge(temp2, temp3)
 +
 +
temp3 <- as.data.frame(as.table(tapply(temp2$Freq, temp2[,(colnames(temp2)%in%c("Freq","obs","tNERF","tlcf","tsfp",
 +
"NERFbin","sfpbin","EogNERF"))==FALSE], mean)))
 +
colnames(temp3)[ncol(temp3)] <- "Eoglcf"
 +
temp2 <- merge(temp2, temp3)
 +
 +
temp3 <- as.data.frame(as.table(tapply(temp2$Freq, temp2[,(colnames(temp2)%in%c("Freq","obs","tNERF","tlcf","tsfp",
 +
"lcfbin","NERFbin","EogNERF","Eoglcf"))==FALSE], mean)))
 +
colnames(temp3)[ncol(temp3)] <- "Eogsfp"
 +
temp2 <- merge(temp2, temp3)
 +
 +
## Correlation
 +
 +
correlations <- as.data.frame(as.table(cor(temp2$Freq, temp2[,c("tNERF", "tlcf", "tsfp")], method = "spearman")))[, 2:3]
 +
colnames(correlations) <- c("Variable", "Spearman correlation vs. outcome")
 +
correlations$Variable <- c("Narcolepsy ERF", "Fraction of lab-confirmed cases", "P(swine flu|non-immune)")
 +
print(xtable(correlations), type = 'html')
 +
 +
## EVPI
 +
 +
EVPI <- mean(tapply(temp$Freq, temp$obs, min)) - min(tapply(temp$Freq, temp$Scenario, mean)) # not considering by age group
 +
 +
EVPI.agegroup <- mean(apply(tapply(temp2$Freq, temp2[,c("obs","Age")], min), 1, sum)) - sum(apply(tapply(temp2$Freq, temp2[,c("Scenario","Age")], mean), 2, min)) # Not used in the table because I am not quite sure what this means
 +
 +
## EVXPI for NERF, lcf and sfp
 +
 +
EVXPI.NERF <- mean(apply(tapply(temp2$EogNERF, temp2[,(colnames(temp2)%in%c("Freq","Scenario","tNERF","tlcf","tsfp","NERFbin","lcfbin","sfpbin",
 +
"EogNERF","Eoglcf","Eogsfp"))==FALSE], min), 2, sum)) - sum(apply(tapply(temp2$Freq, temp2[,c("Scenario","Age")], mean), 2, min))
 +
 +
EVXPI.lcf <- mean(apply(tapply(temp2$Eoglcf, temp2[,(colnames(temp2)%in%c("Freq","Scenario","tNERF","tlcf","tsfp","NERFbin","lcfbin","sfpbin",
 +
"EogNERF","Eoglcf","Eogsfp"))==FALSE], min), 2, sum)) - sum(apply(tapply(temp2$Freq, temp2[,c("Scenario","Age")], mean), 2, min))
 +
 +
EVXPI.sfp <- mean(apply(tapply(temp2$Eogsfp, temp2[,(colnames(temp2)%in%c("Freq","Scenario","tNERF","tlcf","tsfp","NERFbin","lcfbin","sfpbin",
 +
"EogNERF","Eoglcf","Eogsfp"))==FALSE], min), 2, sum)) - sum(apply(tapply(temp2$Freq, temp2[,c("Scenario","Age")], mean), 2, min))
 +
 +
VOI <- data.frame(VOI = c("Total VOI (EVPI)", "Narcolepsy ERF", "Fraction of lab-confirmed cases", "P(swine flu|non-immune)"), value = c(EVPI, EVXPI.NERF, EVXPI.lcf, EVXPI.sfp))
 +
colnames(VOI)[2] <- "Value in DALYs"
 +
print(xtable(VOI), type = 'html')
  
 
#vacscenario <- outcome()
 
#vacscenario <- outcome()
Line 252: Line 427:
 
#temp <- as.data.frame(as.table(tapply(fout$Result, fout[,c("obs","Scenario")], sum)))
 
#temp <- as.data.frame(as.table(tapply(fout$Result, fout[,c("obs","Scenario")], sum)))
 
#ggplot(temp, aes(x = Freq, fill = Scenario)) + geom_density(alpha = 0.2)
 
#ggplot(temp, aes(x = Freq, fill = Scenario)) + geom_density(alpha = 0.2)
 +
</rcode>
  
 +
==See also==
  
# What actually happened
+
* [http://www.academia.edu/527623/Online_authority_communication_during_an_epidemic_A_Finnish_example  Päivi Tirkkonen, Vilma Luoma-aho]:  Online authority communication during an epidemic: A Finnish example
 +
* [http://www.journalsleep.org/ViewAbstract.aspx?pid=27949 About narcolepsy in Journal Sleep]
 +
* [http://www.thl.fi/thl-client/pdfs/dce182fb-651e-48a1-b018-3f774d6d1875 Interim Report of the National Narcolepsy Task Force] in Finland
 +
* [http://www.who.int/vaccine_safety/topics/influenza/pandemic/h1n1_safety_assessing/narcolepsy_statement/en/index.html WHO Statement on narcolepsy and vaccination]
 +
* [http://www.thl.fi/en_US/web/en/pressrelease?id=26352 THL press release about narcolepsy, 1 Sept 2011]
 +
Scientific publications in Pubmed:
 +
[http://www.ncbi.nlm.nih.gov/pmc/articles/PMC3248605]
 +
[http://www.ncbi.nlm.nih.gov/pubmed/22172962]
 +
[http://www.ncbi.nlm.nih.gov/pmc/articles/PMC3192001]
 +
[http://www.ncbi.nlm.nih.gov/pubmed/21534891]
 +
[http://www.ncbi.nlm.nih.gov/pmc/articles/PMC3099488]
 +
[http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2954689]
 +
[http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2954687]
 +
[http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2954688]
  
#defscenario <- outcome(inarc = op_baseGetData("opasnet_base", "Op_en4922")[,-1], isf = op_baseGetData("opasnet_base", "Op_en4933")[,-1])
+
==Keywords==
  
# Narcolepsy erf = 1
+
Swine flu, influenza, vaccination, narcolepsy, risk perception, risk comparison
  
#nerfscenario <- outcome(iNERF = data.frame(Result=1))
+
==References==
  
# No one was vaccinated
+
<references/>
  
#novacscenario <- outcome(ivac_cov = 0)
+
==Related files==
  
# Other
+
{{mfiles}}
</rcode>
 
  
==Result==
+
{{eracedu}}
 
 
*From initial results it would appear like swine flu is more significant than narcolepsy in terms of DALYs.
 
**Vaccinating as planned would result in approximately 2500 DALYs due to swine flu and narcolepsy combined.
 
**Vaccinating no-one would result in approximately 4000 DALYs due to swine flu.
 
 
 
===Results===
 
 
 
===Conclusions===
 
 
 
==See also==
 
 
 
==References==
 
 
 
<references/>
 

Latest revision as of 12:18, 26 August 2014


This assessment was completed in 2011, it is no longer actively updated.

Main message:
Question:

What was the overall health impact of the H1N1 (swine flu) vaccination in Finland in 2009-2010? Given current knowledge, which was the better decision between vaccinating as happened versus vaccinating no-one versus not vaccinating the population aged 5-19?

Answer:

Given current (2011) knowledge, the decision to vaccinate the whole population was the best decision even when narcolepsy is included in the assessment. Results of the Value of information analysis suggest that further knowledge about the uncertain variables considered very likely would not have changed the decision.


This assessment is about the total health effects the 2009 swine flu pandemic. It utilizes data from the Infectious disease registry (TTR) maintained by THL, the National narcolepsy task force report from 31.1.2011 and WHO. The current model is a simplification with no time dimension. The assessment has been evaluated. Evaluation results are displayed on the discussion page

Scope

  • What was the overall health impact of the H1N1 vaccination in Finland in 2009-2010?
  • Given current knowledge, which was the better decision between vaccinating as happened versus vaccinating no-one versus not vaccinating the population aged 5-19?
  • Monetary impact is not considered.

Participants

Result

Show results


Results

Error creating thumbnail: Unable to save thumbnail to destination
Distributions of the results for the different scenarios/decisions.
Error creating thumbnail: Unable to save thumbnail to destination
Comparison between scenarios and outcomes; onarc is DALYs from narcolepsy, osf is DALYs from having swine flu and osfm is DALYs from swine flu related mortality.
  • From initial results it would appear like swine flu is more significant than narcolepsy in terms of DALYs.
    • Vaccinating as planned would result in approximately 1850 DALYs due to swine flu and narcolepsy combined.
    • Vaccinating no-one would result in approximately 4400 DALYs due to swine flu.
    • Vaccinating everyone but people aged 5-19 would result in about a total of 2000 DALYs.
  • Probability of swine flu variable is revealed by both the sensitivity- and Value of information-analyses to have the most impact on the outcome.
    • The VOI analysis also reveals that further knowledge about the uncertain variables in the model is only worth up to ~80 DALYs, when considering the decision by age group, and less than 1 DALY when considering the decision as on/off as defined in the decision variable above. Which is only a small fraction of the total DALYs.
  • Suggested statement: Pandemrix should not be used any more anywhere because its narcolepsy risk is too high.
    • Resolution: Not accepted. Pandemrix is still an effective and safe vaccine. However, due to precautionary reasons, other alternatives should be used when available, because the occurrence of narcolepsy is not understood. R↻

Conclusions

Given current knowledge, the decision to vaccinate the whole population was the best decision. Results of the Value of information analysis suggest that further knowledge about the uncertain variables considered very likely would not have changed the decision. The total impact of the swine flu pandemic and related narcolepsy cases in Finland in terms of DALYs is slightly smaller than that of radon (~6700 DALYs yearly) and slightly larger than that of moisture damage (~650 DALYs yearly) for instance. It should be noted that only three variables had their uncertainty taken into account, although they should represent the major uncertainties present. Also, herd immunity is assumed not to affect the probability of a non immune subject to catch swine flu, this results in an underestimation of the number of swine flu cases in scenarios where the vaccination coverage is less than what was observed.

Rationale

Error creating thumbnail: Unable to save thumbnail to destination
Causal diagram.
Decisions
  • Vaccination decision
    • Vaccinate everyone (observed vaccination coverage)
    • Vaccinate no-one (0 vaccination coverage)
Variables
  • H1N1 vaccination coverage in Finland
  • ERF of H1N1 vaccination on Narcolepsy
    • Assumed lognormally distributed
  • A(H1N1)v immunity in the Finnish population
    • P(immune) = 1 - P(not vaccinated) * P(no base immunity)
  • Population of Finland
  • Disability weights
    • DALY weight of narcolepsy equals roughly that of epilepsy (0.065)
    • DALY weight of swine flu for the duration of the disease ~ 0.5 (~ 0.007 DALYs per case when adjusted for duration)
  • Life expectancy by age groups in Finland[1]
  • Probability of catching swine flu given subject is not immune
    • Estimated from data available (population, total immunity, number of cases) by fitting the number of cases to a poisson distribution and calculating probability from the mean estimate by dividing by the non-immune population
  • Fraction of all cases represented by lab confirmed cases (which we have data on)
    • Estimated as beta-distributed with mean of 0.2 and some sd
  • Probability of death due to swine flu given a subject has swine flu and belongs to a risk group
    • Estimated from data available
    • Assumed all deaths will be lab confirmed cases
    • Assumed that all deaths belonged to a risk group (had some base condition)
  • Fraction of population belonging to a risk group
    • Arbitrary values; trying to account for kids of age <1 and old folks with heart conditions etc.
  • Duration of swine flu
    • Assumed to be flat 5 days (mildly incapacitated for this duration)
  • Narcolepsy in Finland
  • AH1N1 cases in Finland
Indicators
  • DALYs from narcolepsy caused by vaccination
  • DALYs from having swine flu
  • DALYs from deaths caused by swine flu

R code

  • Basic model
    • Uncertainties of ERF of vaccine on narcolepsy, fraction of all cases represented by lab confirmed cases and probability of catching swine flu are implemented.

Disability weight for narcolepsy:

How many iterations do you want to run? (Full model is 1000 but it is slow):

+ Show code

See also

Scientific publications in Pubmed: [2] [3] [4] [5] [6] [7] [8] [9]

Keywords

Swine flu, influenza, vaccination, narcolepsy, risk perception, risk comparison

References

Related files

<mfanonymousfilelist></mfanonymousfilelist>

Error creating thumbnail: Unable to save thumbnail to destination
Error creating thumbnail: Unable to save thumbnail to destination