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
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 the Run code below.
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 model 22.2.2017 [4]
- Model run 25.1.2017 [5]
+ Show code- Hide code
# This is code Op_en3104/preprocess on page [[EU-kalat]]
library(rjags)
library(OpasnetUtils)
library(ggplot2)
library(reshape2)
eu <- Ovariable("eu", ddata = "Op_en3104", subset = "POPs")
eu <- EvalOutput(eu)
eu@output <- eu@output[c(1:4, 18, 19)] # THL code, Matrix, Congener, Fish species
eu@marginal <- eu@marginal[c(1:4, 18, 19)]
colnames(eu@output) <- c("THLcode", "Matrix", "Congener", "Fish", "euResult", "euSource")
#> unique(eu@output$Congener)
#[1] 2378TCDD 12378PeCDD 123478HCDD 123678HCDD 123789HCDD 1234678HpCDD
#[7] OCDD 2378TCDF 12378PeCDF 23478PeCDF 123478HCDF 123678HCDF
#[13] 123789HCDF 234678HCDF 1234678HpCDF 1234789HpCDF OCDF CoPCB77 ...
# Remove the four with too little data (>70% BDL) and all non-PCDDF
# aggregate(eu@data$euResult, by = eu@data["POP"], FUN = function(x) mean(x == 0))
conl <- unique(eu@output$Congener)[c(1:12, 14, 15)] # 7 OCDD should be removed
eu@output <- eu@output[eu@output$Congener %in% conl , ]
#[1] Baltic herring Sprat Salmon Sea trout Vendace
#[6] Roach Perch Pike Pike-perch Burbot
#[11] Whitefish Flounder Bream River lamprey Cod
#[16] Trout Rainbow trout Arctic char
fisl <- unique(eu@output$Fish)[c(1:4, 6:14, 17)]
eu@output <- eu@output[eu@output$Fish %in% fisl , ] # Remove four with too little data
eut <- eu
eut@output <- eut@output[
eut@output$Congener == "2378TCDD" & eut@output$Matrix == "Muscle" & result(eut) != 0 , ] # Zeros cannot be used in ratio estimates
eut@output$Congener <- NULL
eut@marginal[colnames(eut@output) == "Congener"] <- NULL
eut <- log10(eu / eut)@output
conl <- conl[conl != "2378TCDD"]
eut <- eut[eut$Congener %in% conl , ]
# Analysis: a few rows disappear here, as shown by numbers per fish species. Why?
# aggregate(eut@output, by = eut@output["Fish"], FUN = length)[[2]]
# [1] 1181 141 131 55 158 51 96 30 36 40 102 49 61 180 eu
# [1] 1173 141 131 55 158 51 96 27 36 40 102 49 53 180 eu/eut
# There are samples where TCDD concenctration is zero.
#eu@data[eu@data$POP == "2378TCDD" & eu@data$euResult == 0 , c(1,4)][[1]]
#eu@data[eu@data[[1]] %in% c("09K0585", "09K0698", "09K0740", "09K0748") , c(1,3,4,18)]
# Some rows disappear because there is no TCDD measurement to compare with:
#8 Baltic herrings, 8 sprats, 3 rainbow trouts.
# Conclusion: this is ok. Total 2292 rows.
ggplot(eu@output, aes(x = euResult, colour = Fish))+geom_density()+
facet_wrap(~ Congener) + scale_x_log10()
ggplot(eut, aes(x = Result, colour = Fish))+geom_density()+
facet_wrap(~ Congener)
objects.store(eu,eut)
cat("Ovariable eu and data.frame eut stored.\n")
| |
Bayes model for dioxin concentrations
- Model run 28.2.2017 [6]
- Model run 28.2.2017 with corrected survey model [7]
- Model run 28.2.2017 with Mu estimates [8]
- Model run 1.3.2017 [9]
+ Show code- Hide code
# This is code Op_en3014/bayes on page [[EU-kalat]]
library(OpasnetUtils)
library(reshape2)
library(rjags)
objects.latest("Op_en3104", code_name = "preprocess") # [[EU-kalat]]
# Hierarchical Bayes model.
# PCDD/F concentrations in fish.
# It uses the sum of PCDD/F (Pcdsum) as the total concentration of dioxin in fish.
# Cong_j is the fraction of a congener from pcdsum.
# pcdsum is log-normally distributed. cong_j follows Dirichlet distribution.
# pcdsum depends on age of fish, fish species and catchment area, but we only have species now so other variables are omitted.
# cong_j depends on fish species.
conl <- as.character(unique(eu@output$Congener))
fisl <- sort(as.character(unique(eu@output$Fish)))
conl
fisl
fishsamples <- reshape(
eu@output,
v.names = "euResult",
idvar = "THLcode",
timevar = "Congener",
drop = c("Matrix", "euSource"),
direction = "wide"
)
# Find the level of quantification for dinterval function
LOQ <- unlist(lapply(fishsamples[3:ncol(fishsamples)], FUN = function(x) min(x[x!=0])))
names(LOQ) <- conl
cong <- data.matrix(fishsamples[3:ncol(fishsamples)])
cong[cong == 0] <- 0.01 # NA # Needed for dinterval
mod <- textConnection("
model{
for(i in 1:S) { # s = fish sample
for(j in 1:C) { # C = congener
# below.LOQ[i,j] ~ dinterval(-cong[i,j], -LOQ[j])
cong[i,j] ~ dlnorm(mu[fis[i],j], tau[fis[i],j])
}
}
for(i in 1:F) { # F = fish species
for(j in 1:C) { # C = congener
mu[i,j] ~ dunif(-3,3) # Why does this not work with dnorm(0, 0.001)?
tau[i,j] <- pow(sigma[i,j], -2)
sigma[i,j] ~ dunif(0, 10)
pcd.pred[i,j] ~ dlnorm(mu[i,j], tau[i,j]) # Model prediction
}
}
}
")
jags <- jags.model(
mod,
data = list(
S = nrow(fishsamples),
C = length(conl),
F = length(fisl),
cong = cong,
# LOQ = LOQ,
# below.LOQ = is.na(cong)*1,
fis = match(fishsamples$Fish, fisl)
),
n.chains = 4,
n.adapt = 100
)
update(jags, 100)
samps <- jags.samples(jags, c('mu', 'pcd.pred'), 1000)
#samps.coda <- coda.samples(jags, c('mu', 'pcd.pred', 'ans.pred'), 1000)
#objects.store(samps)
#library(plyr)
#temp <- adply(samps$mu, c(1,2,3,4))
pcd.pred <- array(
samps$pcd.pred,
dim = c(length(fisl), length(conl), 1000, 4),
dimnames = list(
Fish = fisl,
Congener = conl,
Iter = 1:1000,
Seed = c("S1","S2","S3","S4")
)
)
mu.pred <- array(
samps$mu,
dim = c(length(fisl), length(conl), 1000, 4),
dimnames = list(
Fish = fisl,
Congener = conl,
Iter = 1:1000,
Seed = c("S1","S2","S3","S4")
)
)
objects.store(pcd.pred, mu.pred)
cat("Arrays pcd.pred, mu.pred stored.\n")
| |
See also
References
- ↑ 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]
- ↑ E-R.Venäläinen, A. Hallikainen, R. Parmanne, P.J. Vuorinen: Kotimaisen järvi- ja merikalan raskasmetallipitoisuudet. Elintarvikeviraston julkaisuja 3/2004. [2]
- ↑ 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]