KTL Sarcoma study: Difference between revisions

From Opasnet
Jump to navigation Jump to search
 
(7 intermediate revisions by the same user not shown)
Line 62: Line 62:
==Rationale==
==Rationale==


===Study population===
=== Methods ===
====Study population====


The majority of sarcoma patients in southern Finland are treated
The majority of sarcoma patients in southern Finland are treated
Line 128: Line 129:
age and area could be found.
age and area could be found.


===Exposure assessment===
====Exposure assessment====


From the matched 337 patients, concentrations of the 17 toxic
From the matched 337 patients, concentrations of the 17 toxic
Line 209: Line 210:
The laboratory has successfully participated in several international quality control studies for the analysis of PCDD/Fs, and PCBs. Matrices in these studies have included cow milk, human milk and human serum. (Yrjänheikki, 1991, Rymen, 1994, WHO, 1996 and Lindström et al., 2000). The laboratory of chemistry in the National Public Health Institute is an accredited testing laboratory (No T077) in Finland (EN ISO/IEC 17025). The scope of accreditation includes PCDD/Fs, non-ortho PCBs, and other PCBs from human tissue samples.
The laboratory has successfully participated in several international quality control studies for the analysis of PCDD/Fs, and PCBs. Matrices in these studies have included cow milk, human milk and human serum. (Yrjänheikki, 1991, Rymen, 1994, WHO, 1996 and Lindström et al., 2000). The laboratory of chemistry in the National Public Health Institute is an accredited testing laboratory (No T077) in Finland (EN ISO/IEC 17025). The scope of accreditation includes PCDD/Fs, non-ortho PCBs, and other PCBs from human tissue samples.


===Statistical analyses===
====Statistical analyses====


Conditional logistic regression analysis was performed with
Conditional logistic regression analysis was performed with
Line 246: Line 247:
preservatives, strong detergents, heavy metals, other chemicals.
preservatives, strong detergents, heavy metals, other chemicals.


===Simulated data===
===Data===


; This code was used to create a csv file that contains a simulated data from this study. When compared with the original data, the simulated data
* [http://ytoswww/yhteiset/Huippuyksikko/Tutkimus/R16_sarkooma/Analyysit/Analyysi020712/Analyysi020712.xls The original data], [http://ytoswww/yhteiset/Huippuyksikko/Tutkimus/R80_Sarkooma2/Analyysi020712b.csv in csv file]
* has the same number of observations,
* [[:Image:KTL Sarcoma study statistical analyses.txt|KTL Sarcoma study statistical analyses.txt]]
* has the same range of values in each variable,
* [http://ytoswww/yhteiset/Huippuyksikko/Tutkimus/R16_sarkooma/Analyysit/Analyysi020712/TuomistoAnalyysiloki20020712.txt Log file about the statistical analyses: Part 1], [http://ytoswww/yhteiset/Huippuyksikko/Tutkimus/R16_sarkooma/Analyysit/Analyysi020712/TuomistoAnalyysiloki20020712_osa2.txt Part2]
* has approximately the same correlation structure between all variables.
* [http://ytoswww/yhteiset/Huippuyksikko/Tutkimus/R16_sarkooma/Analyysit/Analyysi020712/TuomistoAnalyysi020712Tulokset.xls Compilation of the results of statistical analyses]
 
The code below runs the main fish consumption and PCDD/F variables, but because this is personal-level data, you need a password to run it. However, you can see ready-made results [http://en.opasnet.org/en-opwiki/index.php/Special:R-tools?id=0CrH05oF1BEBRYcW].
 
For variable descriptions, see {{disclink|Variable description for reduced data}}
 
<rcode graphics="1" variables="name:password|description:Password|type:password">


<rcode>
library(OpasnetUtils)
library(OpasnetUtils)
library(MASS)
library(mc2d)
library(reshape2)
library(ggplot2)
objects.get("isqT7nvhd0ViUR7d")
objects.get("isqT7nvhd0ViUR7d")


Line 266: Line 267:
data <- data[2:nrow(data), 2:ncol(data)]
data <- data[2:nrow(data), 2:ncol(data)]


data2 <- data
for(i in 1:ncol(data)) {
fun <- c(rep("normal", 5), rep("poisson", 12), rep("lognormal", 19))
data[[i]] <- as.numeric(as.character(data[[i]]))
}


params <- list()
colnames(data)[colnames(data) == "aluenro"] <- "BMI" # Poistetaan aluenro-sarake ja korvataan se BMI:llä.
data$BMI <- data$Paino / (data$Pituus / 100)^2


for(i in 1:ncol(data2)) {
# oprint(head(data))
data2[[i]] <- as.numeric(as.character(data2[[i]]))
if(i > 17) data2[[i]] <- ifelse(data2[[i]] == 0, 0.01, data2[[i]])
params[i] <- fitdistr(data2[[i]][!is.na(data2[[i]])], fun[i])
}


simu <- data.frame(temp = rep(NA, 968))
cat("Data from P:\\huippuyksikko\\Tutkimus\\R16_sarkooma\\Data\\Panulle20031216\\Analyysi020712_typistetty.xls.", nrow(data), "observations.\n")


for(i in 1:5) {
oprint(cor(x = data, use = "pairwise.complete.obs", method = "pearson"))
simu[[i]] <- rnorm(968, params[[i]][1], params[[i]][2])
}
for(i in 6:17) {
simu[[i]] <- rpois(968, params[[i]])
}
for(i in 18:36) {
simu[[i]] <- rlnorm(968, params[[i]][1], params[[i]][2])
}
simu[[3]] <- rbern(968, 0.5) + 1


colnames(simu) <- colnames(data)
# Basic Scatterplot Matrix
pairs(~ika+BMI+Kalaa+Silakkaa+PF23478+WHOTEQ, data = data,
  main="Simple Scatterplot Matrix")


korre <- cor(x = data2, use = "pairwise.complete.obs", method = "spearman")
</rcode>


simu <- as.data.frame(cornode(as.matrix(simu), target = korre))
==== Questionnaire ====


korre2 <- cor(x = simu, use = "pairwise.complete.obs", method = "spearman")
* {{#l:KTL_sarcoma_questionnaire_finnish.odt}}
* {{#l:KTL_sarcoma_questionnaire_swedish.odt}}


qplot(melt(korre)$value, melt(korre2)$value)
====Variable information====


for(i in 1:ncol(simu)) {
The variable information was originally documented in [http://ytoswww/yhteiset/Huippuyksikko/Tutkimus/R16_sarkooma/Analyysit/Analyysi020712/TuomistoAnalyysiloki20020712.txt Log file about the statistical analyses: Part 1], but unfortunately mostly in Finnish.
simu[[i]] <- ifelse(
simu[[i]] > max(data[[i]], na.rm = TRUE) |
simu[[i]] < min(data[[i]], na.rm = TRUE),
NA, simu[[i]]
)
}


for(i in 1:ncol(data2)) {print(paste(
{{hidden|
min(data2[[i]], na.rm = TRUE),
1 =  
max(data2[[i]], na.rm = TRUE),
Tähän on syytä kirjata myös muuttujaluettelo, koska sitä ei ole missään muualla kunnolla tehty.
min(simu[[i]], na.rm = TRUE),
      LEIKKAUS    leikkauspvm, SASin oma formaatti (päivää jostakin kiintopisteestä?)
max(simu[[i]], na.rm = TRUE)
      IKA        ikä vuosina leikkauspäivänä
))}
      ALUENRO    aluenro tutkimusalue (potilaan kotiosoitteen postinumeron perusteella)
 
1 -
</rcode>
2 Espoo
 
3 Helsinki
===Other data===
4 Hyvinkää
 
5 Hämeenlinna
* [http://ytoswww/yhteiset/Huippuyksikko/Tutkimus/R16_sarkooma/Analyysit/Analyysi020712/Analyysi020712.xls The original data], [http://ytoswww/yhteiset/Huippuyksikko/Tutkimus/R80_Sarkooma2/Analyysi020712b.csv in csv file]
6 Joensuu
* [[:Image:KTL Sarcoma study statistical analyses.txt|KTL Sarcoma study statistical analyses.txt]]
7 Jyväskylä
* [http://ytoswww/yhteiset/Huippuyksikko/Tutkimus/R16_sarkooma/Analyysit/Analyysi020712/TuomistoAnalyysiloki20020712.txt Log file about the statistical analyses: Part 1], [http://ytoswww/yhteiset/Huippuyksikko/Tutkimus/R16_sarkooma/Analyysit/Analyysi020712/TuomistoAnalyysiloki20020712_osa2.txt Part2]
8 Kotka
* [http://ytoswww/yhteiset/Huippuyksikko/Tutkimus/R16_sarkooma/Analyysit/Analyysi020712/TuomistoAnalyysi020712Tulokset.xls Compilation of the results of statistical analyses]
9 Kuopio
 
10 Lahti
The code below runs the main fish consumption and PCDD/F variables, but because this is personal-level data, you need a password to run it. However, you can see ready-made results [http://en.opasnet.org/en-opwiki/index.php/Special:R-tools?id=0CrH05oF1BEBRYcW].
11 Lappeenranta
 
12 Pori
For variable descriptions, see {{disclink|Variable description for reduced data}}
13 Seinäjoki
 
14 Tampere
<rcode graphics="1" variables="name:password|description:Password|type:password">
15 Turku
 
16 Vaasa
library(OpasnetUtils)
      PNRO        postinumero K3 (K#=kyselylomakkeen kysymys nro #)
objects.get("isqT7nvhd0ViUR7d")
      STRATUM    stratum eli tapauksen numero ilman S-etuliitettä
 
      STRATASE    strataset eli tässä analyysissä 9
data <- objects.decode(etable, password)
      DGLUOKKA    diagnoosiluokka tapauksilla
colnames(data) <- t(data[1, ])
DG_id DGnimi
data <- data[2:nrow(data), 2:ncol(data)]
1 MFH
 
2 Liposarcoma
for(i in 1:ncol(data)) {
3 Leiomyosarcoma
data[[i]] <- as.numeric(as.character(data[[i]]))
4 Angiosarcoma
}
5 Chondrosarcoma
 
6 Sarcoma synoviale
colnames(data)[colnames(data) == "aluenro"] <- "BMI" # Poistetaan aluenro-sarake ja korvataan se BMI:llä.
7 Sarcoma Ewing
data$BMI <- data$Paino / (data$Pituus / 100)^2
8 Dermatofibrosarcoma
 
9 Sarcoma alia
# oprint(head(data))
10 Sarcoma NUD
 
11 Ei tietoa
cat("Data from P:\\huippuyksikko\\Tutkimus\\R16_sarkooma\\Data\\Panulle20031216\\Analyysi020712_typistetty.xls.", nrow(data), "observations.\n")
12 Osteosarcoma extrasceletale
 
21 Lipoma
oprint(cor(x = data, use = "pairwise.complete.obs", method = "pearson"))
22 Tumor Desmoides
 
23 Myxoma
# Basic Scatterplot Matrix
24 Muu benigni tuumori
pairs(~ika+BMI+Kalaa+Silakkaa+PF23478+WHOTEQ, data = data,
25 Melanoma
  main="Simple Scatterplot Matrix")
26 Muu kuin tuumori
 
27 Tuplanäyte
</rcode>
      SP          sukupuoli 1: mies, 2: nainen K6
 
      KOULUV      kouluvuodet K8
===Variable information===
      PITUUS      pituus, cm K15
 
      PAINO      paino nyt, kg K16
The variable information was originally documented in [http://ytoswww/yhteiset/Huippuyksikko/Tutkimus/R16_sarkooma/Analyysit/Analyysi020712/TuomistoAnalyysiloki20020712.txt Log file about the statistical analyses: Part 1], but unfortunately mostly in Finnish.
      KALAA      kalansyönti K21
 
1 Harvemmin kuin kerran kuukaudessa tai en lainkaan
{{hidden|
2 Kerran tai pari kuukaudessa
1 =
3 Kerran viikossa
Tähän on syytä kirjata myös muuttujaluettelo, koska sitä ei ole missään muualla kunnolla tehty.
4 Pari kertaa viikossa
       LEIKKAUS   leikkauspvm, SASin oma formaatti (päivää jostakin kiintopisteestä?)
5 Lähes joka päivä
       IKA        ikä vuosina leikkauspäivänä
6 Kerran päivässä tai useammin
       ALUENRO     aluenro tutkimusalue (potilaan kotiosoitteen postinumeron perusteella)
      PETOKALA    K22 (muuttujaan _YRI_ISI asti)
1 -
0 En lainkaan
2 Espoo
1 Harvemmin kuin kerran kuukaudessa
3 Helsinki
2 Kerran tai pari kuukaudessa
4 Hyvinkää
3 Kerran viikossa
5 Hämeenlinna
4 Pari kertaa viikossa
6 Joensuu
5 Lähes joka päivä
7 Jyväskylä
      MUIKKUA   
8 Kotka
      SIS_VESI   
9 Kuopio
      KIRJOLOH   
10 Lahti
      SILAKKAA   
11 Lappeenranta
      IT_MEREN   
12 Pori
      MUUTA_IT   
13 Seinäjoki
      PAKASTEK   
14 Tampere
      KALAS_IL   
15 Turku
      VALTAMER   
16 Vaasa
      _YRI_ISI   
       PNRO        postinumero K3 (K#=kyselylomakkeen kysymys nro #)
      SADE        sädehoito K47
       STRATUM     stratum eli tapauksen numero ilman S-etuliitettä
      VASTATTU    onko kysely palautettu? YES/NO
       STRATASE   strataset eli tässä analyysissä 9
      SADEAIK    aikaisempi sädehoito (yhdistelty kyselyn ja sairaalan tiedoista)
      DGLUOKKA    diagnoosiluokka tapauksilla
      TCDF2378    kongeneerispesifinen pitoisuus ng/kg (absoluuttiyksiköt rasvassa)
  DG_id DGnimi
       TCDD2378    
1 MFH
       PF12378   
2 Liposarcoma
      PF23478   
3 Leiomyosarcoma
       PD12378      
4 Angiosarcoma
      HF123478   
5 Chondrosarcoma
      HF123678   
6 Sarcoma synoviale
      HF234678   
7 Sarcoma Ewing
      HF123789   
8 Dermatofibrosarcoma
      HD123478   
9 Sarcoma alia
      HD123678   
10 Sarcoma NUD
      HD123789   
11 Ei tietoa
      F1234678   
12 Osteosarcoma extrasceletale
      F1234789   
21 Lipoma
      D1234678   
  22 Tumor Desmoides
      OCDF       
23 Myxoma
      OCDD       
24 Muu benigni tuumori
      TOXSUM      edellä mainittujen 17 kongeneerin summa
25 Melanoma
      WHOTEQ      edellä mainittujen 17 kongeneerin WHO-TEF-kertoimella painotettu summa
  26 Muu kuin tuumori
       TUPAK      oletko koskaan tupakoinut 1=ei, 2=kyllä K30
  27 Tuplanäyte
       TSTATUS     tupakointi: 1= < 6 kk sitten, 2= > 6 kk sitten, 3=ei koskaan K30+K32
      SP          sukupuoli 1: mies, 2: nainen K6
       PACKYEAR   askivuodet: poltetut vuodet K31*( eri valmisteiden summa kpl/pvä K33)/20
      KOULUV      kouluvuodet K8
  NULL, jos K30=2 mutta K32=NULL
      PITUUS      pituus, cm K15
      KEMIK      monelleko kemikaaliryhmälle on altistunut? K42
      PAINO      paino nyt, kg K16
  Onko altistunut 1=en, 2=kyllä (K42 muuttujaan MUU2 asti)
      KALAA      kalansyönti K21
      LIUOTTI    liuottimet
  1 Harvemmin kuin kerran kuukaudessa tai en lainkaan
      MAALIT      liuotinpohjaiset maalit
2 Kerran tai pari kuukaudessa
      FORMALDE    formaldehydi
  3 Kerran viikossa
      HYONTEIS    hyönteismyrkyt
  4 Pari kertaa viikossa
      KASVINSU    kasvinsuojeluaineet
  5 Lähes joka päivä
      KYLLASTE    puunkyllästeet
  6 Kerran päivässä tai useammin
      PESUAINE    voimakkaat pesuaineet
       PETOKALA    K22 (muuttujaan _YRI_ISI asti)
      METALLIT    raskasmetallit
0 En lainkaan
      MUU1        muu
1 Harvemmin kuin kerran kuukaudessa
      MUU2        muu
2 Kerran tai pari kuukaudessa
  K42 kuvauksen perusteella 0=ei altistusta 4=pahin altistus
  3 Kerran viikossa
      HYONLUOK    hyönteismyrkyt
4 Pari kertaa viikossa
      KASVLUOK    kasvinsuojeluaineet
5 Lähes joka päivä
      KYLLLUOK    puunkyllästeet
       MUIKKUA   
      ALKO        kuinka usein alkoholia K35
      SIS_VESI    
  1 päivittäin
       KIRJOLOH   
  2 muutaman kerran viikossa
      SILAKKAA   
3 noin kerran viikossa
       IT_MEREN   
4 pari kertaa kuukaudessa
       MUUTA_IT   
5 noin kerran kuukaudessa
      PAKASTEK   
  6 noin kerran parissa kuukaudessa
       KALAS_IL   
  7 3-4 kertaa vuodessa
       VALTAMER   
  8 pari kertaa vuodessa
      _YRI_ISI   
  9 kerran vuodessa tai harvemmin
      SADE        sädehoito K47
  10 en koskaan
      VASTATTU    onko kysely palautettu? YES/NO
       ALKOUS      K35 ilmoitettuna kertaa/viikko (7, 3, 1, 0.5, 0.2, 0.1, 0.05, 0.03, 0.01, 0)
       SADEAIK     aikaisempi sädehoito (yhdistelty kyselyn ja sairaalan tiedoista)
      ALKOKULU    alkoholin kulutus annosta/viikko. Lasketaan K36=pal ja K35 avulla
      TCDF2378    kongeneerispesifinen pitoisuus ng/kg (absoluuttiyksiköt rasvassa)
  alkokulu: IIf([pal] Is Null And [alko]>8,0,[alkous]*[alkomaar])
       TCDD2378   
alkomaar  K36 ilmoitettuna annosta/kerta: 0,1,2,3,5,8,12 annosta
      PF12378   
       ASUKKAIT   potilaan kotikunnan asukasluku (vuonna 1996? Pitäisikö tarkistaa mistä tilasto on?)
       PF23478   
       bmi        paino / pituus / pituus * 10000
       PD12378   
       mkala      Nämä kolme kalamuuttujaa on saatu regressiomallilla sovittamalla luokittelu-
      HF123478   
       mkaladio    muuttujat suoraan regressiomalliin. Yksiköt ovat siis epämääräisiä. Ehkä pitäisi
      HF123678   
       mkalamuu    muuttaa ensin kalamuuttujat muotoon annosta/kk niin olisi mielekäs tulkinta?
      HF234678   
       muu        if muu1 = 1 or muu2 = 1 then muu = 1 (muuten muu=0) HUOM! Tämä muu on laskettu
      HF123789   
                  päin mäntyä: 1 tarkoittaa ei altistusta eli jos ei ole kahta altistusta, merkitään
      HD123478   
                  altistuneeksi ja jos ei ole tietoa tai on kaksi altistusta, merkitään
      HD123678   
                  altistumattomaksi. ÄLÄ KÄYTÄ SIIS TÄTÄ MUUTTUJAA MISSÄÄN!
      HD123789   
       smoking     3-tstatus; 0=ei ikinä tupakoinut, 1= > 6 kk sitten, 2= < 6 kk sitten
      F1234678   
       never      smoking jaetaan 0->never=1, 1->former=1, 2->current=1
      F1234789   
       former
      D1234678   
       current
      OCDF       
mkala = 1.180840432 +
      OCDD       
      PETOKALA * 0.285437176 +
      TOXSUM      edellä mainittujen 17 kongeneerin summa
      MUIKKUA  * 0.120796063 +
      WHOTEQ      edellä mainittujen 17 kongeneerin WHO-TEF-kertoimella painotettu summa
      SIS_VESI * 0.081192631 +
      TUPAK       oletko koskaan tupakoinut 1=ei, 2=kyllä K30
      KIRJOLOH * 0.432524410 +
      TSTATUS    tupakointi: 1= < 6 kk sitten, 2= > 6 kk sitten, 3=ei koskaan K30+K32
      SILAKKAA * 0.201481292 +
      PACKYEAR    askivuodet: poltetut vuodet K31*( eri valmisteiden summa kpl/pvä K33)/20
      IT_MEREN * 0.186820358 +
NULL, jos K30=2 mutta K32=NULL
      MUUTA_IT *-0.096115539 +
      KEMIK       monelleko kemikaaliryhmälle on altistunut? K42
      PAKASTEK * 0.105839909 +
  Onko altistunut 1=en, 2=kyllä (K42 muuttujaan MUU2 asti)
      KALAS_IL *-0.059836406 +
      LIUOTTI    liuottimet
      VALTAMER * 0.095303307 +
      MAALIT      liuotinpohjaiset maalit
      _YRI_ISI * 0.033074683;
      FORMALDE    formaldehydi
mkaladio = 1.180840432 +
      HYONTEIS    hyönteismyrkyt
      SILAKKAA * 0.201481292 +
      KASVINSU    kasvinsuojeluaineet
       IT_MEREN * 0.186820358;
      KYLLASTE    puunkyllästeet
mkalamuu = 1.180840432 +
      PESUAINE    voimakkaat pesuaineet
      PETOKALA * 0.285437176 +
      METALLIT    raskasmetallit
      MUIKKUA  * 0.120796063 +
      MUU1        muu
      SIS_VESI * 0.081192631 +
      MUU2        muu
       KIRJOLOH * 0.432524410 +
K42 kuvauksen perusteella 0=ei altistusta 4=pahin altistus
      MUUTA_IT *-0.096115539 +
      HYONLUOK    hyönteismyrkyt
      PAKASTEK * 0.105839909 +
      KASVLUOK    kasvinsuojeluaineet
      KALAS_IL *-0.059836406 +
      KYLLLUOK    puunkyllästeet
      VALTAMER * 0.095303307 +
      ALKO        kuinka usein alkoholia K35
      _YRI_ISI * 0.033074683;
1 päivittäin
}}
2 muutaman kerran viikossa
 
3 noin kerran viikossa
====Data management====
4 pari kertaa kuukaudessa
 
5 noin kerran kuukaudessa
'''Code to manage the data. It takes the original data files and merges them. Works only if files are available.
6 noin kerran parissa kuukaudessa
 
7 3-4 kertaa vuodessa
{{hidden|
8 pari kertaa vuodessa
<pre>
9 kerran vuodessa tai harvemmin
# Sarcoma epidemiological data
10 en koskaan
# Data was obtained from this data file (saved 23.9.2002, version 12.7.2002)
      ALKOUS      K35 ilmoitettuna kertaa/viikko (7, 3, 1, 0.5, 0.2, 0.1, 0.05, 0.03, 0.01, 0)
# It contains all data that was used in the publication but not e.g. all questionnaire data.
      ALKOKULU    alkoholin kulutus annosta/viikko. Lasketaan K36=pal ja K35 avulla
# U:\arkisto_kuopio\huippuyksikko\Tutkimus\R16_sarkooma\Analyysit\Analyysi020712\Analyysi020712.xls
alkokulu: IIf([pal] Is Null And [alko]>8,0,[alkous]*[alkomaar])
 
alkomaar  K36 ilmoitettuna annosta/kerta: 0,1,2,3,5,8,12 annosta
library(OpasnetUtils)
      ASUKKAIT    potilaan kotikunnan asukasluku (vuonna 1996? Pitäisikö tarkistaa mistä tilasto on?)
 
      bmi        paino / pituus / pituus * 10000
sarc <- read.table(
      mkala      Nämä kolme kalamuuttujaa on saatu regressiomallilla sovittamalla luokittelu-
"//cesium/yhteiset/YMAL/Projects/Silakan riskiarvio/Data/Salaiset/Sarkooma/Analyysi020712_copy.csv",
      mkaladio    muuttujat suoraan regressiomalliin. Yksiköt ovat siis epämääräisiä. Ehkä pitäisi
sep = ",", header = TRUE
      mkalamuu    muuttaa ensin kalamuuttujat muotoon annosta/kk niin olisi mielekäs tulkinta?
)
      muu        if muu1 = 1 or muu2 = 1 then muu = 1 (muuten muu=0) HUOM! Tämä muu on laskettu
 
                  päin mäntyä: 1 tarkoittaa ei altistusta eli jos ei ole kahta altistusta, merkitään
colnames(sarc)[c(24, 27, 28, 30, 32)] <- c(
                  altistuneeksi ja jos ei ole tietoa tai on kaksi altistusta, merkitään
"Sisävesikalaa",
                  altistumattomaksi. ÄLÄ KÄYTÄ SIIS TÄTÄ MUUTTUJAA MISSÄÄN!
"Itämeren.lohta",
      smoking    3-tstatus; 0=ei ikinä tupakoinut, 1= > 6 kk sitten, 2= < 6 kk sitten
"Muuta.Itämerestä",
      never      smoking jaetaan 0->never=1, 1->former=1, 2->current=1
"Kalasäilykkeitä",
      former
"Äyriäisiä"
      current
)
mkala = 1.180840432 +
 
      PETOKALA * 0.285437176 +
########################################### Questionnaire
      MUIKKUA  * 0.120796063 +
# The questions come from the questionnaire form
      SIS_VESI * 0.081192631 +
# U:\arkisto_kuopio\huippuyksikko\Tutkimus\R16_sarkooma\KTL_sarcoma_study_questionnaire.odt
      KIRJOLOH * 0.432524410 +
# The questionnaire data comes from
      SILAKKAA * 0.201481292 +
# U:\arkisto_kuopio\huippuyksikko\Tutkimus\R80_Sarkooma2\Data\Kyselyt.xls (Kyselyt.csv does not contain åäö)
      IT_MEREN * 0.186820358 +
# Kyselyt.xls was saved to N:\YMAL\Projects\Silakan riskiarvio\Data\Salaiset\Kyselyt.csv
      MUUTA_IT *-0.096115539 +
 
      PAKASTEK * 0.105839909 +
ques <- read.table(
      KALAS_IL *-0.059836406 +
"//cesium/yhteiset/YMAL/Projects/Silakan riskiarvio/Data/Salaiset/Kyselyt.csv",
      VALTAMER * 0.095303307 +
sep = ",", header = TRUE
      _YRI_ISI * 0.033074683;
)
mkaladio = 1.180840432 +
 
      SILAKKAA * 0.201481292 +
poista <- c(
      IT_MEREN * 0.186820358;
"Pituus",
mkalamuu = 1.180840432 +
"Paino",
      PETOKALA * 0.285437176 +
"Kalaa",
      MUIKKUA  * 0.120796063 +
"Petokalaa",
      SIS_VESI * 0.081192631 +
"Muikkua",
      KIRJOLOH * 0.432524410 +
"Sisävesikalaa",
      MUUTA_IT *-0.096115539 +
"Kirjolohta",
      PAKASTEK * 0.105839909 +
"Silakkaa",
      KALAS_IL *-0.059836406 +
"Itämeren.lohta",
      VALTAMER * 0.095303307 +
"Muuta.itämerestä",
      _YRI_ISI * 0.033074683;
"Pakastekalaa",
}}
"Kalasäilykkeitä",
"Valtamerikalaa",
"Äyriäisiä",
"Vastattu",
"AlkoKuinka.usein",
"Onko1",
"Onko2",
"Onko3",
"Onko4",
"Onko5",
"Onko6",
"Onko7",
"Onko8",
"Onko9",
"Onko10"
)


===Data management===
# The tests below shows that the questionnaire columns in sarc and ques are actually identical. Therefore
# we remove them from ques and keep those in sarc, the data file that was used in the publication.


'''Code to manage the data. It takes the original data files and merges them. Works only if files are available.
#for(i in testaa) {
# x <- dat[[paste(i, ".x", sep = "")]]
# if(is.factor(x)) x <- as.numeric(x) # levels(x)[x]
# y <- dat[[paste(i, ".y", sep = "")]]
# if(is.factor(y)) y <- as.numeric(y) # levels(y)[y]
# print(paste(i, sum( x != y, na.rm = TRUE)))
#}


{{hidden|
#sum(as.numeric(dat$alko) != as.numeric(dat$AlkoKuinka.usein), na.rm = TRUE)
<pre>
#sum(as.numeric(dat$liuotti) != as.numeric(dat$Onko1), na.rm = TRUE)
# Sarcoma epidemiological data
#sum(as.numeric(dat$maalit) != as.numeric(dat$Onko2), na.rm = TRUE)
# Data was obtained from this data file (saved 23.9.2002, version 12.7.2002)
#sum(as.numeric(dat$formalde) != as.numeric(dat$Onko3), na.rm = TRUE)
# It contains all data that was used in the publication but not e.g. all questionnaire data.
#sum(as.numeric(dat$hyonteis) != as.numeric(dat$Onko4), na.rm = TRUE)
# U:\arkisto_kuopio\huippuyksikko\Tutkimus\R16_sarkooma\Analyysit\Analyysi020712\Analyysi020712.xls
#sum(as.numeric(dat$Kasvinsu) != as.numeric(dat$Onko5), na.rm = TRUE)
#sum(as.numeric(dat$Kyllate) != as.numeric(dat$Onko6), na.rm = TRUE)
#sum(as.numeric(dat$Pesuaine) != as.numeric(dat$Onko7), na.rm = TRUE)
#sum(as.numeric(dat$Metallit) != as.numeric(dat$Onko8), na.rm = TRUE)
#sum(as.numeric(dat$Muu1) != as.numeric(dat$Onko9), na.rm = TRUE)
#sum(as.numeric(dat$Muu2) != as.numeric(dat$Onko10), na.rm = TRUE)


library(OpasnetUtils)
ques <- ques[!colnames(ques) %in% poista]
dat <- merge(sarc, ques, by = "kysely_id", all.x = TRUE)


sarc <- read.table(
ruoat <- list(c(
"//cesium/yhteiset/YMAL/Projects/Silakan riskiarvio/Data/Salaiset/Sarkooma/Analyysi020712_copy.csv",
"Harvemmin kuin kerran kuukaudessa tai en lainkaan",
sep = ",", header = TRUE
"Kerran tai pari kuukaudessa",
"Kerran viikossa",
"Pari kertaa viikossa",
"Lähes joka päivä",
"Kerran päivässä tai useammin"
),
NA,
TRUE
)
)


colnames(sarc)[c(24, 27, 28, 30, 32)] <- c(
kalat <- list(
"Sisävesikalaa",
c(
"Itämeren.lohta",
"En lainkaan",
"Muuta.Itämerestä",
"Harvemmin kuin kerran kuukaudessa",
"Kalasäilykkeitä",
"Kerran tai pari kuukaudessa",
"Äyriäisiä"
"Kerran viikossa",
"Pari kertaa viikossa",
"Lähes joka päivä"
),
0:5,
TRUE
)
)


########################################### Questionnaire
yn <- list(c("No", "Yes"), NA, TRUE)
# The questions come from the questionnaire form
# U:\arkisto_kuopio\huippuyksikko\Tutkimus\R16_sarkooma\KTL_sarcoma_study_questionnaire.odt
# The questionnaire data comes from
# U:\arkisto_kuopio\huippuyksikko\Tutkimus\R80_Sarkooma2\Data\Kyselyt.xls (Kyselyt.csv does not contain åäö)
# Kyselyt.xls was saved to N:\YMAL\Projects\Silakan riskiarvio\Data\Salaiset\Kyselyt.csv


ques <- read.table(
locs <- list(
"//cesium/yhteiset/YMAL/Projects/Silakan riskiarvio/Data/Salaiset/Kyselyt.csv",
aluenro = c(
sep = ",", header = TRUE
"-",
)
"Espoo",
 
"Helsinki",
poista <- c(
"Hyvinkää",
"Pituus",
"Hämeenlinna",
"Paino",
"Joensuu",
"Kalaa",
"Jyväskylä",
"Petokalaa",
"Kotka",
"Muikkua",
"Kuopio",
"Sisävesikalaa",
"Lahti",
"Kirjolohta",
"Lappeenranta",
"Silakkaa",
"Pori",
"Itämeren.lohta",
"Seinäjoki",
"Muuta.itämerestä",
"Tampere",
"Pakastekalaa",
"Turku",
"Kalasäilykkeitä",
"Vaasa"
"Valtamerikalaa",
),
"Äyriäisiä",
dgluokka = list(
"Vastattu",
c(
"AlkoKuinka.usein",
"MFH",
"Onko1",
"Liposarcoma",
"Onko2",
"Leiomyosarcoma",
"Onko3",
"Angiosarcoma",
"Onko4",
"Chondrosarcoma",
"Onko5",
"Sarcoma synoviale",
"Onko6",
"Sarcoma Ewing",
"Onko7",
"Dermatofibrosarcoma",
"Onko8",
"Sarcoma alia",
"Onko9",
"Sarcoma NUD",
"Onko10"
"Ei tietoa",
)
"Osteosarcoma extrasceletale",
 
"Lipoma",
# The tests below shows that the questionnaire columns in sarc and ques are actually identical. Therefore
"Tumor Desmoides",
# we remove them from ques and keep those in sarc, the data file that was used in the publication.
"Myxoma",
 
"Muu benigni tuumori",
#for(i in testaa) {
"Melanoma",
# x <- dat[[paste(i, ".x", sep = "")]]
"Muu kuin tuumori",
# if(is.factor(x)) x <- as.numeric(x) # levels(x)[x]
"Tuplanäyte"
# y <- dat[[paste(i, ".y", sep = "")]]
),
# if(is.factor(y)) y <- as.numeric(y) # levels(y)[y]
c(1:12, 21:27)
# print(paste(i, sum( x != y, na.rm = TRUE)))
),
#}
sp = c("Male", "Female"),
 
Kalaa = ruoat,
#sum(as.numeric(dat$alko) != as.numeric(dat$AlkoKuinka.usein), na.rm = TRUE)
Petokalaa = kalat,
#sum(as.numeric(dat$liuotti) != as.numeric(dat$Onko1), na.rm = TRUE)
Muikkua = kalat,
#sum(as.numeric(dat$maalit) != as.numeric(dat$Onko2), na.rm = TRUE)
Sisävesikalaa = kalat,
#sum(as.numeric(dat$formalde) != as.numeric(dat$Onko3), na.rm = TRUE)
Kirjolohta = kalat,
#sum(as.numeric(dat$hyonteis) != as.numeric(dat$Onko4), na.rm = TRUE)
Silakkaa = kalat,
#sum(as.numeric(dat$Kasvinsu) != as.numeric(dat$Onko5), na.rm = TRUE)
Itämeren.lohta = kalat,
#sum(as.numeric(dat$Kyllate) != as.numeric(dat$Onko6), na.rm = TRUE)
Muuta.Itämerestä = kalat,
#sum(as.numeric(dat$Pesuaine) != as.numeric(dat$Onko7), na.rm = TRUE)
Pakastekalaa = kalat,
#sum(as.numeric(dat$Metallit) != as.numeric(dat$Onko8), na.rm = TRUE)
Kalasäilykkeitä = kalat,
#sum(as.numeric(dat$Muu1) != as.numeric(dat$Onko9), na.rm = TRUE)
Valtamerikalaa = kalat,
#sum(as.numeric(dat$Muu2) != as.numeric(dat$Onko10), na.rm = TRUE)
Äyriäisiä = kalat,
 
sade = yn,
ques <- ques[!colnames(ques) %in% poista]
tupak = yn,
dat <- merge(sarc, ques, by = "kysely_id", all.x = TRUE)
tstatus = c("< 6 mo ago", "> 6 mo ago", "Never"),
 
liuotti = yn,
ruoat <- list(c(
maalit = yn,
"Harvemmin kuin kerran kuukaudessa tai en lainkaan",
formalde = yn,
"Kerran tai pari kuukaudessa",
hyonteis = yn,
"Kerran viikossa",
Kasvinsu = yn,
"Pari kertaa viikossa",
Kyllaste = yn,
"Lähes joka päivä",
Pesuaine = yn,
"Kerran päivässä tai useammin"
Metallit = yn,
),
Muu1 = yn,
NA,
Muu2 = yn,
TRUE
Hyonluok = list(c("No", "Very mild", "Mild", "Moderate", "High"), 0:4, TRUE),
)
Kasvluok = list(c("No", "Very mild", "Mild", "Moderate", "High"), 0:4, TRUE),
 
Kyllluok = list(c("No", "Very mild", "Mild", "Moderate", "High"), 0:4, TRUE),
kalat <- list(
alko = list(c(
c(
"en koskaan",
"En lainkaan",
"kerran vuodessa tai harvemmin",
"Harvemmin kuin kerran kuukaudessa",
"pari kertaa vuodessa",
"Kerran tai pari kuukaudessa",
"3-4 kertaa vuodessa",
"Kerran viikossa",
"noin kerran parissa kuukaudessa",
"Pari kertaa viikossa",
"noin kerran kuukaudessa",
"Lähes joka päivä"
"pari kertaa kuukaudessa",
"noin kerran viikossa",
"muutaman kerran viikossa",
"päivittäin"
),
),
0:5,
10:1,
TRUE
TRUE
)
yn <- list(c("No", "Yes"), NA, TRUE)
locs <- list(
aluenro = c(
"-",
"Espoo",
"Helsinki",
"Hyvinkää",
"Hämeenlinna",
"Joensuu",
"Jyväskylä",
"Kotka",
"Kuopio",
"Lahti",
"Lappeenranta",
"Pori",
"Seinäjoki",
"Tampere",
"Turku",
"Vaasa"
),
),
dgluokka = list(
Koulutus = list(c(
c(
"Kansakoulu tai peruskoulu",
"MFH",
"Keskikoulu",
"Liposarcoma",
"Ammattikoulu tai vastaava",
"Leiomyosarcoma",
"Opistotutkinto ja/tai lukio",
"Angiosarcoma",
"Akateeminen tutkinto"
"Chondrosarcoma",
),
"Sarcoma synoviale",
NA,
"Sarcoma Ewing",
TRUE
"Dermatofibrosarcoma",
"Sarcoma alia",
"Sarcoma NUD",
"Ei tietoa",
"Osteosarcoma extrasceletale",
"Lipoma",
"Tumor Desmoides",
"Myxoma",
"Muu benigni tuumori",
"Melanoma",
"Muu kuin tuumori",
"Tuplanäyte"
),
c(1:12, 21:27)
),
),
sp = c("Male", "Female"),
Työntekijäryhmä = c(
Kalaa = ruoat,
"Ylempi toimihenkilö",
Petokalaa = kalat,
"Alempi toimihenkilö",
Muikkua = kalat,
"Työntekijä",
Sisävesikalaa = kalat,
"Maanviljelijä",
Kirjolohta = kalat,
"Yrittäjä",
Silakkaa = kalat,
"Opiskelija",
Itämeren.lohta = kalat,
"Eläkeläinen",
Muuta.Itämerestä = kalat,
"Kotirouva",
Pakastekalaa = kalat,
"Työtön"
Kalasäilykkeitä = kalat,
),
Valtamerikalaa = kalat,
Painonmuutos = list(c(
Äyriäisiä = kalat,
"Olen laihtunut",
sade = yn,
"Painoni ei ole juuri muuttunut",
tupak = yn,
"Olen lihonut ja laihtunut",
tstatus = c("< 6 mo ago", "> 6 mo ago", "Never"),
"Olen lihonut"
liuotti = yn,
maalit = yn,
formalde = yn,
hyonteis = yn,
Kasvinsu = yn,
Kyllaste = yn,
Pesuaine = yn,
Metallit = yn,
Muu1 = yn,
Muu2 = yn,
Hyonluok = list(c("No", "Very mild", "Mild", "Moderate", "High"), 0:4, TRUE),
Kasvluok = list(c("No", "Very mild", "Mild", "Moderate", "High"), 0:4, TRUE),
Kyllluok = list(c("No", "Very mild", "Mild", "Moderate", "High"), 0:4, TRUE),
alko = list(c(
"en koskaan",
"kerran vuodessa tai harvemmin",
"pari kertaa vuodessa",
"3-4 kertaa vuodessa",
"noin kerran parissa kuukaudessa",
"noin kerran kuukaudessa",
"pari kertaa kuukaudessa",
"noin kerran viikossa",
"muutaman kerran viikossa",
"päivittäin"
),
),
10:1,
c(3, 2, 13, 1),
TRUE
TRUE
),
),
Koulutus = list(c(
Ruokavalio = c(
"Kansakoulu tai peruskoulu",
"ei erityisruokavaliota",
"Keskikoulu",
"kasvisruoka sekä maito- ja munatuotteet",
"Ammattikoulu tai vastaava",
"ainoastaan kasvisruokavalio",
"Opistotutkinto ja/tai lukio",
"gluteeniton",
"Akateeminen tutkinto"
"maidoton (ei edes hyla-tuotteita)",
"muu, tarkempi kuvaus"
),
),
NA,
Leipää = ruoat,
TRUE
Puuroja = ruoat,
),
Makaronia = ruoat,
Työntekijäryhmä = c(
Muutaviljaa = ruoat,
"Ylempi toimihenkilö",
Viiliä = ruoat,
"Alempi toimihenkilö",
Juustoja = ruoat,
"Työntekijä",
Rasvaisia.juustoja = ruoat,
"Maanviljelijä",
Jäätelöä = ruoat,
"Yrittäjä",
Liharuokaa = ruoat,
"Opiskelija",
Mitä.maitoa = list(c(
"Eläkeläinen",
"en juo maitoa enkä piimää",
"Kotirouva",
"rasvatonta maitoa",
"Työtön"
"rasvatonta piimää tai kirnupiimää",
"muuta piimää",
"ykkösmaitoa",
"kevytmaitoa",
"täysmaitoa"
),
),
Painonmuutos = list(c(
c(7, 4, 5, 6, 3, 2, 1),
"Olen laihtunut",
"Painoni ei ole juuri muuttunut",
"Olen lihonut ja laihtunut",
"Olen lihonut"
),
c(3, 2, 13, 1),
TRUE
TRUE
),
),
Ruokavalio = c(
# Tästä välistä puuttuu Mitä.piimää. Vai puuttuuko? Onko yhdistetty maitoon?
"ei erityisruokavaliota",
Mitä.leivälle = list(c(
"kasvisruoka sekä maito- ja munatuotteet",
"En mitään",
"ainoastaan kasvisruokavalio",
"Kasvimargariinia",
"gluteeniton",
"Voi-kasvirasvaseosta",
"maidoton (ei edes hyla-tuotteita)",
"Voita"
"muu, tarkempi kuvaus"
),
NA,
TRUE
),
Paljonko.rasvaa = list(c(
"En lainkaan",
"Voinapilla voitelen kolme viipaletta tai enemmän",
"Voinapilla voitelen 1-2 viipaletta",
"Käytän enemmän kuin yhden voinapin viipaletta kohti"
),
),
Leipää = ruoat,
NA,
Puuroja = ruoat,
Makaronia = ruoat,
Muutaviljaa = ruoat,
Viiliä = ruoat,
Juustoja = ruoat,
Rasvaisia.juustoja = ruoat,
Jäätelöä = ruoat,
Liharuokaa = ruoat,
Mitä.maitoa = list(c(
"en juo maitoa enkä piimää",
"rasvatonta maitoa",
"rasvatonta piimää tai kirnupiimää",
"muuta piimää",
"ykkösmaitoa",
"kevytmaitoa",
"täysmaitoa"
),
c(7, 4, 5, 6, 3, 2, 1),
TRUE
TRUE
),
),
# Tästä välistä puuttuu Mitä.piimää. Vai puuttuuko? Onko yhdistetty maitoon?
Mitä.rasvaa = list(c(
Mitä.leivälle = list(c(
"Ei mitään rasvaa",
"En mitään",
"Kasviöljyä",
"Kasvimargariinia",
"Kasvimargariinia",
"Voi-kasvirasvaseosta",
"Talousmargariinia",
"Voi-kasviöljyseosta",
"Voita"
"Voita"
),
),
NA,
c(6, 1, 2, 3, 4, 5),
TRUE
TRUE
),
),
Paljonko.rasvaa = list(c(
Ruokamuutos = c(
"En lainkaan",
"Ei",
"Voinapilla voitelen kolme viipaletta tai enemmän",
"Voinapilla voitelen 1-2 viipaletta",
"Käytän enemmän kuin yhden voinapin viipaletta kohti"
),
NA,
TRUE
),
Mitä.rasvaa = list(c(
"Ei mitään rasvaa",
"Kasviöljyä",
"Kasvimargariinia",
"Talousmargariinia",
"Voi-kasviöljyseosta",
"Voita"
),
c(6, 1, 2, 3, 4, 5),
TRUE
),
Ruokamuutos = c(
"Ei",
"Kyllä"
"Kyllä"
),
),
Line 1,040: Line 975:
}}
}}


=== Intake data ===
==== Interpretations ====
 
The consumption of hard fat is calculated in the following way (Q## means the value from the survey question; I## means the interpretation from the table below; Q24&I24 means that question Q24 is quantified by using interpretation from I24 with matching values; Q23*I23 means that the survey value and interpretation are multiplied.
 
total_fat = (Q23a*I23 + Q23b*I23) * Q24&I24 + Q25&I25 * Q26&I26 * Q21a&I21 + Q27&I27 * 20
 
The code assumes that a person uses 20 g/d fat for cooking. Q23: how much a) milk, b) sourmilk; Q24: What kind of milk; Q25 what fat on bread; Q26: how much fat on bread; Q27: what fat for cooking.
 
The following assumptions are used to interpret survey answers:
 
<t2b name="Assumptions for calculations" index="Variable,Value,Unit" obs="Result" desc="Description,Vastaus suomeksi" unit="-">
Q23||dl per glass|2|Size of a glass of milk or sourmilk|
Q24|1|fat g/dl|0.035|full milk, fat g/dl|täysmaitoa
Q24|2|fat g/dl|0.015|light milk, fat g/dl|kevytmaitoa
Q24|3|fat g/dl|0.01|1% milk, fat g/dl|ykkösmaitoa
Q24|4|fat g/dl|0|fat-free milk|rasvatonta maitoa
Q24|5|fat g/dl|0|fat-free sourmilk|rasvatonta piimää tai kirnupiimää
Q24|6|fat g/dl|0.01|other sourmilk fat g/dl|muuta piimää
Q24|7|fat g/dl|0|none of these|en juo maitoa enkä piimää
Q25|1|hard fat, proportion|0|none|en mitään
Q25|2|hard fat, proportion|0.15|soft margarine, share of hard fat|kasvimargariinia
Q25|3|hard fat, proportion|0.5|oil-butter-mix, share of hard fat|Voi-kasvirasvaseosta
Q25|4|hard fat, proportion|1|butter|voita
Q26|1|fat g /slice of bread|0|0 g per slice of bread|en lainkaan
Q26|2|fat g /slice of bread|3|3 g per slice of bread|10 g per 3 viipaletta
Q26|3|fat g /slice of bread|7|7 g per slice of bread|10 g per 1-2 viipaletta
Q26|4|fat g /slice of bread|15|15 g per slice of bread|Yli 10 g per viipale
Q27|1|hard fat fraction|0|hard fat fraction in the baking fat used|kasviöljyä
Q27|2|hard fat fraction|0.15|hard fat fraction in the baking fat used|kasvimargariinia
Q27|3|hard fat fraction|0.5|hard fat fraction in the baking fat used|talousmargariinia
Q27|4|hard fat fraction|0.5|hard fat fraction in the baking fat used|Voi-kasvirasvaseosta
Q27|5|hard fat fraction|1|hard fat fraction in the baking fat used|voita
Q27|6|hard fat fraction|0|hard fat fraction in the baking fat used|ei mitään rasvaa
Q35|1|alcohol times /a|300||päivittäin
Q35|2|alcohol times /a|100||muutaman kerran viikossa
Q35|3|alcohol times /a|50||noin kerran viikossa
Q35|4|alcohol times /a|25||pari kertaa kuukaudessa
Q35|5|alcohol times /a|12||noin kerran kuukaudessa
Q35|6|alcohol times /a|6||noin kerran parissa kuukaudessa
Q35|7|alcohol times /a|4||3-4 kertaa vuodessa
Q35|8|alcohol times /a|2||pari kertaa vuodessa
Q35|9|alcohol times /a|1||kerran vuodessa tai harvemmin
Q35|10|alcohol times /a|0||en koskaan
Q36|1|alcohol portion |0|g alcohol|vähemmän kuin yhden
Q36|2|alcohol portion |12|g alcohol|1 annoksen
Q36|3|alcohol portion |24|g alcohol|2 annosta
Q36|4|alcohol portion |36|g alcohol|3 annosta
Q36|5|alcohol portion |55|g alcohol|4-5 annosta
Q36|6|alcohol portion |96|g alcohol|6-10 annosta
Q36|7|alcohol portion |150|g alcohol|Yli 10 annosta
Q21a|1|g/day carbohydrates|1.5|carbohydrates per day of 100 g bread slices|leipää 100 g viipaleina. oletus: 50% hiilihydraattia
Q21a|2|g/day carbohydrates|2.5|carbohydrates per day of 100 g bread slices|leipää 100 g viipaleina.
Q21a|3|g/day carbohydrates|7.5|carbohydrates per day of 100 g bread slices|leipää 100 g viipaleina.
Q21a|4|g/day carbohydrates|15|carbohydrates per day of 100 g bread slices|leipää 100 g viipaleina.
Q21a|5|g/day carbohydrates|50|carbohydrates per day of 100 g bread slices|leipää 100 g viipaleina.
Q21a|6|g/day carbohydrates|100|carbohydrates per day of 100 g bread slices|leipää 100 g viipaleina.
Q21b|1|g/day carbohydrates|0.84|carbohydrates per day of 200 g porridge|puuroa 200 g annoksina. oletus: 70% hiilihydraattia viljasta, jota 20%
Q21b|2|g/day carbohydrates|1.4|carbohydrates per day of 200 g porridge|puuroa 200 g annoksina.
Q21b|3|g/day carbohydrates|4.2|carbohydrates per day of 200 g porridge|puuroa 200 g annoksina.
Q21b|4|g/day carbohydrates|8.4|carbohydrates per day of 200 g porridge|puuroa 200 g annoksina.
Q21b|5|g/day carbohydrates|28|carbohydrates per day of 200 g porridge|puuroa 200 g annoksina.
Q21b|6|g/day carbohydrates|56|carbohydrates per day of 200 g porridge|puuroa 200 g annoksina.
Q21c|1|g/day carbohydrates|1.2|carbohydrates per day of 200 g pasta|pastaa 200 g annoksina. oletus: 80% hiilihydraattia viljasta, jota 25%
Q21c|2|g/day carbohydrates|2|carbohydrates per day of 200 g pasta|pastaa 200 g annoksina.
Q21c|3|g/day carbohydrates|6|carbohydrates per day of 200 g pasta|pastaa 200 g annoksina.
Q21c|4|g/day carbohydrates|12|carbohydrates per day of 200 g pasta|pastaa 200 g annoksina.
Q21c|5|g/day carbohydrates|40|carbohydrates per day of 200 g pasta|pastaa 200 g annoksina.
Q21c|6|g/day carbohydrates|80|carbohydrates per day of 200 g pasta|pastaa 200 g annoksina.
Q21d|1|g/day carbohydrates|1.26|carbohydrates per day of 200 g musli etc|muita (mysli ym). oletus: 70% hiilihydraattia viljasta, jota 30%
Q21d|2|g/day carbohydrates|2.1|carbohydrates per day of 200 g musli etc|muita (mysli ym).
Q21d|3|g/day carbohydrates|6.3|carbohydrates per day of 200 g musli etc|muita (mysli ym).
Q21d|4|g/day carbohydrates|12.6|carbohydrates per day of 200 g musli etc|muita (mysli ym).
Q21d|5|g/day carbohydrates|42|carbohydrates per day of 200 g musli etc|muita (mysli ym).
Q21d|6|g/day carbohydrates|84|carbohydrates per day of 200 g musli etc|muita (mysli ym).
Q21e|1|g/day carbohydrates|0.3|carbohydrates per day of 200 g youghurt etc|viiliä tai jugurttia, sokeri. oletus: 5% hiilihydraattia (Doc. Geigy s. 479)
Q21e|2|g/day carbohydrates|0.5|carbohydrates per day of 200 g youghurt etc|viiliä tai jugurttia, sokeri.
Q21e|3|g/day carbohydrates|1.5|carbohydrates per day of 200 g youghurt etc|viiliä tai jugurttia, sokeri.
Q21e|4|g/day carbohydrates|3|carbohydrates per day of 200 g youghurt etc|viiliä tai jugurttia, sokeri.
Q21e|5|g/day carbohydrates|10|carbohydrates per day of 200 g youghurt etc|viiliä tai jugurttia, sokeri.
Q21e|6|g/day carbohydrates|20|carbohydrates per day of 200 g youghurt etc|viiliä tai jugurttia, sokeri.
Q21f|1|g/day carbohydrates|0.015|carbohydrates per 50 g cheese|vähärasv. juusto, sokeri.
Q21f|2|g/day carbohydrates|0.025|carbohydrates per 50 g cheese|vähärasv. juusto, sokeri. oletus: 1% hiilihydraattia (Doc. Geigy s. 479)
Q21f|3|g/day carbohydrates|0.075|carbohydrates per 50 g cheese|vähärasv. juusto, sokeri.
Q21f|4|g/day carbohydrates|0.15|carbohydrates per 50 g cheese|vähärasv. juusto, sokeri.
Q21f|5|g/day carbohydrates|0.5|carbohydrates per 50 g cheese|vähärasv. juusto, sokeri.
Q21f|6|g/day carbohydrates|1|carbohydrates per 50 g cheese|vähärasv. juusto, sokeri.
Q21g|1|g/day carbohydrates|0.015|carbohydrates per 50 g cheese|muu juusto, sokeri. oletus: 1% hiilihydraattia (Doc. Geigy s. 479)
Q21g|2|g/day carbohydrates|0.025|carbohydrates per 50 g cheese|muu juusto, sokeri.
Q21g|3|g/day carbohydrates|0.075|carbohydrates per 50 g cheese|muu juusto, sokeri.
Q21g|4|g/day carbohydrates|0.15|carbohydrates per 50 g cheese|muu juusto, sokeri.
Q21g|5|g/day carbohydrates|0.5|carbohydrates per 50 g cheese|muu juusto, sokeri.
Q21g|6|g/day carbohydrates|1|carbohydrates per 50 g cheese|muu juusto, sokeri.
Q21h|1|g/day carbohydrates|0.3|carbohydrates per 100 g ice cream|jäätelöä. oletus: 10% hiilihydraattia
Q21h|2|g/day carbohydrates|0.5|carbohydrates per 100 g ice cream|jäätelöä.
Q21h|3|g/day carbohydrates|1.5|carbohydrates per 100 g ice cream|jäätelöä.
Q21h|4|g/day carbohydrates|3|carbohydrates per 100 g ice cream|jäätelöä.
Q21h|5|g/day carbohydrates|10|carbohydrates per 100 g ice cream|jäätelöä.
Q21h|6|g/day carbohydrates|20|carbohydrates per 100 g ice cream|jäätelöä.
Q21i|1|g/day hard fat|0.12|hard fat per 200 g youghurt etc|viiliä tai jugurttia, rasva. oletus: 2 % rasvaa
Q21i|2|g/day hard fat|0.2|hard fat per 200 g youghurt etc|viiliä tai jugurttia, rasva.
Q21i|3|g/day hard fat|0.6|hard fat per 200 g youghurt etc|viiliä tai jugurttia, rasva.
Q21i|4|g/day hard fat|1.2|hard fat per 200 g youghurt etc|viiliä tai jugurttia, rasva.
Q21i|5|g/day hard fat|4|hard fat per 200 g youghurt etc|viiliä tai jugurttia, rasva.
Q21i|6|g/day hard fat|8|hard fat per 200 g youghurt etc|viiliä tai jugurttia, rasva.
Q21j|1|g/day hard fat|0.15|hard fat per 50 g low-fat cheese|vähärasvainen juusto. oletus: 10% rasvaa
Q21j|2|g/day hard fat|0.25|hard fat per 50 g low-fat cheese|vähärasvainen juusto.
Q21j|3|g/day hard fat|0.75|hard fat per 50 g low-fat cheese|vähärasvainen juusto.
Q21j|4|g/day hard fat|1.5|hard fat per 50 g low-fat cheese|vähärasvainen juusto.
Q21j|5|g/day hard fat|5|hard fat per 50 g low-fat cheese|vähärasvainen juusto.
Q21j|6|g/day hard fat|10|hard fat per 50 g low-fat cheese|vähärasvainen juusto.
Q21k|1|g/day hard fat|0.45|hard fat per 50 g cheese|juusto. oletus: 30% rasvaa (fineli)
Q21k|2|g/day hard fat|0.75|hard fat per 50 g cheese|juusto.
Q21k|3|g/day hard fat|2.25|hard fat per 50 g cheese|juusto.
Q21k|4|g/day hard fat|4.5|hard fat per 50 g cheese|juusto.
Q21k|5|g/day hard fat|15|hard fat per 50 g cheese|juusto.
Q21k|6|g/day hard fat|30|hard fat per 50 g cheese|juusto.
Q21l|1|g/day hard fat|0.3|hard fat per 100 g ice cream|jäätelöä. oletus: 10% rasvaa
Q21l|2|g/day hard fat|0.5|hard fat per 100 g ice cream|jäätelöä.
Q21l|3|g/day hard fat|1.5|hard fat per 100 g ice cream|jäätelöä.
Q21l|4|g/day hard fat|3|hard fat per 100 g ice cream|jäätelöä.
Q21l|5|g/day hard fat|10|hard fat per 100 g ice cream|jäätelöä.
Q21l|6|g/day hard fat|20|hard fat per 100 g ice cream|jäätelöä.
Q21m|1|g/day hard fat|0.45|hard fat per 100 g meat |liharuokaa. oletus: 15% rasvaa (Doc. Geigy s. 481)
Q21m|2|g/day hard fat|0.75|hard fat per 100 g meat |liharuokaa.
Q21m|3|g/day hard fat|2.25|hard fat per 100 g meat |liharuokaa.
Q21m|4|g/day hard fat|4.5|hard fat per 100 g meat |liharuokaa.
Q21m|5|g/day hard fat|15|hard fat per 100 g meat |liharuokaa.
Q21m|6|g/day hard fat|30|hard fat per 100 g meat |liharuokaa.
Q21n|1|g/day hard fat|0.15|hard fat per 100 g meat |kalaruokaa. oletus: 5% kovaa rasvaa, finelin mukaan 2-5%
Q21n|2|g/day hard fat|0.25|hard fat per 100 g meat |kalaruokaa.
Q21n|3|g/day hard fat|0.75|hard fat per 100 g meat |kalaruokaa.
Q21n|4|g/day hard fat|1.5|hard fat per 100 g meat |kalaruokaa.
Q21n|5|g/day hard fat|5|hard fat per 100 g meat |kalaruokaa.
Q21n|6|g/day hard fat|10|hard fat per 100 g meat |kalaruokaa.
</t2b>


How much mass, energy, and dioxin does one portion contain? Data are guesswork of from [http://www.fineli.fi Fineli].
How much mass, energy, and dioxin does one portion contain? Data are guesswork of from [http://www.fineli.fi Fineli].
Line 1,081: Line 1,150:
</t2b>
</t2b>


=== POPs and obesity ===
=== Analyses ===


Dioxins and PCBs have been assosiated to type 2 diabetes. Do dioxins cause diabetes, or do diabetes decrease dioxin elimination, or does obesity increase diabetes and decrease dioxin elimination, or something else? We tried to make sense of this by looking at sarcoma study data.
====Simulated data====


<rcode label="Code does not work without the data file" embed=1>
; This code was used to create a csv file that contains a simulated data from this study. When compared with the original data, the simulated data
* has the same number of observations,
* has the same range of values in each variable,
* has approximately the same correlation structure between all variables.
 
<rcode>
library(OpasnetUtils)
library(MASS)
library(mc2d)
library(reshape2)
library(ggplot2)
library(ggplot2)
dat <- re.ad.csv("V:/TUSO/Projects/POPit ja lihavuus/Sarkoomakyselydata/Copy of sarkooma_kysely_ja_dioksiinit_korjattu.csv")
dat$Diet <- dat$Rasvaa.maitotuotteista + dat$k21liha + dat$k21kala * 8
hist(dat$Diet)
dat$Diet3 <- cut(dat$Diet, 3)


ggplot(dat, aes(x = ika, y = IntakePCDDFTEQ, colour = Diet3)) +
objects.get("isqT7nvhd0ViUR7d")
  geom_point() + geom_smooth()


ggplot(dat, aes(x = ika, y = PCDDFWHO05TEQ, colour = Diet3)) +
data <- objects.decode(etable, password)
  geom_point() + geom_smooth()
colnames(data) <- t(data[1, ])
</rcode>
data <- data[2:nrow(data), 2:ncol(data)]


=== Self-reported chemical exposure ===
data2 <- data
fun <- c(rep("normal", 5), rep("poisson", 12), rep("lognormal", 19))


We looked at self-reported chemical exposure, especially pesticides and wood preservatives.
params <- list()


<rcode label="Code does not work without the data file">
for(i in 1:ncol(data2)) {
library(lme4)
data2[[i]] <- as.numeric(as.character(data2[[i]]))
# Data from //helfs01.thl.fi/groups2/TUSO/Projects/POPit ja lihavuus/Dioksiinit vs sarkooma/Data.xlsx
if(i > 17) data2[[i]] <- ifelse(data2[[i]] == 0, 0.01, data2[[i]])
dat <- read.csv("V:/TUSO/Projects/Sarkooma/Analyysit/Data_2.12.2016.csv", encoding = "UTF-8")
params[i] <- fitdistr(data2[[i]][!is.na(data2[[i]])], fun[i])
names(dat)
}
dat$PCDDFWHO05TEQ <- dat$PCDDFWHO05TEQ / 20 # Scale to a nominal interquartile range (ca. 19.5 pg/g fat, depending on subgroup)


#Pekan malli clogit-funktiolla
simu <- data.frame(temp = rep(NA, 968))
library("survival")


#eksakti estimointi. Tuottaa saman tuloksen kuin Riikalla.
for(i in 1:5) {
models <- list()
simu[[i]] <- rnorm(968, params[[i]][1], params[[i]][2])
}
for(i in 6:17) {
simu[[i]] <- rpois(968, params[[i]])
}
for(i in 18:36) {
simu[[i]] <- rlnorm(968, params[[i]][1], params[[i]][2])
}
simu[[3]] <- rbern(968, 0.5) + 1


models[[1]] <- clogit(Sarcoma.matched ~ Sex + Exposure.woodpreservatives +
colnames(simu) <- colnames(data)
  strata(Sarcoma.matched.pair),
  method="exact", data = dat[dat$Inclusion.criteria.woodpr == 1 , ]
)


models[[2]] <- clogit(Sarcoma.matched ~ Sex + PCDDFWHO05TEQ +
korre <- cor(x = data2, use = "pairwise.complete.obs", method = "spearman")
                        strata(Sarcoma.matched.pair),  
                      method="exact", data = dat[dat$Inclusion.criteria.woodpr == 1 , ]
)


models[[3]] <- clogit(Sarcoma.matched ~ Sex + Exposure.fungicidesherbicides +
simu <- as.data.frame(cornode(as.matrix(simu), target = korre))
                        strata(Sarcoma.matched.pair),  
                      method="exact", data = dat[dat$Inclusion.criteria.funher == 1 , ]
)


models[[4]] <- clogit(Sarcoma.matched ~ Sex + PCDDFWHO05TEQ +
korre2 <- cor(x = simu, use = "pairwise.complete.obs", method = "spearman")
                        strata(Sarcoma.matched.pair),  
                      method="exact", data = dat[dat$Inclusion.criteria.funher == 1 , ]
)


models[[5]] <- clogit(Sarcoma.matched ~ Sex + Exposure.insecticides +
qplot(melt(korre)$value, melt(korre2)$value)
                        strata(Sarcoma.matched.pair),  
                      method="exact", data = dat[dat$Inclusion.criteria.insect == 1 , ]
)


models[[6]] <- clogit(Sarcoma.matched ~ Sex + PCDDFWHO05TEQ +
for(i in 1:ncol(simu)) {
                        strata(Sarcoma.matched.pair),
simu[[i]] <- ifelse(
                      method="exact", data = dat[dat$Inclusion.criteria.insect == 1 , ]
simu[[i]] > max(data[[i]], na.rm = TRUE) |
)
simu[[i]] < min(data[[i]], na.rm = TRUE),
NA, simu[[i]]
)
}


models[[7]] <- clogit(Sarcoma.matched ~ Sex + Exposure.any +
for(i in 1:ncol(data2)) {print(paste(
                        strata(Sarcoma.matched.pair),  
min(data2[[i]], na.rm = TRUE),
                      method="exact", data = dat[dat$Inclusion.criteria.any == 1 , ]
max(data2[[i]], na.rm = TRUE),
)
min(simu[[i]], na.rm = TRUE),
max(simu[[i]], na.rm = TRUE)
))}
 
</rcode>


models[[8]] <- clogit(Sarcoma.matched ~ Sex + PCDDFWHO05TEQ +
==== POPs and obesity ====
                        strata(Sarcoma.matched.pair),
                      method="exact", data = dat[dat$Inclusion.criteria.any == 1 , ]
)


out <- data.frame()
Dioxins and PCBs have been assosiated to type 2 diabetes. Do dioxins cause diabetes, or do diabetes decrease dioxin elimination, or does obesity increase diabetes and decrease dioxin elimination, or something else? We tried to make sense of this by looking at sarcoma study data.
for(i in 1:length(models)) {
  out <- rbind(
    out,
    cbind(
      as.data.frame(summary(models[[i]])$coefficients),
      as.data.frame(summary(models[[i]])$conf.int)
    )
  )
}


out$Subpop <- rep(c(
<rcode label="Code does not work without the data file" embed=1>
  "Wood preservatives",
library(ggplot2)
  "Fungicides, herbicides",
dat <- re.ad.csv("V:/TUSO/Projects/POPit ja lihavuus/Sarkoomakyselydata/Copy of sarkooma_kysely_ja_dioksiinit_korjattu.csv")
  "Insecticides",
dat$Diet <- dat$Rasvaa.maitotuotteista + dat$k21liha + dat$k21kala * 8
  "Any of above"),
hist(dat$Diet)
  each = 4
dat$Diet3 <- cut(dat$Diet, 3)
)
 
print(out, digits = 3)
ggplot(dat, aes(x = ika, y = IntakePCDDFTEQ, colour = Diet3)) +
out <- out[(1:8)*2 , c(2, 8, 9, 5, 10)]
  geom_point() + geom_smooth()
print(out, digits = 3)
 
ggplot(dat, aes(x = ika, y = PCDDFWHO05TEQ, colour = Diet3)) +
  geom_point() + geom_smooth()
</rcode>


# Is Baltic herring an independent risk factor for sarcoma?
==== Self-reported chemical exposure ====
# Well, the risk is increased but clearly non-significant (OR 1.388, 95 % CI 0.8063 - 2.389)


dat$Silakka <- as.numeric(dat$Silakkaa) > 3
We looked at self-reported chemical exposure, especially pesticides and wood preservatives.  
table(dat$Silakkaa, dat$Silakka)
fit <- clogit(Sarcoma.matched ~ Sex + Silakka +
                        strata(Sarcoma.matched.pair),
                      method="exact", data = dat
)


summary(fit)
We also looked at the impact of self-reported occupation, recoded into 9 groups. This is best done in the unmatched dataset, but also some analyses were done with the matched dataset. Age was the only clearly significant variable, with sarcoma risk increasing by 8 % per year. Male gender seemed to increase the risk but was not statistically significant. None of the differences between occupation groups were statistically significant, and they did not show a pattern where putatively chemically-exposured groups would have higher risk.


# A question was raised why the PCDDWHO05TEQ estimates for wood-preservative group and any-exposure group were identical.
<rcode label="Code does not work without the data file">
# The reason can be seen from here:
#################
table(dat[c(
# Bring in the hand-made occupation classification
   "Inclusion.criteria.woodpr",
 
   "Inclusion.criteria.any",
d <- read.csv("V:/TUSO/Projects/Sarkooma/Analyysit/Kyselykaavaka_ammatti-tyo_edit.csv")
   "Sarcoma.matched")],
 
   exclude = NULL
#colnames(d)
#[1] "N"                        "ID"                      "Työntekijäryhmä"          "Luokitus..koodi.lopussa."
#[5] "Alle.5.v.työhistoria"    "Huomattavaa"              "Ammatti"                  "Työpaikka"             
#[9] "Kesto"                    "Työtehtävä"              "AmmattiA"                "TyöpaikkaA"             
#[13] "KestoA"                  "AmmattiB"                "TyöpaikkaB"              "KestoB"                 
#[17] "AmmattiC"                "TyöpaikkaC"              "KestoC"                  "AmmattiD"               
#[21] "TyöpaikkaD"              "KestoD"                 
 
lev <- as.character(d[974:982,4])
d <- d[1:969,c(2,4,5,6)]
d <- d[d$ID != "" , ] # Remove empty row 883
colnames(d) <- c("ID", "Tyoluokka", "Alle5v", "Huom.tyo")
d$Tyoluokka <- factor(d$Tyoluokka, levels = 1:9, labels = lev)
d$Tyoalt <- ifelse(as.numeric(d$Tyoluokka) %in% c(1,2,9), "Ei",
                  ifelse(as.numeric(d$Tyoluokka) %in% c(3,8), "Ehkä", "Kyllä"))
 
#> levels(d$Tyoluokka)
#[1] "Opiskelija"            "Sisätyö"                "Hoitoala"              "Maa- ja metsätalous" 
#[5] "Sotilas, palomies ym"  "Teollisuustyö"          "Rakennusala, ulkotyö"  "Kauppa, elintarvikeala"
#[9] "Työtön tai ei tietoa" 
 
###################################
 
library(lme4)
# Data from //helfs01.thl.fi/groups2/TUSO/Projects/POPit ja lihavuus/Dioksiinit vs sarkooma/Data.xlsx
dat <- read.csv("V:/TUSO/Projects/Sarkooma/Analyysit/Data_2.12.2016.csv", encoding = "UTF-8")
names(dat)
dat$PCDDFWHO05TEQ <- dat$PCDDFWHO05TEQ / 20 # Scale to a nominal interquartile range (ca. 19.5 pg/g fat, depending on subgroup)
 
#Pekan malli clogit-funktiolla
library("survival")
 
# A conditional regression with new occupation classification. Regression method as below.
#> sum(as.character(d$ID) != as.character(dat$ID))
#[1] 0
# Because rows are identically ordered, just cbind the occupation data without redundant ID.
 
dat <- cbind(dat, d[-1])
dat$Tyoluokka <- relevel(dat$Tyoluokka, "Sisätyö")
dat$Alle5v <- ifelse(dat$Alle5v == "1", "Yes", "No")
 
table(dat[c("Tyoluokka","Sarcoma.unmatched","Alle5v")], useNA = "ifany")
 
clogit(Sarcoma.unmatched ~ Sex + Age + Tyoluokka + Alle5v, # + PCDDFWHO05TEQ
      #strata(Sarcoma.matched.pair),
      method="exact", data = dat
)
 
clogit(Sarcoma.unmatched ~ Sex + Age + Tyoluokka, # + PCDDFWHO05TEQ
      #strata(Sarcoma.matched.pair),
      method="exact", data = dat[dat$Alle5v == "No",]
)
 
clogit(Sarcoma.matched ~ Sex + Tyoalt + # Tyoluokka + # + PCDDFWHO05TEQ
                        strata(Sarcoma.matched.pair),
                      method="exact", data = dat
)
 
clogit(Sarcoma.matched ~ Tyoluokka + # + PCDDFWHO05TEQ # No sex to avoid too many subgroups
        strata(Sarcoma.matched.pair),
      method="exact", data = dat
)
# The analysis above does not give reliable results because warning: Loglik converged before variable 1,2,3,4,5,6,7,8
 
temp <- list()
for(i in levels(dat$Tyoluokka)) {
  dat$Temp <- ifelse(dat$Tyoluokka == i, TRUE, FALSE)
  print(i)
  temp2 <- clogit(Sarcoma.matched ~ Sex + Temp + # Tyoluokka + # + PCDDFWHO05TEQ
          strata(Sarcoma.matched.pair),
        method="exact", data = dat
  )
  print(summary(temp2)$conf.int)
  temp <- rbind(
    temp,
    data.frame(
      Tyoluokka = i,
      summary(temp2)$conf.int,
      Pvalue = summary(temp2)$coefficients[,5]
    )
  )
}
# The analysis above compares one group of Tyoluokka to all others in the matched data set.
# A better analysis is below with unmatched analysis.
temp
 
# On the other hand, questionnaire was collected from everyone, so matching can be removed (unlike with dioxins)
# without altering the design. Let's try what happens without matching.
 
clogit(Sarcoma.unmatched ~ Sex + Age + Tyoluokka, # + PCDDFWHO05TEQ
              #strata(Sarcoma.matched.pair),
          method="exact", data = dat
)
 
table(dat[c("Tyoluokka", "Sarcoma.matched")])
table(dat[c("Sarcoma.matched","Sarcoma.unmatched")], useNA = "ifany")
 
#exact estimation. Tuottaa saman tuloksen kuin Riikalla.
# Several different models were run. All included Sex as a confounder.
# Four pairs of models looked at each chemical risk separately (Analysis: Separate),
# and dioxin risk in the respective population.
# Four models looked at each chemical + dioxin in a combined model,
# adjusting for each other (Analysis: Combined).
# Finally, one model contained all three chemicals and dioxin in a single model,
# naturally not containing the combined chemical exposure this time.
 
models <- list()
 
models[[1]] <- clogit(Sarcoma.matched ~ Sex + PCDDFWHO05TEQ + Exposure.woodpreservatives +
                        strata(Sarcoma.matched.pair),
                      method="exact", data = dat[dat$Inclusion.criteria.woodpr == 1 , ]
)
 
models[[2]] <- clogit(Sarcoma.matched ~ Sex + Exposure.woodpreservatives +
                        strata(Sarcoma.matched.pair),
                      method="exact", data = dat[dat$Inclusion.criteria.woodpr == 1 , ]
)
 
models[[3]] <- clogit(Sarcoma.matched ~ Sex + PCDDFWHO05TEQ +
                        strata(Sarcoma.matched.pair),
                      method="exact", data = dat[dat$Inclusion.criteria.woodpr == 1 , ]
)
 
models[[4]] <- clogit(Sarcoma.matched ~ Sex + PCDDFWHO05TEQ + Exposure.fungicidesherbicides +
                        strata(Sarcoma.matched.pair),
                      method="exact", data = dat[dat$Inclusion.criteria.funher == 1 , ]
)
 
models[[5]] <- clogit(Sarcoma.matched ~ Sex + Exposure.fungicidesherbicides +
                        strata(Sarcoma.matched.pair),
                      method="exact", data = dat[dat$Inclusion.criteria.funher == 1 , ]
)
models[[6]] <- clogit(Sarcoma.matched ~ Sex + PCDDFWHO05TEQ +
                        strata(Sarcoma.matched.pair),
                      method="exact", data = dat[dat$Inclusion.criteria.funher == 1 , ]
)
 
models[[7]] <- clogit(Sarcoma.matched ~ Sex + PCDDFWHO05TEQ + Exposure.insecticides +
                        strata(Sarcoma.matched.pair),
                      method="exact", data = dat[dat$Inclusion.criteria.insect == 1 , ]
)
 
models[[8]] <- clogit(Sarcoma.matched ~ Sex + Exposure.insecticides +
                        strata(Sarcoma.matched.pair),
                      method="exact", data = dat[dat$Inclusion.criteria.insect == 1 , ]
)
models[[9]] <- clogit(Sarcoma.matched ~ Sex + PCDDFWHO05TEQ +
                        strata(Sarcoma.matched.pair),
                      method="exact", data = dat[dat$Inclusion.criteria.insect == 1 , ]
)
 
models[[10]] <- clogit(Sarcoma.matched ~ Sex + PCDDFWHO05TEQ + Exposure.any +
                        strata(Sarcoma.matched.pair),
                      method="exact", data = dat[dat$Inclusion.criteria.any == 1 , ]
)
 
models[[11]] <- clogit(Sarcoma.matched ~ Sex + Exposure.any +
                        strata(Sarcoma.matched.pair),
                      method="exact", data = dat[dat$Inclusion.criteria.any == 1 , ]
)
models[[12]] <- clogit(Sarcoma.matched ~ Sex + PCDDFWHO05TEQ +
                        strata(Sarcoma.matched.pair),
                      method="exact", data = dat[dat$Inclusion.criteria.any == 1 , ]
)
 
out <- data.frame()
for(i in 1:length(models)) {
  out <- rbind(
    out,
    cbind(
      as.data.frame(summary(models[[i]])$coefficients),
      as.data.frame(summary(models[[i]])$conf.int)
    )
  )
}
 
out$Subpop <- rep(c(
  "Wood preservatives",
  "Fungicides, herbicides",
  "Insecticides",
  "Any of above"),
  each = 7
)
print(out, digits = 3)
out <- out[c(2,3,5,7,9,10,12,14,16,17,19,21,23,24,26,28) , c(2, 8, 9, 5, 10)]
out$Analysis <- rep(c("Combined","Separate"), each = 2, times = 4)
out <- out[order(out$Subpop, rownames(out), out$Analysis) , ]
print(out, digits = 3)
 
#### Analysis where all chemicals are in a single model.
 
mo <- clogit(Sarcoma.matched ~ Sex + PCDDFWHO05TEQ + Exposure.insecticides + Exposure.fungicidesherbicides + Exposure.woodpreservatives +
              strata(Sarcoma.matched.pair),
            method="exact", data = dat#[dat$Inclusion.criteria.any == 1 , ]
)
summary(mo)
 
# Fungicides/herbicides clearly elevate the risk and is statistically significant
# Woodpreservatives also shows a high risk but is only marginally significant.
# Insecticides and dioxin are not associated with higher risk.
 
# Chemicals are  moderately correlated with each other and somewhat with dioxin
# as shown by the correlation table below.
 
cor(dat[
  dat$Inclusion.criteria.any == 1 ,
  c("Exposure.any",
    "Exposure.fungicidesherbicides",
    "Exposure.insecticides",
    "Exposure.woodpreservatives",
    "PCDDFWHO05TEQ"
  )],
  use = "pairwise.complete.obs"
)
 
 
# Is Baltic herring an independent risk factor for sarcoma?
# Well, the risk is increased but clearly non-significant (OR 1.388, 95 % CI 0.8063 - 2.389)
 
dat$Silakka <- as.numeric(dat$Silakkaa) > 3
table(dat$Silakkaa, dat$Silakka)
fit <- clogit(Sarcoma.matched ~ Sex + Silakka +
                strata(Sarcoma.matched.pair),
              method="exact", data = dat
)
 
summary(fit)
 
# A question was raised why the PCDDWHO05TEQ estimates for wood-preservative group and any-exposure group were identical.
# The reason can be seen from here:
table(dat[c(
   "Inclusion.criteria.woodpr",
   "Inclusion.criteria.any",
   "Sarcoma.matched")],
   exclude = NULL
)
# The two groups are practically identical with only two additional controls in the any-exposure group.
# These two controls do not much change the PCDDFWHO05TEQ impact on sarcoma, and therefore the estimates are the same
# with precision of three decimals.
table(dat[c(
  "Inclusion.criteria.insect",
  "Inclusion.criteria.any",
  "Sarcoma.matched")],
  exclude = NULL
)
# However, with insecticides, there are three controls and TWO CASES more in any-exposure group and that does change estimates.
# With herbicides and fungicides, there are one control and two cases more, also enough to change estimates.
</rcode>
 
==== Correlation of dioxin and fish ====
 
How do individual dioxin congeners correlate with individual fish parametres in the questionnaire?
 
<rcode label="Code does not work without the data file">
# This is code Op_en2721/ on page [[KTL Sarcoma study]]
 
library(lme4)
library(Hmisc)
library(MASS)
library(ggplot2)
library(rjags)
 
# Data from //helfs01.thl.fi/groups2/TUSO/Projects/POPit ja lihavuus/Dioksiinit vs sarkooma/Data.xlsx
dat <- read.csv("V:/TUSO/Projects/Sarkooma/Analyysit/Data_2.12.2016.csv", encoding = "UTF-8")
names(dat)
 
kalat <- colnames(dat)[c(29, 27, 79:89)] # All: 27, 29, 79:89
dioksiinit <- colnames(dat)[c(310:326, 365)] # All: 310:368)
dat[1:20,kalat]
dat[1:20,dioksiinit]
colnames(dat)
unique(unlist(lapply(dat[kalat], FUN = levels)))
 
inn <- c(
  "",
  "En lainkaan",
  "Harvemmin kuin kerran kuukaudessa tai en lainkaan",
  "Harvemmin kuin kerran kuukaudessa",
  "Kerran tai pari kuukaudessa",
  "Kerran viikossa",
  "Pari kertaa viikossa",
  "Lähes joka päivä",
  "Kerran päivässä tai useammin"
)
)
# The two groups are practically identical with only two additional controls in the any-exposure group.
# These two controls do not much change the PCDDFWHO05TEQ impact on sarcoma, and therefore the estimates are the same
# with precision of three decimals.
table(dat[c(
  "Inclusion.criteria.insect",
  "Inclusion.criteria.any",
  "Sarcoma.matched")],
  exclude = NULL
)
# However, with insecticides, there are three controls and TWO CASES more in any-exposure group and that does change estimates.
# With herbicides and fungicides, there are one control and two cases more, also enough to change estimates.
</rcode>


=== Correlation of dioxin and fish ===
# Datat peräisin V:\TUSO\Projects\POPit ja lihavuus\Excel-mallit\Concentration modeling.xlsx
# paitsi doses on näppituntuma


How do individual dioxin congeners correlate with individual fish parametres in the questionnaire?
# Meals per week
doses <- c(NA, 0, 0.1, 0.15, 0.3, 1, 2, 5, 9)


<rcode label="Code does not work without the data file">
# Congener half-life in years
# This is code Op_en2721/ on page [[KTL Sarcoma study]]
t1.2 <- c(7.2, 11.2, 9.8, 13.1, 5.1, 4.9, 6.7, 2.1, 3.5,
          7.0, 6.4, 7.2, 7.2, 2.8, 3.1, 4.6, 1.4, 7)


library(lme4)
# WHO2005 TEF
library(Hmisc)
TEF <- c(1, 1, 0.1, 0.1, 0.1, 0.01, 0.0003, 0.1, 0.03,
library(MASS)
        0.3, 0.1, 0.1, 0.1, 0.1, 0.01, 0.01, 0.0003, 1)
library(ggplot2)
library(rjags)


# Data from //helfs01.thl.fi/groups2/TUSO/Projects/POPit ja lihavuus/Dioksiinit vs sarkooma/Data.xlsx
dat2 <- dat[c(kalat, dioksiinit, "Age")]
dat <- read.csv("V:/TUSO/Projects/Sarkooma/Analyysit/Data_2.12.2016.csv", encoding = "UTF-8")
names(dat)


kalat <- colnames(dat)[c(29, 27, 79:89)] # All: 27, 29, 79:89
# Convert fish intake answers to units meals/week
dioksiinit <- colnames(dat)[c(310:326, 365)] # All: 310:368)
dat2[kalat][-1] <- lapply(dat2[kalat][-1], FUN = function(x) doses[match(x, inn)])
dat[1:20,kalat]
dat[1:20,dioksiinit]
colnames(dat)
unique(unlist(lapply(dat[kalat], FUN = levels)))


inn <- c(
# Convert dioxin concentrations to TEQs
  "",
  "En lainkaan",
  "Harvemmin kuin kerran kuukaudessa tai en lainkaan",
  "Harvemmin kuin kerran kuukaudessa",
  "Kerran tai pari kuukaudessa",
  "Kerran viikossa",
  "Pari kertaa viikossa",
  "Lähes joka päivä",
  "Kerran päivässä tai useammin"
)
 
# Datat peräisin V:\TUSO\Projects\POPit ja lihavuus\Excel-mallit\Concentration modeling.xlsx
# paitsi doses on näppituntuma
 
# Meals per week
doses <- c(NA, 0, 0.1, 0.15, 0.3, 1, 2, 5, 9)
 
# Congener half-life in years
t1.2 <- c(7.2, 11.2, 9.8, 13.1, 5.1, 4.9, 6.7, 2.1, 3.5,
          7.0, 6.4, 7.2, 7.2, 2.8, 3.1, 4.6, 1.4, 7)
 
# WHO2005 TEF
TEF <- c(1, 1, 0.1, 0.1, 0.1, 0.01, 0.0003, 0.1, 0.03,
        0.3, 0.1, 0.1, 0.1, 0.1, 0.01, 0.01, 0.0003, 1)
 
dat2 <- dat[c(kalat, dioksiinit, "Age")]
 
# Convert fish intake answers to units meals/week
dat2[kalat][-1] <- lapply(dat2[kalat][-1], FUN = function(x) doses[match(x, inn)])
 
# Convert dioxin concentrations to TEQs
dat2[dioksiinit] <- lapply(as.list(1:length(TEF)), FUN = function(x) TEF[x] * dat2[dioksiinit][[x]])
dat2[dioksiinit] <- lapply(as.list(1:length(TEF)), FUN = function(x) TEF[x] * dat2[dioksiinit][[x]])


Line 1,614: Line 1,905:
}}
}}


=== EU kalat ===
==== EU kalat ====


* The code that used to be here was moved to [[EU-kalat#Calculations]].
* The code that used to be here was moved to [[EU-kalat#Calculations]].
Line 1,629: Line 1,920:
Related:  
Related:  
* Easily generate correlated variables from any distribution (without copulas) [https://www.r-bloggers.com/easily-generate-correlated-variables-from-any-distribution-without-copulas/]
* Easily generate correlated variables from any distribution (without copulas) [https://www.r-bloggers.com/easily-generate-correlated-variables-from-any-distribution-without-copulas/]
==== Concentration-age graph with THL formatting ====
<rcode label="Run on own computer">
# This is code Op_en2721/ on page [[KTL Sarcoma study]]
library(ggplot2)
#library(thlGraphs)
thlPointPlot <- function (data, xvar, yvar, groupvar = NULL, ylabel = yvar,
                          xlabel = NULL, colors = thlColors(n = 12, type = "quali", name = "line"),
                          title = NULL, subtitle = NULL, caption = NULL,
                          legend.position = "none", base.size = 16, linewidth = 3,
                          show.grid.x = FALSE, show.grid.y = TRUE, lang = "fi", ylimits = NULL,
                          marked.treshold = 10, plot.missing = FALSE, xaxis.breaks = waiver(),
                          yaxis.breaks = waiver(), panels = FALSE, nrow.panels = 1,
                          labels.end = FALSE)
{
  lwd <- thlPtsConvert(linewidth)
  gg <- ggplot(
    data,
    aes_(x = substitute(xvar),
        y = substitute(yvar),
        group = ifelse(!is.null(substitute(groupvar)), substitute(groupvar), NA),
        colour = ifelse(!is.null(substitute(groupvar)), substitute(groupvar), ""))
  ) # + geom_line(size = lwd) #!!!!!!!!!!!!!!!!!!!!
  if (isTRUE(plot.missing)) {
    df <- thlNaLines(
      data = data, xvar = deparse(substitute(xvar)),
      yvar = deparse(substitute(yvar)),
      groupvar = unlist(ifelse(deparse(substitute(groupvar)) != "NULL", deparse(substitute(groupvar)), list(NULL)))
    )
    if (!is.null(df) & FALSE) { ##!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      gg <- gg + geom_line(
        data = df, aes_(
          x = substitute(xvar),
          y = substitute(yvar),
          group = ifelse(!is.null(substitute(groupvar)), substitute(groupvar), NA),
          colour = ifelse(!is.null(substitute(groupvar)), substitute(groupvar), "")
        ),
        linetype = 2,
        size = lwd
      )
    }
  }
  if (!is.null(marked.treshold)) {
    if (length(unique(data[, deparse(substitute(xvar))])) > marked.treshold) {
      if (is.factor(data[, deparse(substitute(xvar))]) ||
          is.character(data[, deparse(substitute(xvar))]) ||
          is.logical(data[, deparse(substitute(xvar))])) {
        levs <- levels(factor(data[, deparse(substitute(xvar))]))
        min <- levs[1]
        max <- levs[length(levs)]
      } else {
        min <- min(data[, deparse(substitute(xvar))])
        max <- max(data[, deparse(substitute(xvar))])
      }
      subdata <- data[c(data[, deparse(substitute(xvar))] %in% c(min, max)), ]
      gg <- gg + geom_point(
        data = subdata,
        aes_(
          x = substitute(xvar),
          y = substitute(yvar),
          group = ifelse(!is.null(substitute(groupvar)), substitute(groupvar), NA),
          colour = ifelse(!is.null(substitute(groupvar)), substitute(groupvar), "")
        ), stroke = 1.35 * lwd, fill = "white", shape = 21, size = 10/3 * lwd
      )
    } else {
      gg <- gg + geom_point(stroke = 1.35 * lwd, fill = "white", size = 10/3 * lwd, shape = 21)
    }
  }
  if (isTRUE(labels.end)) {
    if (is.factor(data[, deparse(substitute(xvar))]) ||
        is.character(data[, deparse(substitute(xvar))]) ||
        is.logical(data[, deparse(substitute(xvar))])) {
      levs <- levels(factor(data[, deparse(substitute(xvar))]))
      maxd <- data[data[, deparse(substitute(xvar))] == levs[length(levs)], ]
    } else {
      maxd <- data[data[, deparse(substitute(xvar))] == max(data[, deparse(substitute(xvar))]), ]
    }
    brks <- maxd[, deparse(substitute(yvar))]
    labsut <- maxd[, deparse(substitute(groupvar))]
  } else (brks <- labsut <- waiver())
  gg <- gg + ylab(ifelse(deparse(substitute(ylabel)) == "yvar", deparse(substitute(yvar)), ylabel)) +
    labs(title = title, subtitle = subtitle, caption = caption) +
    thlTheme(
      show.grid.y = show.grid.y,
      show.grid.x = show.grid.x,
      base.size = base.size,
      legend.position = legend.position,
      x.axis.title = ifelse(!is.null(xlabel), TRUE, FALSE)
    ) +
    xlab(ifelse(!is.null(xlabel), xlabel, "")) +
    scale_color_manual(values = colors) +
    thlYaxisControl(
      lang = lang,
      limits = ylimits,
      breaks = yaxis.breaks,
      sec.axis = labels.end,
      sec.axis.breaks = brks,
      sec.axis.labels = labsut
    )
  if (is.factor(data[, deparse(substitute(xvar))]) ||
      is.character(data[, deparse(substitute(xvar))]) ||
      is.logical(data[, deparse(substitute(xvar))])) {
    gg <- gg + scale_x_discrete(breaks = xaxis.breaks, expand = expand_scale(mult = c(0.05)))
  } else (gg <- gg + scale_x_continuous(breaks = xaxis.breaks))
  if (isTRUE(panels)) {
    fmla <- as.formula(paste0("~", substitute(groupvar)))
    gg <- gg + facet_wrap(fmla, scales = "free", nrow = nrow.panels)
  }
  gg
}
# Nro;Alue;SP;Alue;Ik„ (a);TEQ;TapVer;Tequart;Ik„luokka;Altistus;Valittu tapaus;Stratum2;Valittuja verrokkeja;Tapauksen ik„;;;L”ytynyt tapaus;L”ytyneiden m„„r„;Hakuprosessi: 1) Varmista, ett„ sarake Valittu tapaus on tyhj„. 2) Anna valittujen m„„r„ksi 0 ja ik„kriteetiksi tiukin k„ytetty. 3). Laske. Filter”i m„„r„ 1:t ja merkitse l”ytynyt tapauksen tunnus sarakkeeseen Valittu tapaus. 4) Laske. Filter”i L”ytyneiden m„„r„t 2, 3, jne ja valitse tapaus oikealle verrokille. 5) L”ys„„ ik„kriteeri„ jos on tarpeen ja toista 3)-4). 6) Anna valittujen m„„r„ksi 1, 2, 3 jne ja toista 2) - 5).
# Z = helfs01.thl.fi/documents/
sarc <- read.csv("Z:/YMAL_arc/CEHRA_Archived2018/Tutkimus/_until2004/R16_sarkooma/Analyysit/Analyysi/Lopulliset4.csv",
                skip=2, sep=";", dec=",", header=FALSE)
sar <- sarc[c(1:3, 5:460),c(2,3,5,6,7)]
colnames(sar) <- c("Region","Gender","Age","TEQ","Case")
sar$Gender <- factor(sar$Gender, labels=c("Male","Female"))
sar$Case <- factor(sar$Case, labels=c("Case","Control"))
ggplot(sar, aes(x=Age, y=TEQ, colour=Gender))+geom_point()
thlPointPlot(sar, xvar=Age, yvar=TEQ, groupvar=Gender, marked.treshold = 1000,
            legend.position = "bottom",
            xlabel="Age", ylabel="", base.size=30,
            title="Dioxin concentration by age",
            subtitle="(pg/g TEQ in fat)")+
  geom_vline(xintercept=0, width=1.5)
ggsave("Dioxin concentration.png", width=11, height=8)
</rcode>


==See also==
==See also==

Latest revision as of 18:07, 1 August 2019



Question

Because it is obvious that there is a great need for improved exposure assessment in studying cancer risk of dioxins, we decided to undertake the major effort of conducting a large case-control study on soft-tissue sarcoma and measure dioxin concentrations individually in both patients and controls. Because this can be done accurately only from very large blood samples or from fat samples taken during an operation, we studied STS patients coming to surgery because of their tumor and selected appendicitis patients as controls. In the general population, the exposure to dioxins is almost totally from dietary sources — in Finland mostly from fish — and it varies widely among the population. Because of the extremely long half-life of dioxins, measured levels of dioxin at the time of operation can be used to estimate the lifetime cumu- lative exposure accurately. There is a priori no simultaneous exposure to chlorophenols or phenoxy acid herbicides, which behave completely differently in the environment, have relatively short half-lives in humans and are excreted in a few days. This enables us to estimate the association of STS with clean dioxin exposure without concomitant exposure to the main chemical, in contrast to occupational studies.[1]

Answer

There is simulated data available about the study. For details, see #Simulated data.


Main fish consumption and PCDD/F variables

Some plots about dioxin congeners.

What congener do you want to plot on X axis?:

What congener do you want to plot on X axis?:

+ Show code

Rationale

Methods

Study population

The majority of sarcoma patients in southern Finland are treated by the multidisciplinary sarcoma group of Helsinki University Central Hospital, with the remaining cases in the University Hospitals of Kuopio, Turku, or Tampere. All patients referred to these hospitals for operative treatment of STS between June 1997 (August 1996 in Helsinki) and December 1999 and more than 15 years of age were eligible as cases. The diagnoses were verified histologically for all except 7 patients. Sarcomas connected with known familial or genetic conditions, as well as sarcomas arising in visceral organs and bone, were excluded. Also other malignancies than STS, as well as nonmalignant tumors, were rejected. Some patients were operated twice during the study period; the second sample was not processed.

All patients who were operated due to an appendicitis diagnosis in a study hospital and who were more than 15 years of age were eligible as controls. They were collected from the same catchment area as the STS patients by dividing it into 15 areas (mainly according to former Finnish health care districts). One hospital performing appendectomy operations was recruited to the study from each area (in Helsinki, 2 hospitals). These were the university, central, or district hospitals of Helsinki, Hyvinka¨a¨, Ha¨meenlinna, Joensuu, Jyva¨skyla¨, Kotka, Kuopio, Lahti, Lappeenranta, Pori, Seina¨joki, Tampere, Turku and Vaasa, and the municipality hospitals in Espoo (Jorvi Hospital) and Helsinki (Maria Hospital). Informed consent was obtained from all patients in writing before the operation. The study was approved by the ethics committees of the National Public Health Institute and the hospitals involved.

The total number of patients recruited during the fieldwork was 972. One case was deleted due to missing address information, 1 case and 2 controls due to missing age information, and 3 cases and 11 controls since their fat samples were too small for dioxin analysis. As a result, we had 954 patients (148 cases and 806 controls) available for matching. The age range was 17.0 –91.1 years for cases and 15.0–88.7 years for controls. Based on National Cancer Registry data, we caught 70%, 9%, 17% and 26% of STS patients in Helsinki, Turku, Tampere and Kuopio University hospital regions, respectively, during the study period (calendar years 1997–1999). In Helsinki, all patients treated surgically with correct diagnosis were caught and agreed to participate; those not caught were either treated nonsurgically or misdiagnosed. Based on hospital discharge registry data, we estimate that about onefourth of appendicitis patients were caught in average during the most active collection period, but differences between hospitals were large.

The cases and controls were individually matched for area and age at the end of the fieldwork. This was done to ensure that there are enough controls from small areas and old age groups in the final data set, as it was not possible to analyze all recruited patients for dioxin. Area was defined based on the area of residence using the 15 areas described above. The age was determined at the day of operation. Maximum allowed difference in age between cases and controls was ± 3 years if case was < 38.0 years old, and ± 6 years if case was >= 38.0 years old. The control closest by age was matched to the case. Cases with fewer controls had a priority over cases with more controls. The number of controls per case was limited to 3. For 110 cases, 227 matching controls could be found in the pool. Thirty-nine cases had 1 control, 25 cases had 2 and 46 cases had 3 controls; for 38 cases, no control matching both age and area could be found.

Exposure assessment

From the matched 337 patients, concentrations of the 17 toxic polychlorinated dibenzo-p-dioxins and dibenzofurans (PCDD/Fs) were measured from a subcutaneous fat sample obtained during an appendectomy or sarcoma operation. Measurements were done by gas chromatography-mass spectrometry30 at the Laboratory of Chemistry, which is an accredited testing laboratory (T077) for the analysis of dioxins in human samples (current standard: EN ISO/ IEC 17025) and has successfully participated in WHO/Euro intercalibrations. The concentrations were summed up after the value of each congener was multiplied by its relative toxic potency (toxic equivalency factor, TEF). The TEF values according to WHO31 were used, resulting in toxic equivalent concentrations (WHOTEq). Fat samples were analyzed during and after the collection period. Samples from STS patients were always analyzed in a batch containing also samples from appendicitis patients. All analytical work was performed blind so that the chemistry laboratory did not know the diagnosis of the patient. Quality assurance of analysis was performed with 2 separate means: 2 preformulated pools of human fat with different concentrations of dioxins [10.6 (n = 35) and 40.2 (n = 33) ng/kg (WHO-TEq in fat)] were always run with each lot of samples, and 36 individual fat samples with WHO-TEqs ranging from 6.9 to 116 ng/kg fat were analyzed as duplicates. The coefficients of variation for WHO-TEq in preformulated pools were 5.1% and 5.7%, respectively, and in duplicate analysis, 6.2%.[2]

A detailed questionnaire about socioeconomic and lifestyle factors and chemical exposures was given to the patients in the hospital. If the patient was found not to have received the questionnaire in the hospital or if the patient did not return it, a new copy was sent to the patient’s home address. Of the matched subjects, 84 cases (76%) and 185 controls (81%) have also questionnaire information.

Detailed exposure assessment

The concentrations of the 17 toxic PCDD/F congeners and of the 36 PCB congeners were measured from fat of a subcutaneous tissue sample (0.3–1.5 g of fat) which was obtained during an appendectomy or sarcoma operation. The toxic equivalents (WHOPCDD/F-TEQ and WHOPCB-TEQ) were calculated with the sets of toxic equivalency factors (TEF), recommended by WHO in 1998 (Van den Berg et al., 1998).

Fat from tissue sample was extracted with toluene for 18–24 h using the Soxhlet apparatus. The fat content was determined gravimetrically after changing the solvent to hexane using nonane as a keeper. Fat sample was spiked with a set of 13C-labeled internal standards: sixteen 2,3,7,8-chlorinated PCDD/F congeners, three non-ortho PCBs (PCB 77, 126, 169), and nine other PCBs (PCB 30 [12C-labeled], 80, 101, 105, 138, 153, 156, 180, 194).

The sample was defatted in a silica gel column containing acidic and neutral layers of silica, and all analytes were eluted with dichloromethane (DCM):cyclohexane (c-hexane) (1:1). PCDD/Fs were separated from PCBs on activated carbon column (Carbopack C, 60/80 mesh) containing Celite (Merck 2693). The first fraction including PCBs was eluted with DCM:c-hexane (1:1) following a back elution of the second fraction (PCDD/Fs) with toluene. Eluents from both of the fractions were evaporated using nonane as a keeper and then fractions in n-hexane were further cleaned by passing them through an activated alumina column (Merck 1097). The PCDD/F fraction was eluted from the alumina column with 20% DCM in n-hexane and recovery standards (13C 1,2,3,4-TCDD and 13C 1,2,3,7,8,9-HxCDD) were added to the fraction before DCM and n-hexane were replaced by 10-15 μl of nonane. The PCB fraction was eluted from the alumina column with 2% DCM in n-hexane, and the fraction, after changing the eluent to n-hexane, was transferred to another activated carbon column (without Celite) in order to separate the non-ortho PCBs from other PCBs. DCM (50%) in n-hexane was used to elute other PCBs while non-ortho PCBs were back eluted with toluene. Recovery standards, PCB 159 for other PCBs and 13C PCB 60 for non-ortho PCBs were added prior to analysis; the solvent for other PCBs (DCM:n-hexane, 1:1) was replaced by 300 μl of n-hexane, for non-ortho PCBs toluene was replaced by 10–15 μl of nonane. The quantitation was performed by selective ion recording mode using a VG 70–250 SE (VG Analytical, UK) mass spectrometer (resolution 10,000) equipped with a HP 6890 gas chromatograph with a fused silica capillary column (DB-DIOXIN, 60 m, 0.25 mm, 0.15 μm). Two μl were injected into a split-splitless injector at 270 °C. The temperature programs for PCDD/Fs, non-ortho-PCBs, and other PCBs were:

  • start, 140 °C (4 min), rate 20 °C min−1 to 180 °C (0 min), rate 2 °C min−1 to 270 °C (36 min);
  • start, 140 °C (4 min), rate 20 °C min−1 to 200 °C (0 min), rate 10 °C min−1 to 270 °C (12 min);
  • start, 60 °C (3 min), rate 20 °C min−1 to 200 °C (0 min), rate 4 °C min−1 to 270 °C (14 min); respectively.

Limits of quantitation (LOQ) for PCDD/Fs and non-ortho PCBs varied between 0.1–5 and 1–5 pg g−1 fat, respectively, and for other PCBs between 0.02 and 0.1 ng g−1 fat, depending on each individual congener. Recoveries for internal standards were more than 50% for all congeners. Concentrations were calculated with lower bound method in which the results of congeners with concentrations below the LOQ were designated as nil.

This code was used to upload the data to Opasnet Base:

+ Show code


Quality control and assurance

Fat samples were analyzed during and after the collection period 1997–1999. All analytical work was performed blind such that the chemistry laboratory knew only the code of the sample. The laboratory reagent and equipment blank samples were treated and analyzed with the same method as the actual samples, one blank for every eight to ten samples. Quality assurance of analysis was performed in two separate ways: (a) two preformulated pools of human fat with different concentrations of PCDD/Fs [10.6 (n = 35) and 40.2 (n = 33) pg g−1 (WHOPCDD/F-TEQ in fat)] and PCBs [4.72 and 24.2 pg g−1 (WHOPCB-TEQ), respectively] were always run with each lot of samples and (b) 36 individual fat samples with WHOPCDD/F-TEQs ranging from 6.9 to 116 pg g−1 and WHOPCB-TEQs from 4.6 to 95 pg g−1 were analyzed in duplicate. The coefficients of variation (CV) for WHOPCDD/F-TEQ in preformulated pools were 5.1% and 5.7%, respectively, and for WHOPCB-TEQ 12 and 9.0%, respectively. In duplicate analysis the CV was 6.2% for WHOPCDD/F-TEQ and 18% for WHOPCB-TEQ.

The laboratory has successfully participated in several international quality control studies for the analysis of PCDD/Fs, and PCBs. Matrices in these studies have included cow milk, human milk and human serum. (Yrjänheikki, 1991, Rymen, 1994, WHO, 1996 and Lindström et al., 2000). The laboratory of chemistry in the National Public Health Institute is an accredited testing laboratory (No T077) in Finland (EN ISO/IEC 17025). The scope of accreditation includes PCDD/Fs, non-ortho PCBs, and other PCBs from human tissue samples.

Statistical analyses

Conditional logistic regression analysis was performed with SAS PHREG procedure. Odds ratios were estimated for each quintile of WHO-TEq, the sum of the toxic congeners and the most relevant individual congeners, i.e., 2378-TCDD, 2378-TCDF, 12378-PeCDD, 23478-PeCDF and 123678-HxCDD (abbreviations: T, tetra; Pe, penta; Hx, hexa; Hp, hepta; O, octa; CDD, chlorinated dibenzo-p-dioxin; CDF, chlorinated dibenzofuran). In the other congener-specific analyses, exposures were treated as continuous variables and odds ratios were calculated for an increase of an interquartile range of the exposure.

All analyses were adjusted for sex. Several variables collected with the questionnaire were used as confounders in the analysis one by one. Nonbinary variables were analyzed as quartiles. Radiation therapy given to an STS patient was considered as diseaserelated and ignored in the analyses if the link to the disease was stated in the questionnaire or if the therapy had been given within 1 year before the operation. The analysis with the largest number of missing values was that with education years with 63 cases and 112 controls, but otherwise there were at least 70 cases and 125 controls in the analyses.

Fish consumption was studied in detail. Specific questions about the frequency of fish consumption were asked: 1 about total fish consumption, and 10 about specific types of fish or fish species. Four fish types contributed most to the total fish consumption. They were assumed to have high (Baltic herring, Baltic salmon) or low (predatory fish from lakes, rainbow trout) dioxin concentration based on previous results.[3] The consumption frequencies (times per month) were calculated for high- and low-dioxin fish separately based on these 4 fish types. Exposure to the following chemicals was asked as a binary variable: solvents, solvent-based paints, formaldehyde, insecticides, fungicides/herbicides, wood preservatives, strong detergents, heavy metals, other chemicals.

Data

The code below runs the main fish consumption and PCDD/F variables, but because this is personal-level data, you need a password to run it. However, you can see ready-made results [1].

For variable descriptions, see D↷

Password:

+ Show code

Questionnaire

Variable information

The variable information was originally documented in Log file about the statistical analyses: Part 1, but unfortunately mostly in Finnish.



Data management

Code to manage the data. It takes the original data files and merges them. Works only if files are available.



Interpretations

The consumption of hard fat is calculated in the following way (Q## means the value from the survey question; I## means the interpretation from the table below; Q24&I24 means that question Q24 is quantified by using interpretation from I24 with matching values; Q23*I23 means that the survey value and interpretation are multiplied.

total_fat = (Q23a*I23 + Q23b*I23) * Q24&I24 + Q25&I25 * Q26&I26 * Q21a&I21 + Q27&I27 * 20

The code assumes that a person uses 20 g/d fat for cooking. Q23: how much a) milk, b) sourmilk; Q24: What kind of milk; Q25 what fat on bread; Q26: how much fat on bread; Q27: what fat for cooking.

The following assumptions are used to interpret survey answers:

Assumptions for calculations(-)
ObsVariableValueUnitResultDescriptionVastaus suomeksi
1Q23dl per glass2Size of a glass of milk or sourmilk
2Q241fat g/dl0.035full milk, fat g/dltäysmaitoa
3Q242fat g/dl0.015light milk, fat g/dlkevytmaitoa
4Q243fat g/dl0.011% milk, fat g/dlykkösmaitoa
5Q244fat g/dl0fat-free milkrasvatonta maitoa
6Q245fat g/dl0fat-free sourmilkrasvatonta piimää tai kirnupiimää
7Q246fat g/dl0.01other sourmilk fat g/dlmuuta piimää
8Q247fat g/dl0none of theseen juo maitoa enkä piimää
9Q251hard fat, proportion0noneen mitään
10Q252hard fat, proportion0.15soft margarine, share of hard fatkasvimargariinia
11Q253hard fat, proportion0.5oil-butter-mix, share of hard fatVoi-kasvirasvaseosta
12Q254hard fat, proportion1buttervoita
13Q261fat g /slice of bread00 g per slice of breaden lainkaan
14Q262fat g /slice of bread33 g per slice of bread10 g per 3 viipaletta
15Q263fat g /slice of bread77 g per slice of bread10 g per 1-2 viipaletta
16Q264fat g /slice of bread1515 g per slice of breadYli 10 g per viipale
17Q271hard fat fraction0hard fat fraction in the baking fat usedkasviöljyä
18Q272hard fat fraction0.15hard fat fraction in the baking fat usedkasvimargariinia
19Q273hard fat fraction0.5hard fat fraction in the baking fat usedtalousmargariinia
20Q274hard fat fraction0.5hard fat fraction in the baking fat usedVoi-kasvirasvaseosta
21Q275hard fat fraction1hard fat fraction in the baking fat usedvoita
22Q276hard fat fraction0hard fat fraction in the baking fat usedei mitään rasvaa
23Q351alcohol times /a300päivittäin
24Q352alcohol times /a100muutaman kerran viikossa
25Q353alcohol times /a50noin kerran viikossa
26Q354alcohol times /a25pari kertaa kuukaudessa
27Q355alcohol times /a12noin kerran kuukaudessa
28Q356alcohol times /a6noin kerran parissa kuukaudessa
29Q357alcohol times /a43-4 kertaa vuodessa
30Q358alcohol times /a2pari kertaa vuodessa
31Q359alcohol times /a1kerran vuodessa tai harvemmin
32Q3510alcohol times /a0en koskaan
33Q361alcohol portion 0g alcoholvähemmän kuin yhden
34Q362alcohol portion 12g alcohol1 annoksen
35Q363alcohol portion 24g alcohol2 annosta
36Q364alcohol portion 36g alcohol3 annosta
37Q365alcohol portion 55g alcohol4-5 annosta
38Q366alcohol portion 96g alcohol6-10 annosta
39Q367alcohol portion 150g alcoholYli 10 annosta
40Q21a1g/day carbohydrates1.5carbohydrates per day of 100 g bread slicesleipää 100 g viipaleina. oletus: 50% hiilihydraattia
41Q21a2g/day carbohydrates2.5carbohydrates per day of 100 g bread slicesleipää 100 g viipaleina.
42Q21a3g/day carbohydrates7.5carbohydrates per day of 100 g bread slicesleipää 100 g viipaleina.
43Q21a4g/day carbohydrates15carbohydrates per day of 100 g bread slicesleipää 100 g viipaleina.
44Q21a5g/day carbohydrates50carbohydrates per day of 100 g bread slicesleipää 100 g viipaleina.
45Q21a6g/day carbohydrates100carbohydrates per day of 100 g bread slicesleipää 100 g viipaleina.
46Q21b1g/day carbohydrates0.84carbohydrates per day of 200 g porridgepuuroa 200 g annoksina. oletus: 70% hiilihydraattia viljasta, jota 20%
47Q21b2g/day carbohydrates1.4carbohydrates per day of 200 g porridgepuuroa 200 g annoksina.
48Q21b3g/day carbohydrates4.2carbohydrates per day of 200 g porridgepuuroa 200 g annoksina.
49Q21b4g/day carbohydrates8.4carbohydrates per day of 200 g porridgepuuroa 200 g annoksina.
50Q21b5g/day carbohydrates28carbohydrates per day of 200 g porridgepuuroa 200 g annoksina.
51Q21b6g/day carbohydrates56carbohydrates per day of 200 g porridgepuuroa 200 g annoksina.
52Q21c1g/day carbohydrates1.2carbohydrates per day of 200 g pastapastaa 200 g annoksina. oletus: 80% hiilihydraattia viljasta, jota 25%
53Q21c2g/day carbohydrates2carbohydrates per day of 200 g pastapastaa 200 g annoksina.
54Q21c3g/day carbohydrates6carbohydrates per day of 200 g pastapastaa 200 g annoksina.
55Q21c4g/day carbohydrates12carbohydrates per day of 200 g pastapastaa 200 g annoksina.
56Q21c5g/day carbohydrates40carbohydrates per day of 200 g pastapastaa 200 g annoksina.
57Q21c6g/day carbohydrates80carbohydrates per day of 200 g pastapastaa 200 g annoksina.
58Q21d1g/day carbohydrates1.26carbohydrates per day of 200 g musli etcmuita (mysli ym). oletus: 70% hiilihydraattia viljasta, jota 30%
59Q21d2g/day carbohydrates2.1carbohydrates per day of 200 g musli etcmuita (mysli ym).
60Q21d3g/day carbohydrates6.3carbohydrates per day of 200 g musli etcmuita (mysli ym).
61Q21d4g/day carbohydrates12.6carbohydrates per day of 200 g musli etcmuita (mysli ym).
62Q21d5g/day carbohydrates42carbohydrates per day of 200 g musli etcmuita (mysli ym).
63Q21d6g/day carbohydrates84carbohydrates per day of 200 g musli etcmuita (mysli ym).
64Q21e1g/day carbohydrates0.3carbohydrates per day of 200 g youghurt etcviiliä tai jugurttia, sokeri. oletus: 5% hiilihydraattia (Doc. Geigy s. 479)
65Q21e2g/day carbohydrates0.5carbohydrates per day of 200 g youghurt etcviiliä tai jugurttia, sokeri.
66Q21e3g/day carbohydrates1.5carbohydrates per day of 200 g youghurt etcviiliä tai jugurttia, sokeri.
67Q21e4g/day carbohydrates3carbohydrates per day of 200 g youghurt etcviiliä tai jugurttia, sokeri.
68Q21e5g/day carbohydrates10carbohydrates per day of 200 g youghurt etcviiliä tai jugurttia, sokeri.
69Q21e6g/day carbohydrates20carbohydrates per day of 200 g youghurt etcviiliä tai jugurttia, sokeri.
70Q21f1g/day carbohydrates0.015carbohydrates per 50 g cheesevähärasv. juusto, sokeri.
71Q21f2g/day carbohydrates0.025carbohydrates per 50 g cheesevähärasv. juusto, sokeri. oletus: 1% hiilihydraattia (Doc. Geigy s. 479)
72Q21f3g/day carbohydrates0.075carbohydrates per 50 g cheesevähärasv. juusto, sokeri.
73Q21f4g/day carbohydrates0.15carbohydrates per 50 g cheesevähärasv. juusto, sokeri.
74Q21f5g/day carbohydrates0.5carbohydrates per 50 g cheesevähärasv. juusto, sokeri.
75Q21f6g/day carbohydrates1carbohydrates per 50 g cheesevähärasv. juusto, sokeri.
76Q21g1g/day carbohydrates0.015carbohydrates per 50 g cheesemuu juusto, sokeri. oletus: 1% hiilihydraattia (Doc. Geigy s. 479)
77Q21g2g/day carbohydrates0.025carbohydrates per 50 g cheesemuu juusto, sokeri.
78Q21g3g/day carbohydrates0.075carbohydrates per 50 g cheesemuu juusto, sokeri.
79Q21g4g/day carbohydrates0.15carbohydrates per 50 g cheesemuu juusto, sokeri.
80Q21g5g/day carbohydrates0.5carbohydrates per 50 g cheesemuu juusto, sokeri.
81Q21g6g/day carbohydrates1carbohydrates per 50 g cheesemuu juusto, sokeri.
82Q21h1g/day carbohydrates0.3carbohydrates per 100 g ice creamjäätelöä. oletus: 10% hiilihydraattia
83Q21h2g/day carbohydrates0.5carbohydrates per 100 g ice creamjäätelöä.
84Q21h3g/day carbohydrates1.5carbohydrates per 100 g ice creamjäätelöä.
85Q21h4g/day carbohydrates3carbohydrates per 100 g ice creamjäätelöä.
86Q21h5g/day carbohydrates10carbohydrates per 100 g ice creamjäätelöä.
87Q21h6g/day carbohydrates20carbohydrates per 100 g ice creamjäätelöä.
88Q21i1g/day hard fat0.12hard fat per 200 g youghurt etcviiliä tai jugurttia, rasva. oletus: 2 % rasvaa
89Q21i2g/day hard fat0.2hard fat per 200 g youghurt etcviiliä tai jugurttia, rasva.
90Q21i3g/day hard fat0.6hard fat per 200 g youghurt etcviiliä tai jugurttia, rasva.
91Q21i4g/day hard fat1.2hard fat per 200 g youghurt etcviiliä tai jugurttia, rasva.
92Q21i5g/day hard fat4hard fat per 200 g youghurt etcviiliä tai jugurttia, rasva.
93Q21i6g/day hard fat8hard fat per 200 g youghurt etcviiliä tai jugurttia, rasva.
94Q21j1g/day hard fat0.15hard fat per 50 g low-fat cheesevähärasvainen juusto. oletus: 10% rasvaa
95Q21j2g/day hard fat0.25hard fat per 50 g low-fat cheesevähärasvainen juusto.
96Q21j3g/day hard fat0.75hard fat per 50 g low-fat cheesevähärasvainen juusto.
97Q21j4g/day hard fat1.5hard fat per 50 g low-fat cheesevähärasvainen juusto.
98Q21j5g/day hard fat5hard fat per 50 g low-fat cheesevähärasvainen juusto.
99Q21j6g/day hard fat10hard fat per 50 g low-fat cheesevähärasvainen juusto.
100Q21k1g/day hard fat0.45hard fat per 50 g cheesejuusto. oletus: 30% rasvaa (fineli)
101Q21k2g/day hard fat0.75hard fat per 50 g cheesejuusto.
102Q21k3g/day hard fat2.25hard fat per 50 g cheesejuusto.
103Q21k4g/day hard fat4.5hard fat per 50 g cheesejuusto.
104Q21k5g/day hard fat15hard fat per 50 g cheesejuusto.
105Q21k6g/day hard fat30hard fat per 50 g cheesejuusto.
106Q21l1g/day hard fat0.3hard fat per 100 g ice creamjäätelöä. oletus: 10% rasvaa
107Q21l2g/day hard fat0.5hard fat per 100 g ice creamjäätelöä.
108Q21l3g/day hard fat1.5hard fat per 100 g ice creamjäätelöä.
109Q21l4g/day hard fat3hard fat per 100 g ice creamjäätelöä.
110Q21l5g/day hard fat10hard fat per 100 g ice creamjäätelöä.
111Q21l6g/day hard fat20hard fat per 100 g ice creamjäätelöä.
112Q21m1g/day hard fat0.45hard fat per 100 g meat liharuokaa. oletus: 15% rasvaa (Doc. Geigy s. 481)
113Q21m2g/day hard fat0.75hard fat per 100 g meat liharuokaa.
114Q21m3g/day hard fat2.25hard fat per 100 g meat liharuokaa.
115Q21m4g/day hard fat4.5hard fat per 100 g meat liharuokaa.
116Q21m5g/day hard fat15hard fat per 100 g meat liharuokaa.
117Q21m6g/day hard fat30hard fat per 100 g meat liharuokaa.
118Q21n1g/day hard fat0.15hard fat per 100 g meat kalaruokaa. oletus: 5% kovaa rasvaa, finelin mukaan 2-5%
119Q21n2g/day hard fat0.25hard fat per 100 g meat kalaruokaa.
120Q21n3g/day hard fat0.75hard fat per 100 g meat kalaruokaa.
121Q21n4g/day hard fat1.5hard fat per 100 g meat kalaruokaa.
122Q21n5g/day hard fat5hard fat per 100 g meat kalaruokaa.
123Q21n6g/day hard fat10hard fat per 100 g meat kalaruokaa.

How much mass, energy, and dioxin does one portion contain? Data are guesswork of from Fineli.

Food energy and dioxin(g,kJ,pg/portion)
ObsFoodMassEnergyDioxin
1Kalaa1006007
2Silakkaa100792470
3Petokalaa10030125
4Muikkua10075028
5Sisävesikalaa10066823
6Kirjolohta100106774
7Itämeren.lohta1001067770
8Muuta.Itämerestä10066815
9Pakastekalaa1003247
10Kalasäilykkeitä606007
11Valtamerikalaa1006007
12Äyriäisiä602007
13Leipää504060.01
14Puuroja2006420.02
15Makaronia2008460.02
16Muutaviljaa1506000.02
17Viiliä2003340.008
18Juustoja403000.012
19Rasvaisia.juustoja406000.03
20Jäätelöä15012000.03
21Liharuokaa15014001.5
22Maitoa2003580.004
23Piimää2003580.004
Portions per month(portions/mo)
ObsAnswerInterpretation
1En lainkaan0.003
2Harvemmin kuin kerran kuukaudessa tai en lainkaan0.1
3Harvemmin kuin kerran kuukaudessa0.5
4Kerran tai pari kuukaudessa1.5
5Kerran viikossa4
6Pari kertaa viikossa8
7Lähes joka päivä20
8Kerran päivässä tai useammin40

Analyses

Simulated data

This code was used to create a csv file that contains a simulated data from this study. When compared with the original data, the simulated data
  • has the same number of observations,
  • has the same range of values in each variable,
  • has approximately the same correlation structure between all variables.

+ Show code

POPs and obesity

Dioxins and PCBs have been assosiated to type 2 diabetes. Do dioxins cause diabetes, or do diabetes decrease dioxin elimination, or does obesity increase diabetes and decrease dioxin elimination, or something else? We tried to make sense of this by looking at sarcoma study data.

+ Show code

Self-reported chemical exposure

We looked at self-reported chemical exposure, especially pesticides and wood preservatives.

We also looked at the impact of self-reported occupation, recoded into 9 groups. This is best done in the unmatched dataset, but also some analyses were done with the matched dataset. Age was the only clearly significant variable, with sarcoma risk increasing by 8 % per year. Male gender seemed to increase the risk but was not statistically significant. None of the differences between occupation groups were statistically significant, and they did not show a pattern where putatively chemically-exposured groups would have higher risk.

+ Show code

Correlation of dioxin and fish

How do individual dioxin congeners correlate with individual fish parametres in the questionnaire?

+ Show code

These estimates are based on the code above.

Binomial distribution parameter(probability)
ObsFishParameter
1Kalaa0.23179078
2Petokalaa0.17746642
3Muikkua0.14939457
4Sisävesikalaa0.09493785
5Kirjolohta0.29775961
6Silakkaa0.2152247
7Itämeren.lohta0.08175282
8Muuta.Itämerestä0.0282421
9Pakastekalaa0.21510166
10Kalasäilykkeitä0.21598007
11Valtamerikalaa0.1078198
12Äyriäisiä0.16021416

Correlation coefficients between fish dishes



EU kalat

  • The code that used to be here was moved to EU-kalat#Calculations.
  • What updates should be done:
    • Plot iterations to see that the model results do not drift.
    • Take modelled parameters and develop a MC model to produce predicted concentrations.
      • TCDD concentration should be added to the hierearchical Bayes model for this?
    • KTL Sarcoma study, EU-kalat and Goherr: Fish consumption study should all be combined into one model. ----#: . Can models be combined as text with paste()? This could work if all submodels had unique parameter names like N.eu and N.goh rather than just N. And data lists are merged simply with c(). --Jouni (talk) 16:22, 22 January 2017 (UTC) (type: truth; paradigms: science: comment)
    • A causal diagram should be drawn to show the model structure.
  • JAGS user manual [2] (with e.g. distribution names and other guidance)
  • How to generate predictions in JAGS [3]
  • Using rjags, a simple guidance [4]

Related:

  • Easily generate correlated variables from any distribution (without copulas) [5]

Concentration-age graph with THL formatting

+ Show code

See also

Related files

References

  1. Jouni T. TUOMISTO, Juha PEKKANEN, Hannu KIVIRANTA, Erkki TUKIAINEN, Terttu VARTIAINEN and Jouko TUOMISTO. Soft-tissue sarcoma and dioxin: a case-control study. Int. J. Cancer: 108, 893–900 (2004)
  2. Chemosphere (2005) 60: 78: 854-869
  3. Kiviranta H, Korhonen M, Hallikainen A, Vartiainen T. Kalojen dioksiinien ja PCB:eiden kulkeutuminen ihmiseen. Ympäristö ja Terveys 2000; 31: 65-9.