Ero sivun ”Radonin terveysvaikutukset” versioiden välillä

Opasnet Suomista
Siirry navigaatioon Siirry hakuun
(→‎Laskenta: korjattu ja viilattu. Toimii.)
(→‎Laskenta: yleiset ovariablet käännetty englanniksi)
Rivi 154: Rivi 154:
### VÄESTÖN LASKENTA
### VÄESTÖN LASKENTA


väestö <- Ovariable("väestö",  
population <- Ovariable("population",  
dependencies = data.frame(Name = c("kunnat", "asuntovaesto", "aluevastaavuus", "tupakointi")),
dependencies = data.frame(Name = c("kunnat", "asuntovaesto", "aluevastaavuus", "tupakointi")),
formula = function(...) {
formula = function(...) {
Rivi 172: Rivi 172:
objects.latest('Op_fi2759', code_name = 'alusta') # [[Radon sisäilmassa]], ovariable radonpit, data.frame radon.
objects.latest('Op_fi2759', code_name = 'alusta') # [[Radon sisäilmassa]], ovariable radonpit, data.frame radon.


radon$Altiste <- "Radon" # Uusi sarake kuvaamaan sitä, minkä altisteen altistumisesta tai riskistä on kyse ko. rivillä.
radon$Pollutant <- "Radon" # Uusi sarake kuvaamaan sitä, minkä altisteen altistumisesta tai riskistä on kyse ko. rivillä.




Rivi 178: Rivi 178:


tupakkaaltistus <- Ovariable("tupakkaaltistus",  
tupakkaaltistus <- Ovariable("tupakkaaltistus",  
data = data.frame(Tupakoija = c("Kyllä", "Ei"), Altiste = "Tupakka", Result = c(1, 0))
data = data.frame(Tupakoija = c("Kyllä", "Ei"), Pollutant = "Tupakka", Result = c(1, 0))
)
)


Rivi 185: Rivi 185:
radonpit <- EvalOutput(radonpit, N = N)
radonpit <- EvalOutput(radonpit, N = N)


altistus <- Ovariable("altistus",  
exposure <- Ovariable("exposure",  
dependencies = data.frame(Name = c("tupakkaaltistus", "radonpit")),
dependencies = data.frame(Name = c("tupakkaaltistus", "radonpit")),
formula = function(...) {
formula = function(...) {
Rivi 204: Rivi 204:
ERF <- Ovariable("ERF", data = data.frame(
ERF <- Ovariable("ERF", data = data.frame(
Primaaripaikka = "Keuhkot, henkitorvi", # ICD.10.koodi == "C33-34"
Primaaripaikka = "Keuhkot, henkitorvi", # ICD.10.koodi == "C33-34"
Altiste = c("Radon", "Tupakka"),  
Pollutant = c("Radon", "Tupakka"),  
Result = c(1.0016, 20)
Result = c(1.0016, 20)
))
))


tausta.altistus <- 0 # Radonille voisi olla 5.
bkgrexposure <- 0 # Radonille voisi olla 5.


### SYÖPÄKUOLLEISUUS
### SYÖPÄKUOLLEISUUS
Rivi 214: Rivi 214:
objects.latest('Op_fi3912', code_name = 'alusta') # [[Syöpäkuolleisuus Suomessa]], ovariable syopakuolleisuus.
objects.latest('Op_fi3912', code_name = 'alusta') # [[Syöpäkuolleisuus Suomessa]], ovariable syopakuolleisuus.


syopakuolleisuus@data <- syopakuolleisuus@data[syopakuolleisuus@data$Primaaripaikka == "Keuhkot, henkitorvi" , ]  
disincidence <- syopakuolleisuus
disincidence@name <- "disincidence"
disincidence@data <- disincidence@data[disincidence@data$Primaaripaikka == "Keuhkot, henkitorvi" , ]  
# ICD.10.koodi == "C33-34"
# ICD.10.koodi == "C33-34"


###### OSA 3: TAUTIKUORMA
###### OSA 3: TAUTIKUORMA


### ARVIO PERUSTUEN POPULATION ATTRIBUTABLE FRACTIONIIN
### ESTIMATES OF ATTRIBUTABLE CASES BASED ON ATTRIBUTABLE FRACTION
# Tässä oletetaan, että riskisuhteiden avulla voidaan suoraan laskea eri teijöiden osuus tautikuormasta.
# We estimate the number of cases and their attributable causes based on [[Population attributable fractions]].
# Luku on yliarvio, koska jokainen altiste lasketaan ikään kuin muita altisteita ei olisi tautia aiheuttamassa.
# Etuna on, että jokaiselle altisteelle saadaan arvio erikseen.


#vaestoosuus <- 1
#popfraction <- 1 # We don't need the fraction of exposed population, because exposure distribution is
# calculated for each population subroup separately. If there are unexposed people, they are already included
# in the exposure distribution.


kokonaiskeisit <- Ovariable("kokonaiskeisit",  
totcases <- Ovariable("totcases", # This calculates the total number of cases in each population subgroup.
dependencies = data.frame(Name = c("väestö", "syopakuolleisuus", "ERF", "altistus", "tausta.altistus")),
# The cases are NOT attributed to specific (combinations of) causes.
dependencies = data.frame(Name = c(
"population", # Population divided into subgroups as necessary
"disincidence", # Incidence of the disease of interest
"ERF", # Exposure-response function of the pollutants or agents
"exposure", # Exposure to the pollutants
"bkgrexposure"
)), # Background exposure (a level below which you cannot get in practice)
formula = function(...) {
formula = function(...) {


# Tässä on tarkoituksena jakaa tautiriski keisien lukumäärinä väestössä niin pieniin osiin kuin se on mahdollista ilman altistustietoa.
# Calcualte the risk ratio to each subgroup based on the exposure in that subgroup.
väestö <- unkeep(väestö, sources = TRUE, prevresults = TRUE)
# Combine pollutant-specific RRs by multiplying.
syopakuolleisuus <- unkeep(syopakuolleisuus, sources = TRUE, prevresults = TRUE)
RR <- unkeep(exp(log(ERF) * (exposure - bkgrexposure)), prevresults = TRUE, sources = TRUE)  
takeout <- setdiff(colnames(väestö@output)[väestö@marginal], colnames(syopakuolleisuus@output)[syopakuolleisuus@marginal]) # Väestön ne indeksit, jotka EIVÄT OLE tautiriskissä.
RR <- oapply(RR, cols = "Pollutant", FUN = prod)  


väestö@output <- dropall(väestö@output)
# Remove redundant columns.
väestöb <- oapply(väestö, cols = takeout, FUN = sum) # Summaa väestö niin että vain tautiriskin indeksit jäävät.
population@output <- dropall(population@output)
väestöb@output <- väestöb@output[!is.na(result(väestöb)) , ] #Siistitään, vaikkei ehkä ole tarpeen.
population <- unkeep(population, sources = TRUE, prevresults = TRUE)
# oprint(head(väestöb@output))
disincidence <- unkeep(disincidence, sources = TRUE, prevresults = TRUE)
# keisit <-  # Keisien kokonaismäärä tautiriskin määräämissä soluissa.
# takeout is a vector of column names of indices that are NOT in the disease incidence.
takeout <- setdiff(
colnames(population@output)[population@marginal],  
colnames(disincidence@output)[disincidence@marginal]
)


# oprint(head(keisitb@output))
# pci is the proportion of cases across different population subroups based on differential risks and
# ERF <- EvalOutput(ERF)
# population sizes. pci sums up to 1 for each larger subgroup found in disincidence.
# altistus <- EvalOutput(altistus)
# See [[Population attributable fraction]].
 
pci <- unkeep(population * RR, prevresults = TRUE, sources = TRUE)
RR <- unkeep(exp(log(ERF) * (altistus - tausta.altistus)), prevresults = TRUE, sources = TRUE)  
pci <- pci / oapply(pci, cols = takeout, FUN = sum)
RR <- oapply(RR, cols = "Altiste", FUN = prod) # Meitä kiinnostaa kaikkien altisteiden yhteisriski, koska
# laskemme kaikkien keisien yhteismäärää tietyssä osaväestössä.


# oprint(head(RR@output))
population <- oapply(population, cols = takeout, FUN = sum) # Aggregate to larger subgroups.
population@output <- population@output[!is.na(result(population)) , ] # Not sure if this is necessary.


# pci sisältää solukohtaiset altistutiedot ja niiden aiheuttaman lisäriskin. Niinpä yleisemmän tason keisimäärät voidaan pilkkoa pienempiin osiin.
# The cases are divided into smaller subgroups based on weights in pci.
pci <- unkeep(väestö * RR, prevresults = TRUE, sources = TRUE) # [[Population attributable fraction]]
# Redundant columns are removed because totcases are used within attrcases which has same columns.
 
out <- disincidence * population * pci  
# Sitten pilkotaan yli niiden indeksien, jotka vaikuttavat keisien sijoittumiseen alaryhmiin ja joita ei vielä
# huomioida tautiriskissä.
pci <- pci / oapply(pci, cols = takeout, FUN = sum)
 
out <- syopakuolleisuus * väestöb * pci # tautiriskin keisit pitää jakaa kaikkiin niihin ryhmiin, joissa tätä tietoa ei vielä ole eli takeoutin määrittämiin ryhmiin.
out <- unkeep(out, sources = TRUE, prevresults = TRUE)
out <- unkeep(out, sources = TRUE, prevresults = TRUE)
Rivi 265: Rivi 273:
)
)


out <- Ovariable("out",  
attrcases <- Ovariable("attrcases", # Cases attributed to specific (combinations of) causal exposures.
dependencies = data.frame(Name = c("ERF", "altistus", "tausta.altistus", "väestö", "kokonaiskeisit")),
dependencies = data.frame(Name = c(
"ERF", # Exposure-response function
"exposure", # Total exposure to an agent or pollutant
"bkgrexposure", # Background exposure to an agent (a level below which you cannot get in practice)
"population", # Population of concern, divided into subgroups as necessary
"totcases" # Total (i.e., not attributed to causes) amount of cases within population subgroups
)),
formula = function(...) {
formula = function(...) {


# Aluksi laske RR ja poista turhat (kun ovariablea operoidaan itsensä kanssa, ylimääräiset sarakkeet aiheuttavat harmia)
# First calculate risk ratio and remove redundant columns because they cause harm when operated with itself.
RR <- unkeep(exp(log(ERF) * (altistus - tausta.altistus)), prevresults = TRUE, sources = TRUE)  
RR <- unkeep(exp(log(ERF) * (exposure - bkgrexposure)), prevresults = TRUE, sources = TRUE)  
PAF <- (RR - 1) / RR  
PAF <- (RR - 1) / RR  


altisteet <- unique(altistus@output$Altiste)
# pollutants is a vector of pollutants considered.
altisteet <- levels(altisteet)[altisteet]
pollutants <- unique(exposure@output$Pollutant)
pollutants <- levels(pollutants)[pollutants]


out <- 1
out <- 1
for(i in 1:length(altisteet)) {
for(i in 1:length(pollutants)) {
# Yksittäisen altisteen attributable fraction yhdistetään kaikkien altisteiden yhteis-PAFiin, johon tulee
# Attributable fraction of a particular pollutant is combined with all pollutant AFs.
# 2^n riviä (n = altisteiden lukumäärä). Altiste on joko + tai - riippuen aiheuttiko se havaitun taudin vai ei.
# The combination has 2^n rows (n = number of pollutants). Pollutant is either + or - depending on
# whether it caused the disease or not.
temp <- Ovariable(data = data.frame(
temp <- Ovariable(data = data.frame(
Altiste = altisteet[i],  
Pollutant = pollutants[i],  
Temp1 = c(paste(altisteet[i], "-", sep = ""), paste(altisteet[i], "+", sep = "")),  
Temp1 = c(paste(pollutants[i], "-", sep = ""), paste(pollutants[i], "+", sep = "")),  
Result = c(-1, 1) # Altisteen syyttömyyttä merkataan tilapäisesti negatiivisella luvulla.
Result = c(-1, 1) # Non-causes are temporarily marked with negative numbers.
))
))
temp <- temp * PAF
temp <- temp * PAF


# Syyttömät eli negatiiviset altisteet saavat loput (1-AF) selitysosuudesta AF.
# Non-causes are given the remainder (1-AF) of attributable fraction AF.
result(temp) <- ifelse(result(temp) > 0, result(temp), 1 + result(temp))
result(temp) <- ifelse(result(temp) > 0, result(temp), 1 + result(temp))
# Syyllisen osuus 0 merkkautuu ykköseksi. Täytyy korjata.
# Causes with 0 AF are marked 1. This must be corrected.
result(temp) <- ifelse(result(temp) == 1 & grepl("\\+", temp@output$Temp1), 0, result(temp))
result(temp) <- ifelse(result(temp) == 1 & grepl("\\+", temp@output$Temp1), 0, result(temp))
# temp <- unkeep(temp, prevresults = TRUE, sources = TRUE)
out <- out * temp
out <- out * temp
out <- unkeep(out, cols = "Altiste", sources = TRUE, prevresults = TRUE)
out <- unkeep(out, cols = "Pollutant", sources = TRUE, prevresults = TRUE)
 
# Combine and rename columns.
if(i == 1) {
if(i == 1) {
colnames(out@output)[colnames(out@output) == "Temp1"] <- "Causes"
colnames(out@output)[colnames(out@output) == "Temp1"] <- "Causes"
Rivi 306: Rivi 322:
}
}


out <- kokonaiskeisit * out
out <- totcases * out


return(out)
return(out)
Rivi 312: Rivi 328:
)
)


out <- EvalOutput(out)
###################### ACTUAL MODEL
 
attrcases <- EvalOutput(attrcases)
 
####################### OUTPUT GRAPHS AND TABLES


oprint(head(out@output))
oprint(head(attrcases@output))


ggplot(out@output, aes(weight = outResult / N, x = Causes, fill = Talotyyppi)) +
ggplot(attrcases@output, aes(weight = attrcasesResult / N, x = Causes, fill = Talotyyppi)) +
geom_bar(position = 'dodge')
geom_bar(position = 'dodge')


ggplot(out@output, aes(weight = outResult / N, x = Causes, fill = Tupakoija)) +
ggplot(attrcases@output, aes(weight = attrcasesResult / N, x = Causes, fill = Tupakoija)) +
geom_bar(position = 'dodge')
geom_bar(position = 'dodge')


ggplot(out@output, aes(weight = outResult / N, x = Causes, fill = Maakunta)) +
ggplot(attrcases@output, aes(weight = attrcasesResult / N, x = Causes, fill = Maakunta)) +
geom_bar(position = 'stack')
geom_bar(position = 'stack')


if(verbose) {
if(verbose) {
cat("Väestö\n")
cat("Väestö\n")
print(nrow(väestö@output))
print(nrow(population@output))
oprint(head(väestö@output))
oprint(head(population@output))
cat("Kunnat\n")
cat("Kunnat\n")
print(nrow(kunnat@output))
print(nrow(kunnat@output))
Rivi 343: Rivi 363:


cat("Altistus\n")
cat("Altistus\n")
print(nrow(altistus@output))
print(nrow(exposure@output))
oprint(head(altistus@output))
oprint(head(exposure@output))


cat("ERF\n")
cat("ERF\n")
Rivi 354: Rivi 374:


cat("Syöpäkuolleisuus\n")
cat("Syöpäkuolleisuus\n")
print(nrow(syopakuolleisuus@output))
print(nrow(disincidence@output))
oprint(head(syopakuolleisuus@output), digits = 6)
oprint(head(disincidence@output), digits = 6)


cat("Kokonaisvaikutus PAF-menetelmällä\n")
cat("Kokonaisvaikutus PAF-menetelmällä\n")
print(nrow(vaikutuspaf@output))
print(nrow(attrcases@output))
oprint(head(vaikutuspaf@output))
oprint(head(attrcases@output))
}
}


ograph(RR, x = erottelu1, fill =  erottelu2, title = 'Suhteellinen yksilöriski altistumattomaan verrattuna') + coord_trans(y = 'log2')
ggplot(attrcases@output, aes(weight = attrcasesResult, x = Tupakoija, fill = Talotyyppi)) + geom_bar(position = "dodge") +
 
ograph(RR, x = "Tupakka", fill = "Altiste") + coord_trans(y = 'log2')
 
ggplot(vaikutuspaf@output, aes(weight = vaikutuspafResult, x = Tupakka, fill = Talotyyppi)) + geom_bar(position = "dodge") +
theme_grey(base_size = 24) +
theme_grey(base_size = 24) +
labs( # label names
labs( # label names
Rivi 372: Rivi 388:
)
)


#ggplot(vaikutusrr@output, aes(weight = vaikutusrrResult, x = Tupakka, fill = Talotyyppi)) + geom_bar(position = "dodge") +
ggplot(population@output, aes(x = Talotyyppi, weight = populationResult)) + geom_bar() + labs(title = "Väestö")
# theme_grey(base_size = 24) +
# labs( # label names
# title = "Vaikutus RR-menetelmällä"
# )
 
ggplot(väestö@output, aes(x = Talotyyppi, weight = väestöResult)) + geom_bar() + labs(title = "Väestö")


ggplot(altistus@output[altistus@output$Altiste == "Radon" , ], aes(x = altistusResult, fill = Talotyyppi)) + geom_density(alpha = 0.2)
ggplot(exposure@output[exposure@output$Pollutant == "Radon" , ], aes(x = exposureResult, fill = Talotyyppi)) + geom_density(alpha = 0.2)


## POISTETTIIN KOKO KUNTAKARTTATOIMINNALLISUUS, KOSKA JOTKIN OSAT OVAT VANHENTUNEET. ON HELPOMPI RAKENTAA ALUSTA UUDESTAAN.
## POISTETTIIN KOKO KUNTAKARTTATOIMINNALLISUUS, KOSKA JOTKIN OSAT OVAT VANHENTUNEET. ON HELPOMPI RAKENTAA ALUSTA UUDESTAAN.

Versio 28. huhtikuuta 2014 kello 10.06





Kysymys

Mitkä ovat radonin terveysvaikutukset Suomessa? Erityisesti pitäisi tarkastella näitä kysymyksiä:

  • Mikä on radonin kokonaistautitaakka?
  • Kuinka suuri on radonin ja tupakan yhteisvaikutus?
    • Onko kyseessä riippumaton, additiivinen, multiplikatiivinen tai yhteisvaikutus, ja mitä nämä tarkoittavat?
  • Miten radonin tautitaakka jakautuu erilaisissa asunnoissa asuvien kesken (esim. yli tai alle 300 Bq/m3)?
  • Mitä eri toimenpiteitä olisi mahdollista tehdä radonin tautitaakan pienentämiseksi?
    • Mitä muita vaikutuksia näillä toimepiteillä on (kustannukset, kiellot, elämäntapamuutokset, terveyssynergiat?)
  • Mitkä arvoarvostelmat määräävät sitä, mitkä toimepidevaihtoehdoista näyttäytyvät suositeltavina?

Vastaus

Radonin kokonaistautitaakka näyttäisi olevan 1973 DALY /vuosi (ks. Tautitaakka Suomessa ja SETURI/TEKAISU: Sisäilman radonin tautitapausmäärä ja tautitaakka arviot

Kuinka suuri on radonin ja tupakan yhteisvaikutus?

  • Riippumaton: BoD = Tr + Tt - T(r ja t)
  • Additiivinen: BoD = BG * RRr * RRt
  • Multiplikatiivinen: BoD > BG * RRr * RRt
  • Yhteisvaikutus: jotain muuta vai mikä tahansa noista?

Jossa

  • BoD: burden of disease eli tautitaakka
  • T: tapausmäärä (ilmoitettuna DALYina)
  • r: radon
  • t: tupakka
  • BG: taustariski

Ne asunnot, joissa radonpitoisuus on yli 300 Bq/m3, johtavat arviolta 65-80 keuhkosyöpätapaukseen vuodessa. Näistä pelkän radonin aiheuttamia on noin kymmenen tapausta (loput: radon + tupakka). Tämän verran siis vähenisivät tapaukset , jos kaikki 300 Bq/m3 ylitykset korjattaisiin tasolle 0 Bq/m3.

Jos yli 300 Bq/m3 radonpitoisuudet korjataan tasolle 300 Bq/m3, vähenevät keuhkosyöpätapaukset noin 25-40 tapauksella vuodessa (näistä 3- 5 keuhkosyöpää on pelkän radonin aiheuttamaa).

Arvioinnissa on otettu huomioon 300 Bq/m3 ylittävän väestön altistusarvion epätarkkuus 95% luottamusvälillä (10%). Kaikkien radonin (tai radon+tupakka) aiheuttamien keuhkosyöpien määrä, 300 kpl vuodessa, on oletettu tässä arvioinnissa tarkaksi, vaikka vaihteluväli onkin 100 – 600 tapausta. Eli näihin lukuihin täytyy suhtautua lähinnä suuntaa antavina.R↻

Toimenpiteitä radonin tautitaakan pienentämiseksi?

  • Radontuuletus kaikkiin uusiin rakennuksiin.
  • Radontuuletusvalmius kaikkiin uusiin rakennuksiin, tuuletus vain jos mittaus osoittaa korkeita pitoisuuksia.
  • Radontuuletus myös vanhoihin rakennuksiin.
  • Tupakointikielto.
  • Kansalaistiedotus.
  • Radonmittausten kannustaminen tiedolla tai rahallisella tuella.
  • Edellä mainittujen toimien kohdistaminen vain tupakoiviin.
  • Edellä mainittujen toimien kohdistaminen vain radonalueille.

Radontoimepiteiden muita kuin terveysvaikutuksia:

  • Kustannukset.
  • Kiellot ja itsemääräämisoikeus.
  • Elämäntapamuutokset.
  • Vaikutusten kohdistuminen erilaisena kansalaiseen, lähimmäiseen tai yhteiskuntaan.

Arvoarvostelmia:

  • Tautitaakkaa on pienennettävä.
  • Tautitaakkaa on pienennettävä kaikilla toimilla, jotka ovat halvempia kuin 10000 € / DALY (tai jokin muu raja).
  • Kansalaisten itsemääräämisoikeuteen ei saa puuttua.
  • Kansalaisia ja erityisesti lapsia on suojeltava altisteilta, jonka määrään ei voi itse vaikuttaa.

Näkökulmia radonhaitan torjuntaan

Perustelut

Vastaus on alustava, ja malli pitäisi tarkistaa ennen kuin vankkoja päätelmiä tehdään. Kehityskohteita:

  • Maakuntien ja kuntien yhdistäminen pitäisi tehdä jotenkin älykkäästi skräpätystä datasta eikä tässä koodissa.
  • Itä-Uudenmaan kunnat voisi korjata näin: out$Kunta[out$Kunta %in% c("Mäntsälä", "Pornainen", "Porvoo", "etc", "", "", "")] <- "Itä-Uusimaa"
  • Radonpitoisuudet pitää sämplätä maakunnittain, ei kunnittain kuten nyt. Pienillä ännän arvoilla tulee isoja eroja kuntien välille, mutta se on pelkkää harhaa.
  • Epävarmuudet voiti ottaa myös annosvasteisiin.
  • Pitoisuusjakaumat voisi toteuttaa oikeasti jakaumina olettaen esim. lognormaalijakauman epävarmoilla parametreilla joka maakuntaan. Nyt kuvaajiin tulee harhaisia piikkejä. Jos olisi alkuperäisdata, niin voisi tehdä pikku Bayes-mallin.
  • Kartan piirtäminen ja muutamat muut jutut voisi tehdä funktioiksi ja pistää jollekin järkevälle sivulle, josta ne inkludeerataan tähän.
  • Miksi yksikköriski näyttää tosi isolta, mutta kun summataan yli koko väestön, talo*tupakointikohtaiset luvut näyttävät tosi pieniltä.
  • Pitäisi katsoa, onko puuttuvia arvoja, jotka mergatessa slaissaavat dataa pois.
  • Satunnaistaminen pitäisi tehdä sellaisissa vaiheissa, että se olisi nopeaa.
  • Miten pitäisi käsitellä asuntojen radonpitoisuuksien vaihtelu vs. epävarmuus syöpäriskistä? Meneekö 2DMC liian raskaaksi ja onko siitä vastaavaa hyötyä? Voiko saman toteuttaa 1DMC:na siten, että haluttu epävarmuus käsitellään vaihteluna eri tavalla kuin muut?

Laskenta

N:

Minkä tekijän mukaan haluat erotella terveysvasteen (x-akseli)?:

Minkä toisen tekijän mukaan haluat erotella terveysvasteen (väri)?:

Haluatko nähdä välivaiheet?:

+ Näytä koodi

Riippuvuudet

Katso myös

Viitteet


Aiheeseen liittyviä tiedostoja

<mfanonymousfilelist></mfanonymousfilelist>