source("src/itgr_measurements.R")
Consolidation de la nomenclature des analytes
Nous désirons consolider la nomenclature des analytes. On peut observer plusieurs divergences dans la facon de nommer les analytes, exemple PCB-17 ou PCB 17. Cette section documente la démarche pour tendre vers une réconciliation des termes utilisés.
On charge les données intégrées depuis le package toxbox
. Les données ne sont pas entreposées dans le package, la function itgr_measurements()
permet de lire les fichiers Excels entreposées sur le disque réseau Z:
et les fusionne dans un seul data.frame
. Il faut pour cela que le VPN soit ouvert, si vous n’êtes pas directement sur le réseau d’environnement canada.
<- itgr_measurements() measurements
Analytes avec un numéro CAS fournis par le laboratoire
La nomenclature des composées chimiques / analytes peut diverger d’un laboratoire à un autre. Chaque pays dispose également de sa propre nomenclature (ex. États-Unis, Allemagne, Royaume-Unis). Afin de reconcilier la nomenclature, nous souhaitons utiliser un identifiant unique international tel que l’International Chemical Identifier (InChl).
Dans un premier temps, on charge les données sur les analytes (incluant le CAS) fournies par les laboratoires. Le fichier analytes_consolidation_27032024
est la fusion des onglets Analyte Information des différentes base de données. On fusionne les données sur les analytes avec les mesures.
<- readxl::read_excel("Z:/07-Données BD/intermediate_files/analytes_consolidation_27032024.xlsx") |>
analytes ::select(Analyte, CASNumber) |>
dplyr::filter(!is.na(CASNumber)) |>
dplyr::mutate(
dplyrkey = janitor::make_clean_names(Analyte, allow_dupes = TRUE, case = "none") |> tolower()
|>
) ::distinct()
dplyr
<- measurements |>
measurements ::mutate(
dplyrkey = stringr::str_replace(variable, "PCB-|PCB ", "PCB") |>
::make_clean_names(allow_dupes = TRUE, case = "none") |> tolower()
janitor
)
<- measurements |>
measurements ::left_join(analytes, by = "key") dplyr
On isole le nom des contaminants pour lesquels nous n’avons pas de CAS associés. Voici la liste de ces contaminants:
<- measurements |>
contaminants_orphelins ::filter(is.na(CASNumber)) |>
dplyr::select(key, variable, CASNumber) |>
dplyr::distinct()
dplyr
::reactable(contaminants_orphelins, searchable = TRUE) reactable
Obtention du numéro de CAS par le service CTS
La fonction webchem::cts_convert()
permet d’interroger plusieurs base de données de référence sur des composées chimiques et d’extraire des identifiants tels que le CAS à partir du nom d’un composé chimique. La fonction webchem::cts_convert()
s’interface sur le service https://cts.fiehnlab.ucdavis.edu/.
<- webchem::cts_convert(contaminants_orphelins$variable, from = "Chemical Name", to = "CAS", match = "first")
cas_from_cts
<- purrr::map2_df(names(cas_from_cts), cas_from_cts, \(n, c){
cas return(data.frame(variable = n, CASNumber = c))
})
::reactable(cas, searchable = TRUE) reactable
En cherchant le numéro CAS avec le nom du composé, on s’apercoit que plusieurs PCB (ex. PCB 60 et 64) tombent sous le même CAS, ce qui est incorrect. On change donc d’approche puisque le service CTS ne semblent pas être un bon service de résolution par le nom.
Obtention du numéro de CAS par le service ChemSpider (csid)
Ce service est fournis par la Société Royale de Chimie. C’est un des services qui semble être robuste pour obtenir un identifiant unique à partir du nom du composé. Une fois, l’identifiant ChemSpider obtenue il est possible d’obtenir le numéro CAS en utilisant le service https://cts.fiehnlab.ucdavis.edu/. On utilise ce service pour effectuer la conversion d’identifiants entre nomenclature (ex. csid vers CAS). Attention, ce service requière l’enregistrement d’un compte et le nombre de requête est limités à 1000 appels par mois.
<- webchem::get_csid(contaminants_orphelins$variable, from = "name")
csid <- csid |> dplyr::rename(variable = query) |>
csid ::left_join(
dplyr::select(contaminants_orphelins, key, variable)
dplyr|>
) ::filter(!is.na(csid)) |>
dplyr::mutate(csid = as.character(csid))
dplyrsaveRDS(csid, "data/csid.rds")
if(!exists("csid")) csid <- readRDS("data/csid.rds")
<- webchem::cts_convert(csid$csid, from = "ChemSpider", to = "CAS", match = "first")
cas_from_csid
<- purrr::map2_df(names(cas_from_csid), cas_from_csid, \(n, c){
cas2 return(data.frame(csid = n, CASNumber = c))
|> dplyr::left_join(csid, by = "csid")
})
::reactable(cas2, searchable = TRUE) reactable
Effectuer la résolution de la nomenclature des composées par l’utilisation du service ChemSpider semble plus prometteur. Après une vérification visuelle, on voit que les composées ne présentent plus d’identifiant unique identique.
Ajout de l’identifiant PubChem (pubcid)
Afin de permettre le retrait d’informations supplémentaires sur les composées chimiques, une des base de données d’intérêt est PubChem. À partir de cette base de données, on peut effectuer le retrait de certaines propriétés chimiques du composée telles que la masse moléculaire par exemple.
<- webchem::cts_convert(cas2$csid, from = "ChemSpider", to = "PubChem CID", match = "first")
pubcid
<- purrr::map2_df(names(pubcid), pubcid, \(n, c){
cas3 return(data.frame(csid = n, pubcid = c))
|> dplyr::distinct() |>
}) ::left_join(cas2, by = "csid") |>
dplyr::distinct() |>
dplyr# On consolide le tableau final
::rename(casid = CASNumber) |>
dplyr::mutate(variable = tolower(variable)) |>
dplyr::distinct() dplyr
Consolidation de la table de reference des analytes
On a ajouté 3 identifiants pour chaque composée chimique de la base de données. Parmis, ces identifiants nous retrouvons: le CAS (casid, identifiant fournis généralement par le laboratoire d’analyse, nomenclature américaine), le ChemSpider ID (csid, nomenclature britanique) et enfin le PubChem ID (pubcid, nomenclature américaine).
On a enfin toutes les informations pour construire la table de référence des composées chimiques. On récupère les composées chimiques pour lesquelles le CAS est renseigné par le laboratoire.
<- measurements |>
contaminants_with_cas ::filter(!is.na(CASNumber)) |>
dplyr::select(key, variable, CASNumber) |>
dplyr::rename(casid = CASNumber) |>
dplyr::mutate(variable = tolower(variable)) |>
dplyr::distinct() dplyr
On va chercher le PubChem ID et et le spiderChem ID pour les contaminants qui avaient déjà un CAS (fournit par le laboratoire).
<- webchem::cts_convert(contaminants_with_cas$casid, from = "CAS", to = "ChemSpider", match = "first")
csid <- purrr::map2_df(names(csid), csid, \(n, c){
csid return(data.frame(casid = n, csid = c))
})
<- webchem::cts_convert(contaminants_with_cas$casid, from = "CAS", to = "PubChem CID", match = "first")
pubcid <- purrr::map2_df(names(pubcid), pubcid, \(n, c){
pubcid return(data.frame(casid = n, pubcid = c))
})
<- contaminants_with_cas |>
contaminants ::left_join(csid, by = "casid") |>
dplyr::left_join(pubcid, by = "casid") |>
dplyr::distinct() |>
dplyr::bind_rows(cas3) |>
dplyr::mutate(
dplyrurl_casid = ifelse(!is.na(casid), paste0("https://commonchemistry.cas.org/detail?cas_rn=", casid), NA),
url_pubcid = ifelse(!is.na(pubcid), paste0("https://pubchem.ncbi.nlm.nih.gov/compound/", pubcid), NA),
url_csid = ifelse(!is.na(csid), paste0("https://www.chemspider.com/Chemical-Structure.", csid, ".html"), NA)
|>
) ::select(-variable) |>
dplyr::distinct() dplyr
Validation: Est-ce que tous les contaminants dans la table de référence sont présent dans la table des mesures?
<- measurements$key |>
keys unique()
<- data.frame(key = keys[!keys %in% contaminants$key], pubcid = NA, csid = NA, casid = NA)
contaminants_without_ids
<- dplyr::bind_rows(contaminants, contaminants_without_ids) |>
contaminants ::distinct()
dplyr
<- dplyr::select(measurements, key, source, conpound_family) |>
sources ::distinct() dplyr
On écrit le fichier pour pouvoir repasser manuellement dessus.
::write_xlsx(list(contaminants, sources), path = "data/tbl_contaminants_ref.xlsx") writexl
Ajout des unités à la table de référence
On utilise les données contenues dans le fichier Z:/07-Données BD/intermediate_files/analytes_consolidation_27032024.xlsx
et qui contient les unités pour un certains nombres de composées. Ce tableau est une fusion des informations documentés dans l’onglet “Analytes informations” des bases de données COEI, HERG et GBHE.
<- readxl::read_excel("data/tbl_contaminants_ref_manual.xlsx") |>
tbl_analytes ::separate_rows(original_ids, sep = ";")
tidyr
<- readxl::read_excel("Z:/07-Données BD/intermediate_files/analytes_consolidation_27032024.xlsx") |>
analytes_units ::mutate(
dplyrkey = janitor::make_clean_names(Analyte, allow_dupes = TRUE, case = "none") |> tolower()
|>
) ::select(key, Units) |>
dplyr::distinct()
dplyr
<- tbl_analytes |> dplyr::left_join(analytes_info, by = c("original_ids" = "key")) |>
tbl_analytes ::group_by_at(dplyr::vars(-original_ids, -Units)) |>
dplyr::summarize(original_ids = paste(original_ids, collapse = ";"), Units = paste(Units, collapse = ";"))
dplyr
::write_xlsx(tbl_analytes, path = "data/tbl_contaminants_ref.xlsx") writexl