EU-kalat: Difference between revisions

From Opasnet
Jump to navigation Jump to search
Line 229: Line 229:
* Model run 11.10.2017 with small and large herring [http://en.opasnet.org/en-opwiki/index.php?title=Special:RTools&id=ICIWZTUZR6rlNwuD] (removed in update)
* Model run 11.10.2017 with small and large herring [http://en.opasnet.org/en-opwiki/index.php?title=Special:RTools&id=ICIWZTUZR6rlNwuD] (removed in update)
* Model run 12.3.2018: bugs fixed with data used in Bayes. In addition, redundant fish species removed and Omega assumed to be the same for herring and salmon. [http://en.opasnet.org/en-opwiki/index.php?title=Special:RTools&id=k0n2CFnjdGBklm9E]
* Model run 12.3.2018: bugs fixed with data used in Bayes. In addition, redundant fish species removed and Omega assumed to be the same for herring and salmon. [http://en.opasnet.org/en-opwiki/index.php?title=Special:RTools&id=k0n2CFnjdGBklm9E]
* Model run 22.3.2018 [http://en.opasnet.org/en-opwiki/index.php?title=Special:RTools&id=NqCI8GcaBkyqGRwH] Model does not mix well. Use thinning?


Warning messages:
Warning messages:
Line 275: Line 276:
}
}


eu2@marginal[colnames(eu2@output) %in% c("Length","Year")] <- TRUE # Indexguide should take care of this but it doesn't!
eu2 <- unkeep(eu2, prevresults = TRUE, sources = TRUE)
eu2 <- unkeep(eu2, prevresults = TRUE, sources = TRUE)
#eu2 <- oapply(eu2, cols = "TEFversion", FUN = "sum") # This goes wrong if > 1 TEFversion. Why do we need this, it drops ca. 400 rows?
eu2 <- oapply(eu2, cols = "TEFversion", FUN = "sum") # Sums up dioxin+furan and non+monoortho. This goes wrong if > 1 TEFversion.


# Hierarchical Bayes model.
# Hierarchical Bayes model.
Line 288: Line 290:


eu3 <- eu2[eu2$Compound %in% conl & eu2$Fish %in% fisl & eu2$Matrix == "Muscle" , ]
eu3 <- eu2[eu2$Compound %in% conl & eu2$Fish %in% fisl & eu2$Matrix == "Muscle" , ]
eu3 <- reshape(
eu3 <- reshape( # Gives warning that more than one value and first taken. Why?
   eu3@output,  
   eu3@output,  
   v.names = "euResult",  
   v.names = "euResult",  
Line 302: Line 304:
#[1] "THLcode"        "Fish"          "N"              "Length"        "Year"           
#[1] "THLcode"        "Fish"          "N"              "Length"        "Year"           
#[6] "euResult.PCDDF" "euResult.PCB"   
#[6] "euResult.PCDDF" "euResult.PCB"   
cong <- data.matrix(eu3[6:ncol(eu3)])


if(FALSE){
if(FALSE){
# Find the level of quantification for dinterval function
  # Find the level of quantification for dinterval function
LOQ <- unlist(lapply(eu3[6:ncol(eu3)], FUN = function(x) min(x[x!=0])))  
  LOQ <- unlist(lapply(eu3[6:ncol(eu3)], FUN = function(x) min(x[x!=0])))  
# With TEQ, there are no zeros. So this is useful only if there are congener-specific results.
  # With TEQ, there are no zeros. So this is useful only if there are congener-specific results.
names(LOQ) <- conl
  names(LOQ) <- conl
}


cong <- data.matrix(eu3[6:ncol(eu3)])
#cong <- sapply(
#  1:length(LOQ),
#  FUN = function(x) ifelse(cong[,x]==0, 0.5*LOQ[x], cong[,x])
#)


  cong <- sapply(
    1:length(LOQ),
    FUN = function(x) ifelse(cong[,x]==0, 0.5*LOQ[x], cong[,x])
  )
}
# This version of the model looks only at Baltic herring, Large herring, small herring and salmon.
# This version of the model looks only at Baltic herring, Large herring, small herring and salmon.
# It assumes that all fish groups have the same Omega but mu varies.
# It assumes that all fish groups have the same Omega but mu varies.
Line 324: Line 327:
   for(i in 1:S) { # S = fish sample
   for(i in 1:S) { # S = fish sample
   #        below.LOQ[i,j] ~ dinterval(-cong[i,j], -LOQ[j])
   #        below.LOQ[i,j] ~ dinterval(-cong[i,j], -LOQ[j])
   cong[i,1:C] ~ dmnorm(muind[fis[i],], Omega[,])
   cong[i,1:C] ~ dmnorm(muind[i,], Omega[,])
   muind[i,1:C] <- mu[fis[i],1:C] + b[fis[i]]*length[i] + b[3]*year[i]
   muind[i,1:C] <- mu[fis[i],1:C] + lenp[fis[i]]*length[i] + timep*year[i]
   }
   }
    
    
   # Prior for betas
   # Priors for parameters
   b[1] ~ dnorm(0,0.0001) # length parameter herring
   timep ~ dnorm(-0.1, 1) # Time trend
  b[2] ~ dnorm(0,0.0001) # length parameter salmon
  b[3] ~ dnorm(0,0.0001) # Time trend


   for(i in 1:Fi) { # Fi = fish species
   for(i in 1:Fi) { # Fi = fish species
  lenp[i] ~ dnorm(0,0.0001) # length parameter
  pred[i,1:C] ~ dmnorm(mu[i,1:C]+lenp[i]*lenpred[i]+timep*timepred, Omega[,]) # Model prediction
   for(j in 1:C) {  
   for(j in 1:C) {  
     mu[i,j] ~ dnorm(mu1[j], tau1[j]) # Congener-specific mean for fishes
     mu[i,j] ~ dnorm(0, 0.0001) # mu1[j], tau1[j]) # Congener-specific mean for fishes
   }
   }
#  pred[i,1:C] ~ dmnorm(mu[i,1:C], Omega[,]) # Model prediction
  }
  for(i in 1:C) { # C = Compound
  mu1[i] ~ dnorm(0, 0.0001)
  tau1[i] ~ dunif(0,10000)
#  pred1[i] ~ dnorm(mu[i], tau1[i])
   }
   }
   Omega[1:C,1:C] ~ dwish(Omega0[1:C,1:C],S)
   Omega[1:C,1:C] ~ dwish(Omega0[1:C,1:C],S)
  Omega1[1:C,1:C] ~ dwish(Omega0[1:C,1:C],S)
   }
   }
")
")
Line 359: Line 355:
     year = eu3$Year,
     year = eu3$Year,
     fis = match(eu3$Fish, fisl),
     fis = match(eu3$Fish, fisl),
    lenpred = c(170, 860),
    timepred = 2009,
     Omega0 = diag(C)/100000
     Omega0 = diag(C)/100000
   ),
   ),
Line 371: Line 369:
   c(
   c(
     'mu', # mean by fish and compound
     'mu', # mean by fish and compound
     'Omega', # precision matrix by fish and compound
     'Omega', # precision matrix by compound
#  'pred', # predicted concentration by fish and compound
     'lenp',# parameters for length
     #    'mu1', # mean prior for mu by compound
     'timep', # parameter for Year
     'Omega1', # precision matrix by compound
     'pred' # predicted concentration for year 2009 and 17 cm herring, 80 cm salmon
     #    'tau1', # precision for prior of all mu
#    'pred1', # predicted concentration by compound
    'b' # parameters for length and year
   ),  
   ),  
   N
   N
)
)
dimnames(samps.j$mu) <- list(Fish = fisl, Compound = conl, Iter = 1:N, Chain = 1:4)
dimnames(samps.j$mu) <- list(Fish = fisl, Compound = conl, Iter = 1:N, Chain = 1:4)
dimnames(samps.j$b) <- list(Param = c("Lenherr","Lensalm","Time"), Compound = conl, Iter = 1:N, Chain = 1:4)
dimnames(samps.j$lenp) <- list(Fish = fisl, Iter = 1:N, Chain = 1:4)
#dimnames(samps.j$mu1) <- list(Compound = conl, Iter = 1:N, Chain = 1:4)
dimnames(samps.j$pred) <- list(Fish = fisl, Compound = conl, Iter = 1:N, Chain = 1:4)
#dimnames(samps.j$pred) <- list(Fish = fisl, Compound = conl, Iter = 1:N, Chain = 1:4)
#dimnames(samps.j$tau1) <- list(Compound = conl, Iter = 1:N, Chain = 1:4)
#dimnames(samps.j$pred1) <- list(Compound = conl, Iter = 1:N, Chain = 1:4)
dimnames(samps.j$Omega) <- list(Compound = conl, Compound2 = conl, Iter=1:N, Chain=1:4)
dimnames(samps.j$Omega) <- list(Compound = conl, Compound2 = conl, Iter=1:N, Chain=1:4)
dimnames(samps.j$Omega1) <- list(Compound = conl, Compound2 = conl, Iter=1:N, Chain=1:4)


##### conc.param contains expected values of the distribution parameters from the model
##### conc.param contains expected values of the distribution parameters from the model
conc.param <- list(
conc.param <- list(
  Omega = apply(samps.j$Omega[,,,1], MARGIN = 1:2, FUN = mean),
  lenp.mean = apply(samps.j$lenp[,,1], MARGIN = 1, FUN = mean),
  lenp.sd = apply(samps.j$lenp[,,1], MARGIN = 1, FUN = sd),
   mu = apply(samps.j$mu[,,,1], MARGIN = 1:2, FUN = mean),
   mu = apply(samps.j$mu[,,,1], MARGIN = 1:2, FUN = mean),
   Omega = apply(samps.j$Omega[,,,1], MARGIN = 1:2, FUN = mean),
   timep.mean = apply(samps.j$lenp[,,1], MARGIN = 1, FUN = mean),
  b = apply(samps.j$b[,,1], MARGIN = 1, FUN = mean)
   timep.sd = apply(samps.j$lenp[,,1], MARGIN = 1, FUN = sd)
  #  pred.mean = apply(samps.j$pred[,,,1], MARGIN = 1:2, FUN = mean),
#  pred.sd = apply(samps.j$pred[,,,1], MARGIN = 1:2, FUN = sd),
   #  mu1 = apply(samps.j$mu1[,,1], MARGIN = 1, FUN = mean),
  #  tau1 = apply(samps.j$tau1[,,1], MARGIN = 1, FUN = mean),
#  pred1.mean = apply(samps.j$pred1[,,1], MARGIN = 1, FUN = mean),
#  pred1.sd = apply(samps.j$pred1[,,1], MARGIN = 1, FUN = sd)
)
)


objects.store(conc.param, samps.j)
objects.store(conc.param, samps.j)
Line 412: Line 399:


# Leave only the main fish species and congeners and remove others
# Leave only the main fish species and congeners and remove others
conl <- indices$Compound.PCDDF14
eu <- eu[eu$Compound %in% conl & eu$Fish %in% fisl , ]
oprint(summary(
  eu,
  marginals = c("Fish", "Compound"), # Matrix is always 'Muscle'
  function_names = c("mean", "sd")
))
euRatio <- EvalOutput(euRatio)
oprint(summary(
  euRatio,
  marginals = c("Fish", "Compound"), # Matrix is always 'Muscle'
  function_names = c("mean", "sd")
))
ggplot(eu@output, aes(x = euResult, colour=Compound))+geom_density()+
  facet_wrap( ~ Fish, scales = "free_y")+scale_x_log10()
#stat_ellipse()
ggplot(euRatio@output, aes(x = euRatioResult, colour = Compound))+geom_density()+
  facet_wrap(~ Fish, scales = "free_y")


ggplot(melt(exp(samps.j$pred[,,,1])), aes(x=value, colour=Compound))+geom_density()+
#oprint(summary(
  facet_wrap( ~ Fish,scales = "free_y")+scale_x_log10()
#  eu2[eu2$Compound %in% indices$Compound.PCDDF14 & eu$Fish %in% fisl , ],
#  marginals = c("Fish", "Compound"), # Matrix is always 'Muscle'
#  function_names = c("mean", "sd")
#))


ggplot(melt(exp(samps.j$pred1[,,1])), aes(x=value, colour=Compound))+geom_density()+
ggplot(eu2@output[eu2$Fish %in% fisl & eu2$Compound %in% conl,], aes(x = euResult, colour=Compound))+stat_ecdf()+
   scale_x_log10()
   facet_wrap( ~ Fish)+scale_x_log10()


ggplot(melt(exp(samps.j$pred[,,,1])), aes(x=value, colour=Compound))+stat_ecdf()+
  facet_wrap( ~ Fish)+scale_x_log10()


scatterplotMatrix(t(samps.j$pred[1,,,1]), main = "Predictions for all compounds for Baltic herring")
scatterplotMatrix(t(samps.j$pred[1,,,1]), main = "Predictions for all compounds for Baltic herring")
## scatterplotMatrix(t(samps.j$mu1[,,1]), main = "Means for all compounds of the generic fish")
scatterplotMatrix(t(samps.j$pred1[,,1]), main = "Prediction for all compounds of the generic fish")
scatterplotMatrix(t(samps.j$pred[,1,,1]), main = "Predictions for all fish species for PCDDF")
scatterplotMatrix(t(samps.j$pred[,1,,1]), main = "Predictions for all fish species for PCDDF")
#scatterplotMatrix(t(samps.j$Omega[6,2,,,1]), main = "Predictions of Omega for pike and PCB")


coda.j <- coda.samples(
coda.j <- coda.samples(
   jags,  
   jags,  
   c('mu', 'pred', 'Omega', 'pred1'),  
   c('mu', 'pred', 'timep','lenp'),  
   N
   N
)
)


plot(coda.j)
plot(coda.j)  
</rcode>
</rcode>



Revision as of 05:11, 22 March 2018


EU-kalat is a study, where concentrations of PCDD/Fs, PCBs, PBDEs and heavy metals have been measured from fish

Question

The scope of EU-kalat study was to measure concentrations of persistent organic pollutants (POPs) including dioxin (PCDD/F), PCB and BDE in fish from Baltic sea and Finnish inland lakes and rivers. [1] [2] [3].

Answer

Dioxin concentrations in Baltic herring.

The original sample results can be acquired from Opasnet base. The study showed that levels of PCDD/Fs and PCBs depends especially on the fish species. Highest levels were on salmon and large sized herring. Levels of PCDD/Fs exceeded maximum level of 4 pg TEQ/g fw multiple times. Levels of PCDD/Fs were correlated positively with age of the fish.

Mean congener concentrations as WHO2005-TEQ in Baltic herring can be printed out with this link or by running the codel below.

+ Show code

Rationale

Data

Data was collected between 2009-2010. The study contains years, tissue type, fish species, and fat content for each concentration measurement. Number of observations is 285.

There is a new study EU-kalat 3, which will produce results in 2016.

Calculations

Preprocess

  • Preprocess model 22.2.2017 [4]
  • Model run 25.1.2017 [5]
  • Model run 22.5.2017 with new ovariables euRaw, euAll, euMain, and euRatio [6]
  • Model run 23.5.2017 with adjusted ovariables euRaw, eu, euRatio [7]
  • Model run 11.10.2017: Small herring and Large herring added as new species [8]
  • Model rerun 15.11.2017 because the previous stored run was lost in update [9]
  • Model run 21.3.2018: Small and large herring replaced by actual fish length [10]

+ Show code

Bayes model for dioxin concentrations

  • Model run 28.2.2017 [11]
  • Model run 28.2.2017 with corrected survey model [12]
  • Model run 28.2.2017 with Mu estimates [13]
  • Model run 1.3.2017 [14]
  • Model run 23.4.2017 [15] produces list conc.param and ovariable concentration
  • Model run 24.4.2017 [16]
  • Model run 19.5.2017 without ovariable concentration [17] ⇤--#: . The model does not mix well, so the results should not be used for final results. --Jouni (talk) 19:37, 19 May 2017 (UTC) (type: truth; paradigms: science: attack)
----#: . Maybe we should just estimate TEQs until the problem is fixed. --Jouni (talk) 19:37, 19 May 2017 (UTC) (type: truth; paradigms: science: comment)
  • Model run 22.5.2017 with TEQdx and TEQpcb as the only Compounds [18]
  • Model run 23.5.2017 debugged [19] [20] [21]
  • Model run 24.5.2017 TEQdx, TECpcb -> PCDDF, PCB [22]
  • Model run 11.10.2017 with small and large herring [23] (removed in update)
  • Model run 12.3.2018: bugs fixed with data used in Bayes. In addition, redundant fish species removed and Omega assumed to be the same for herring and salmon. [24]
  • Model run 22.3.2018 [25] Model does not mix well. Use thinning?

Warning messages: 1: In reshapeWide(data, idvar = idvar, timevar = timevar, varying = varying, : multiple rows match for Compound=PCDDF: first taken 2: In reshapeWide(data, idvar = idvar, timevar = timevar, varying = varying, : multiple rows match for Compound=PCB: first taken Error in jags.model(mod, data = list(S = nrow(eu3), C = C, Fi = Fi, cong = log(cong), : RUNTIME ERROR: Compilation error on line 5. Index out of range taking subset of cong

+ Show code

Initiate conc_pcddf

  • Model run 19.5.2017 [26]
  • Model run 23.5.2017 with bugs fixed [27]
  • Model run 12.10.2017: TEQ calculation added [28]
  • Model rerun 15.11.2017 because the previous stored run was lost in update [29]
  • 12.3.2018 adjusted to match the same Omega for all fish species [30]

+ Show code

⇤--#: . These codes should be coherent with POPs in Baltic herring. --Jouni (talk) 12:14, 7 June 2017 (UTC) (type: truth; paradigms: science: attack)

See also

References

  1. A. Hallikainen, H. Kiviranta, P. Isosaari, T. Vartiainen, R. Parmanne, P.J. Vuorinen: Kotimaisen järvi- ja merikalan dioksiinien, furaanien, dioksiinien kaltaisten PCB-yhdisteiden ja polybromattujen difenyylieettereiden pitoisuudet. Elintarvikeviraston julkaisuja 1/2004. [1]
  2. E-R.Venäläinen, A. Hallikainen, R. Parmanne, P.J. Vuorinen: Kotimaisen järvi- ja merikalan raskasmetallipitoisuudet. Elintarvikeviraston julkaisuja 3/2004. [2]
  3. Anja Hallikainen, Riikka Airaksinen, Panu Rantakokko, Jani Koponen, Jaakko Mannio, Pekka J. Vuorinen, Timo Jääskeläinen, Hannu Kiviranta. Itämeren kalan ja muun kotimaisen kalan ympäristömyrkyt: PCDD/F-, PCB-, PBDE-, PFC- ja OT-yhdisteet. Eviran tutkimuksia 2/2011. ISSN 1797-2981 ISBN 978-952-225-083-4 [3]