---
title: "OENOVARDOCCPNL"
search: false
navbar: false
title-block-banner: true
subtitle: "Description of the project"
from: markdown+emoji
author:
- name: Christelle Hennequet-Antier
orcid: 0000-0001-5836-2803
email: christelle.hennequet-antier@inrae.fr
affiliations:
- name: Migale bioinformatics facility
adress: Domaine de Vilvert
city: Jouy-en-Josas
state: France
date: "2026-03-09"
date-modified: today
image: "preview.png"
reader-mode: false
fig-cap-location: bottom
tbl-cap-location: top
license: "This document will not be accessible without prior agreement of the partners"
format:
html:
embed-resources: false
toc: true
toc-depth: 4
toc-location: right
page-layout: full
code-overflow: wrap
code-fold: false # voir si on prefere true
code-copy: true
code-tools: true
execute:
echo: true
eval: true
output: true
error: true
warning: false
freeze: true # re-render only when source changes
lightbox: auto
---
::: {.cell}
:::
::: {.cell}
:::
::: callout-note
This document is a report of the analyses performed. You will find all the code used to analyze these data. The version of the tools (maybe in code chunks) and their references are indicated, for questions of reproducibility.
:::
# Aim of the project
Etude des facteurs de variation du microbiote des variétés résistantes aux maladies
Acquérir des données sur la composition des communautés microbiennes des variétés résistantes
Identifier et hiérarchiser les facteurs structurants qui impactent les communautés microbiennes : Effet millésime (2023, 2024), Effet région viticole (4 domaines), Effet variété (analysé dans 3 domaines Cazes, Pech Rouge, Vassal)
Analyse différentielles d'abondances réalisées avec ANCOM-BC2 par Gabriela
The aim of the following analyses is to explore the network of taxa in different context and identify clusters of taxa.
## Partners
- Olivier Rué - Migale bioinformatics facility - BioInfomics - INRAE <!-- * Valentin Loux - Migale bioinformatics facility - BioInfomics - INRAE --> <!-- * Cédric Midoux - Migale bioinformatics facility - BioInfomics - INRAE -->
- Christelle Hennequet-Antier - Migale bioinformatics facility - BioInfomics - INRAE
- Gabriela Pinto Miguel - SPO - INRAE
- Cécile Neuvéglise - SPO - INRAE
## Deliverables
Deliverables agreed at the preliminary meeting (@tbl-deliverables).
| | Definition | Status |
|-----|-------------|--------------------|
| 1 | HTML report | :heavy_check_mark: |
: Deliverables {#tbl-deliverables}
# Data management
::: callout-important
All data is managed by the migale facility for the duration of the project. **Once the project is over, the Migale facility does not keep your data**. We will provide you with the raw data and associated metadata that will be deposited on public repositories before the results are used. We can guide you in the submission process. We will then decide which files to keep, knowing that this report will also be provided to you and that the analyses can be replayed if needed.
:::
## Raw data
The raw data were phyloseq objects based on ASV and kmer.
# Bioinformatics
Done by O. Rué and G. Pinto Miguel.
# Biostatistics based on ASV
::: {.cell}
```{.r .cell-code}
library(InraeThemes)
library(tidyverse) # data manipulation
library(phyloseq) # analysis of microbiome census data
library(phyloseq.extended)
library(mia)
library(fastcluster)
library(ComplexHeatmap)
library(igraph) # visualisation network
library(tidygraph)
library(ggraph)
library(ggplot2)
library(data.table)
library(DT)
library(openxlsx)
library(kableExtra)
library(paletteer)
library(patchwork) # arrange multiple graphs
```
:::
## Microbiome dataset exploration
<!-- Clean taxonomies: Some taxonomies needed to be cleaned to respect the lineage. -->
# Clean taxonomies
Some taxonomies needed to be cleaned to respect the lineage.
::: {.cell}
```{.r .cell-code}
library(tidyverse) # data manipulation
library(stringr)
library(phyloseq)
library(phyloseq.extended)
library(microViz)
clean_unidentified_taxa_until_genus <- function(matrix_data, species_list) {
for (sp in species_list) {
rows_to_mod <- which(matrix_data[, "Species"] == sp)
if (length(rows_to_mod) > 0) {
matrix_data[rows_to_mod, "Species"] <- "S__Unidentified_sp."
matrix_data[rows_to_mod, "Genus"] <- "G__Unidentified"
}
}
return(matrix_data)
}
clean_unidentified_taxa_until_family <- function(matrix_data, species_list) {
for (sp in species_list) {
rows_to_mod <- which(matrix_data[, "Species"] == sp)
if (length(rows_to_mod) > 0) {
matrix_data[rows_to_mod, "Species"] <- "S__Unidentified_sp."
matrix_data[rows_to_mod, "Genus"] <- "G__Unidentified"
matrix_data[rows_to_mod, "Family"] <- "F__Unidentified"
}
}
return(matrix_data)
}
clean_unidentified_taxa_until_order <- function(matrix_data, species_list) {
for (sp in species_list) {
rows_to_mod <- which(matrix_data[, "Species"] == sp)
if (length(rows_to_mod) > 0) {
matrix_data[rows_to_mod, "Species"] <- "S__Unidentified_sp."
matrix_data[rows_to_mod, "Genus"] <- "G__Unidentified"
matrix_data[rows_to_mod, "Family"] <- "F__Unidentified"
matrix_data[rows_to_mod, "Order"] <- "O__Unidentified"
}
}
return(matrix_data)
}
clean_unidentified_taxa_until_class <- function(matrix_data, species_list) {
for (sp in species_list) {
rows_to_mod <- which(matrix_data[, "Species"] == sp)
if (length(rows_to_mod) > 0) {
matrix_data[rows_to_mod, "Species"] <- "S__Unidentified_sp."
matrix_data[rows_to_mod, "Genus"] <- "G__Unidentified"
matrix_data[rows_to_mod, "Family"] <- "F__Unidentified"
matrix_data[rows_to_mod, "Order"] <- "O__Unidentified"
matrix_data[rows_to_mod, "Class"] <- "C__Unidentified"
}
}
return(matrix_data)
}
clean_unidentified_taxa_until_phylum <- function(matrix_data, species_list) {
for (sp in species_list) {
rows_to_mod <- which(matrix_data[, "Species"] == sp)
if (length(rows_to_mod) > 0) {
matrix_data[rows_to_mod, "Species"] <- "S__Unidentified_sp."
matrix_data[rows_to_mod, "Genus"] <- "G__Unidentified"
matrix_data[rows_to_mod, "Family"] <- "F__Unidentified"
matrix_data[rows_to_mod, "Order"] <- "O__Unidentified"
matrix_data[rows_to_mod, "Class"] <- "C__Unidentified"
matrix_data[rows_to_mod, "Phylum"] <- "P__Unidentified"
}
}
return(matrix_data)
}
physeq <- readRDS(file = "./input_data/ps_without_OC36_OC37.rds")
##### Remplacement des taxa names pour faciliter les modifs
tax_mat <- as(tax_table(physeq), "matrix")
taxa_names(physeq) <- paste0("ASV", 1:ntaxa(physeq))
#############################################################
##### Kingdom ########################################
# Tout doit être Fungi au niveau Kingdom
tax_table(physeq)[, "Kingdom"] <- "Fungi"
######################################################
##### Modification de la taxonomie double ############
tax_mat <- as(tax_table(physeq), "matrix")
tax_mat[tax_mat[, "Phylum"] == "c(\"Basidiomycota\", \"Basidiomycota\")", "Phylum"] <- "Basidiomycota"
tax_mat[tax_mat[, "Class"] == "c(\"Tremellomycetes\", \"Tremellomycetes\")", "Class"] <- "Tremellomycetes"
tax_mat[tax_mat[, "Order"] == "c(\"Tremellales\", \"Tremellales\")", "Order"] <- "Tremellales"
tax_mat[tax_mat[, "Family"] == "c(\"Bulleribasidiaceae\", \"Bulleribasidiaceae\")", "Family"] <- "Bulleribasidiaceae"
tax_mat[tax_mat[, "Genus"] == "c(\"Vishniacozyma\", \"Vishniacozyma\")", "Genus"] <- "Vishniacozyma"
tax_mat[tax_mat[, "Species"] == "c(\"Vishniacozyma_sp\", \"Vishniacozyma_sp\")", "Species"] <- "Vishniacozyma_sp"
tax_table(physeq) <- tax_table(tax_mat)
######################################################
##### Uniformasation des unidentified ################
tax_mat <- as(tax_table(physeq), "matrix")
tax_mat[tax_mat == "Fungi_sp"] <- "Unidentified"
tax_mat[tax_mat == "unidentified"] <- "Unidentified"
tax_mat[tax_mat == "Ascomycota_sp"] <- "Unidentified"
tax_mat[tax_mat == "Basidiomycota_sp"] <- "Unidentified"
tax_table(physeq) <- tax_table(tax_mat)
######################################################
##### Ajout du préfixe ###############################
physeq <- physeq %>% tax_prepend_ranks(sep="__")
######################################################
##### Modification de la taxonomie vide ##############
tax_mat <- as(tax_table(physeq), "matrix")
tax_mat["ASV1010","Kingdom"] <- "K__Fungi"
tax_mat["ASV1010","Phylum"] <- "P__Unidentified_Fungi"
tax_mat["ASV1010","Class"] <- "C__Unidentified_Fungi"
tax_mat["ASV1010","Order"] <- "O__Unidentified_Fungi"
tax_mat["ASV1010","Family"] <- "F__Unidentified_Fungi"
tax_mat["ASV1010","Genus"] <- "G__Unidentified_Fungi"
tax_mat["ASV1010","Species"] <- "S__Unidentified_Fungi"
tax_table(physeq) <- tax_table(tax_mat)
######################################################
##### Phylum #########################################
tax_mat <- as(tax_table(physeq), "matrix")
tax_mat[tax_mat[, "Phylum"] == "P__Basidiomycota_sp","Phylum"] <- "P__Basidiomycota"
tax_table(physeq) <- tax_table(tax_mat)
physeq %>% comp_barplot(tax_level = "Phylum") + coord_flip()
```
::: {.cell-output-display}
{width=960}
:::
```{.r .cell-code}
#######################################################
##### Class #########################################
physeq <- physeq %>% tax_fix(unknowns = c("C__Multi-affiliation", "C__Unidentified"))
physeq %>% comp_barplot(tax_level = "Class") + coord_flip()
```
::: {.cell-output-display}
{width=960}
:::
```{.r .cell-code}
#####################################################
##### Order #########################################
physeq <- physeq %>% tax_fix(unknowns = c("O__Multi-affiliation", "O__Unidentified"))
tax_mat <- as(tax_table(physeq), "matrix")
tax_mat[tax_mat[, "Order"] == "O__Saccharomycetales", "Class"] <- "C__Saccharomycetes"
tax_mat[tax_mat[, "Order"] == "O__Pleosporales", "Class"] <- "C__Dothideomycetes"
tax_table(physeq) <- tax_table(tax_mat)
physeq %>% comp_barplot(tax_level = "Order") + coord_flip()
```
::: {.cell-output-display}
{width=960}
:::
```{.r .cell-code}
#####################################################
##### Family #########################################
physeq <- physeq %>% tax_fix(unknowns = c("F__Multi-affiliation", "F__Unidentified"))
tax_mat <- as(tax_table(physeq), "matrix")
tax_mat[tax_mat[, "Family"] == "F__Cladosporiaceae", "Order"] <- "O__Cladosporiales"
tax_mat[tax_mat[, "Family"] == "F__Microbotryomycetes", "Order"] <- "O__Sporidiobolales"
tax_mat[tax_mat[, "Family"] == "F__Mycosphaerellaceae", "Order"] <- "O__Mycosphaerellales"
tax_mat[tax_mat[, "Family"] == "F__Neodevriesiaceae", "Order"] <- "O__Mycosphaerellales"
tax_mat[tax_mat[, "Family"] == "F__Symmetrosporaceae", "Order"] <- "O__Cystobasidiomycetes incertae sedis"
tax_mat[tax_mat[, "Family"] == "F__Teratosphaeriaceae", "Order"] <- "O__Mycosphaerellales"
tax_mat[tax_mat[, "Family"] == "F__Microbotryomycetes", "Order"] <- "O__Sporidiobolales"
tax_table(physeq) <- tax_table(tax_mat)
physeq %>% comp_barplot(tax_level = "Family") + coord_flip()
```
::: {.cell-output-display}
{width=960}
:::
```{.r .cell-code}
##### Genus #########################################
physeq <- physeq %>% tax_fix(unknowns = c("G__Multi-affiliation", "G__Unidentified"))
tax_mat <- as(tax_table(physeq), "matrix")
tax_mat[tax_mat[, "Genus"] == "G__Aureobasidium", "Family"] <- "F__Aureobasidiaceae"
tax_mat[tax_mat[, "Genus"] == "G__Curvibasidium", "Family"] <- "F__Microbotryomycetes"
tax_mat[tax_mat[, "Family"] == "F__Microbotryomycetes", "Order"] <- "O__Sporidiobolales"
tax_mat[tax_mat[, "Genus"] == "G__Pichia", "Family"] <- "F__Pichiaceae"
tax_table(physeq) <- tax_table(tax_mat)
physeq %>% comp_barplot(tax_level = "Genus") + coord_flip()
```
::: {.cell-output-display}
{width=960}
:::
```{.r .cell-code}
##### Species #########################################
physeq <- physeq %>% tax_fix(unknowns = c("S__Multi-affiliation", "S__Unidentified"))
tax_mat <- as(tax_table(physeq), "matrix")
species_modif_genus <- c("S__Phaeosphaeriaceae_sp.",
"S__Pseudeurotiaceae_sp.",
"S__Neodevriesiaceae_sp.",
"S__Lophiostomataceae_sp.",
"S__Herpotrichiellaceae_sp.",
"S__Dipodascaceae_sp."
)
tax_mat <- clean_unidentified_taxa_until_genus(tax_mat, species_modif_genus)
species_modif_family <- c("S__Ostropales_sp.",
"S__Pleosporales_sp.",
"S__Polyporales_sp.",
"S__Saccharomycetales_sp.",
"S__Teratosphaeriaceae_sp.",
"S__Tremellales_sp.",
"S__Xylariales_sp.",
"S__Helotiales_sp.",
"S__Dothideales_sp.",
"S__Capnodiales_sp."
)
tax_mat <- clean_unidentified_taxa_until_family(tax_mat, species_modif_family)
species_modif_order <- c("S__Agaricomycetes_sp.","S__Dothideomycetes_sp."
)
tax_mat <- clean_unidentified_taxa_until_order(tax_mat, species_modif_order)
species_modif_phylum <- c("S__Basidiomycota_sp.","S__Fungi_sp."
)
tax_mat <- clean_unidentified_taxa_until_phylum(tax_mat, species_modif_phylum)
tax_table(physeq) <- tax_table(as.matrix(tax_mat))
#physeq1 <- physeq
tax_mat <- as(tax_table(physeq), "matrix")
# 1. Extraction en data.frame
tax_mat <- as(tax_table(physeq), "matrix")
tax_df <- as.data.frame(tax_mat)
# 2. On cible uniquement les lignes où l'espèce est "S_Unidentified_sp."
lignes_cibles <- which(tax_df$Species == "S__Unidentified_sp.")
# 3. Ordre des rangs pour l'analyse
rangs <- c("Kingdom", "Phylum", "Class", "Order", "Family", "Genus", "Species")
# 4. Boucle uniquement sur les lignes concernées
for (idx in lignes_cibles) {
# A. Trouver le dernier rang valide (qui ne contient pas "Unidentified")
last_valid_rank <- "K__Fungi" # Valeur par défaut de sécurité
for (rang in rangs) {
valeur_case <- tax_df[idx, rang]
if (!grepl("unidentified", valeur_case, ignore.case = TRUE) & !is.na(valeur_case)) {
last_valid_rank <- valeur_case
} else {
break # On s'arrête dès qu'on croise le premier "Unidentified"
}
}
# B. Nettoyer le nom du parent trouvé (ex: "O__Polyporales" -> "Polyporales")
nom_propre <- gsub("^[A-Za-z]__", "", last_valid_rank)
# C. Remplacer les rangs qui étaient "Unidentified" par la nouvelle nomenclature
if (grepl("unidentified", tax_df[idx, "Phylum"], ignore.case = TRUE)) {
tax_df[idx, "Phylum"] <- paste0("P__Unidentified_", nom_propre)
}
if (grepl("unidentified", tax_df[idx, "Class"], ignore.case = TRUE)) {
tax_df[idx, "Class"] <- paste0("C__Unidentified_", nom_propre)
}
if (grepl("unidentified", tax_df[idx, "Order"], ignore.case = TRUE)) {
tax_df[idx, "Order"] <- paste0("O__Unidentified_", nom_propre)
}
if (grepl("unidentified", tax_df[idx, "Family"], ignore.case = TRUE)) {
tax_df[idx, "Family"] <- paste0("F__Unidentified_", nom_propre)
}
if (grepl("unidentified", tax_df[idx, "Genus"], ignore.case = TRUE)) {
tax_df[idx, "Genus"] <- paste0("G__Unidentified_", nom_propre)
}
# L'espèce devient systématiquement "S_Unidentified_NomDuParent_sp"
tax_df[idx, "Species"] <- paste0("S__Unidentified_", nom_propre, "_sp.")
}
# 5. Réinjection dans l'objet phyloseq
tax_table(physeq) <- tax_table(as.matrix(tax_df))
#-----------------------#
# Suppression du préfixe
tax <- as.data.frame(tax_table(physeq))
tax[] <- lapply(tax, function(x) {
gsub("^[A-Za-z]__+", "", x)
})
tax_table(physeq) <- tax_table(as.matrix(tax))
### Modif des Ascomycota Phylum Class Order Family restants
tax <- as.data.frame(tax_table(physeq), stringsAsFactors = FALSE)
# taxa concernés
idx <- tax$Species == "Ascomycota_sp."
# reconstruction propre
tax[idx, "Class"] <- paste0(tax[idx, "Phylum"], "_phylum")
tax[idx, "Order"] <- paste0(tax[idx, "Phylum"], "_class")
tax[idx, "Family"] <- paste0(tax[idx, "Phylum"], "_order")
tax[idx, "Genus"] <- paste0(tax[idx, "Phylum"], "_family")
#-----------------------#
# 5. Réinjection dans l'objet phyloseq
tax_table(physeq) <- tax_table(as.matrix(tax))
```
:::
::: {.cell}
```{.r .cell-code}
physeq %>% comp_barplot(tax_level = "Species") + coord_flip()
```
::: {.cell-output-display}
{width=960}
:::
:::
::: {.cell}
```{.r .cell-code}
saveRDS(physeq, file="input_data/physeq_taxcleaned.rds")
```
:::
<!-- Agglomeration at Species level -->
<!-- ```{r} -->
<!-- physeq -->
<!-- physeq_species <- tax_glom(physeq, taxrank="Species") -->
<!-- physeq_species -->
<!-- physeq_species %>% comp_barplot(tax_level = "Species") + coord_flip() -->
<!-- ``` -->
<!-- separate the datasets into two datasets per year in tse format -->
<!-- Description of microbiome datasets -->
::: {.cell}
:::
::: {.cell}
:::
## Description of the entire dataset
Description of the entire dataset which is at ASV taxonomic rank. The taxonomic table was was cleaned to respect the lineage.
<!-- ```{r} -->
<!-- # physeq <- readRDS(file = "./input_data/ps_without_OC36_OC37.rds") -->
<!-- # physeq -->
<!-- ``` -->
::: {.cell}
```{.r .cell-code}
physeq <- readRDS(file = "./input_data/physeq_taxcleaned.rds")
```
:::
Experimental design
::: {.cell}
```{.r .cell-code}
# experimental design
sample_data(physeq) |>
as_tibble() |>
datatable()
```
::: {.cell-output-display}
```{=html}
<div class="datatables html-widget html-fill-item" id="htmlwidget-1c2574858004989e9de3" style="width:100%;height:auto;"></div>
<script type="application/json" data-for="htmlwidget-1c2574858004989e9de3">{"x":{"filter":"none","vertical":false,"data":[["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90","91","92","93","94","95","96","97","98","99","100","101","102","103","104","105","106","107","108","109","110","111","112","113","114","115","116","117","118","119","120","121","122","123","124","125","126","127","128","129","130","131","132","133","134","135","136","137","138","139","140","141","142","143","144","145","146","147","148","149","150","151","152","153","154","155","156","157","158","159","160","161","162","163","164","165","166","167","168","169","170","171","172","173","174","175","176","177","178","179","180","181","182","183","184","185","186","187","188","189","190","191","192","193","194","195","196","197","198","199","200","201","202","203","204","205","206","207","208","209","210"],["eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage","eau de rinçage"],["Artaban","Artaban","Artaban","Mourvedre","Mourvedre","Mourvedre","Marselan","Marselan","Marselan","3176N","3176N","3176N","Prior","Prior","Prior","3328-168N","3328-168N","3328-168N","3160-27-4N","3160-27-4N","3160-27-4N","Artaban","Artaban","Artaban","Syrah","Syrah","Syrah","G14","G14","G14","Petit-Verdot","Petit-Verdot","Petit-Verdot","Artaban","Artaban","Artaban","Fer-Servadou","Fer-Servadou","Fer-Servadou","Touriga-National","Touriga-National","Touriga-National","Niellucio","Niellucio","Niellucio","Pinotage","Pinotage","Vidoc","Vidoc","Vidoc","Monarch","Monarch","Monarch","Cabernet-Cantor","Cabernet-Cantor","Cabernet-Cantor","Merlot-Khorus","Merlot-Khorus","Pinotin","Pinotin","Pinotin","Artaban","Artaban","Artaban","Syrah","Syrah","Syrah","Artaban","Artaban","Artaban","Artaban","Artaban","Artaban","Syrah","Syrah","Syrah","Artaban","Artaban","Artaban","Syrah","Syrah","Syrah","G14","G14","G14","G14","G14","G14","G14","G14","G14","Grenache-rouge","Grenache-rouge","Grenache-rouge","Carignan","Carignan","Carignan","Cabernet-Sauvignon","Cabernet-Sauvignon","Cabernet-Sauvignon","Cabernet-Franc","Cabernet-Franc","Grenache-rouge","Grenache-rouge","Grenache-rouge","Carignan","Carignan","Carignan","Cabernet-Sauvignon","Cabernet-Sauvignon","Cabernet-Sauvignon","Artaban","Artaban","Artaban","Mourvedre","Mourvedre","Mourvedre","Marselan","Marselan","Marselan","3176N","3176N","3176N","Prior","Prior","Prior","3328-168N","3328-168N","3328-168N","3160-27-4N","3160-27-4N","3160-27-4N","Artaban","Artaban","Artaban","Syrah","Syrah","Syrah","G14","G14","G14","Petit-Verdot","Petit-Verdot","Petit-Verdot","Artaban","Artaban","Artaban","Fer-Servadou","Fer-Servadou","Fer-Servadou","Touriga-National","Touriga-National","Touriga-National","Niellucio","Niellucio","Niellucio","Pinotage","Pinotage","Pinotage","Vidoc","Vidoc","Vidoc","Monarch","Monarch","Monarch","Cabernet-Cantor","Cabernet-Cantor","Cabernet-Cantor","Merlot-Khorus","Merlot-Khorus","Merlot-Khorus","Pinotin","Pinotin","Pinotin","Pinotin","Pinotin","Pinotin","Artaban","Artaban","Artaban","Syrah","Syrah","Syrah","Artaban","Artaban","Artaban","Artaban","Artaban","Artaban","Syrah","Syrah","Syrah","Artaban","Artaban","Artaban","Syrah","Syrah","Syrah","G14","G14","G14","G14","G14","G14","G14","G14","G14","Cabernet-Franc","Cabernet-Franc","Cabernet-Franc"],["resistant","resistant","resistant","conventional","conventional","conventional","conventional","conventional","conventional","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","conventional","conventional","conventional","resistant","resistant","resistant","conventional","conventional","conventional","resistant","resistant","resistant","conventional","conventional","conventional","mediterraneen","mediterraneen","mediterraneen","mediterraneen","mediterraneen","mediterraneen","mediterraneen","mediterraneen","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","conventional","conventional","conventional","resistant","resistant","resistant","resistant","resistant","resistant","conventional","conventional","conventional","resistant","resistant","resistant","conventional","conventional","conventional","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","resistant","resistant","resistant","conventional","conventional","conventional","conventional","conventional","conventional","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","conventional","conventional","conventional","resistant","resistant","resistant","conventional","conventional","conventional","resistant","resistant","resistant","conventional","conventional","conventional","mediterraneen","mediterraneen","mediterraneen","mediterraneen","mediterraneen","mediterraneen","mediterraneen","mediterraneen","mediterraneen","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","conventional","conventional","conventional","resistant","resistant","resistant","resistant","resistant","resistant","conventional","conventional","conventional","resistant","resistant","resistant","conventional","conventional","conventional","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","resistant","conventional","conventional","conventional"],["red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red","red"],["none","none","none","bio","bio","bio","bio","bio","bio","none","none","none","none","none","none","none","none","none","none","none","none","bas-intrants","bas-intrants","bas-intrants","conventional","conventional","conventional","bas-intrants","bas-intrants","bas-intrants","conventional","conventional","conventional","none","none","none","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","bio","bio","bio","bio","bio","bio","bio","bio","bio","bio","bio","bio","bio","bio","bio","none","none","none","none","none","none","none","none","none","none","none","none","bio","bio","bio","bio","bio","bio","bio","bio","bio","bio","bio","bio","bio","bio","bio","bio","bio","bio","bio","bio","bio","bio","bio","none","none","none","bio","bio","bio","bio","bio","bio","none","none","none","none","none","none","none","none","none","none","none","none","bas-intrants","bas-intrants","bas-intrants","conventional","conventional","conventional","bas-intrants","bas-intrants","bas-intrants","conventional","conventional","conventional","none","none","none","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","conventional","bio","bio","bio","bio","bio","bio","bio","bio","bio","bio","bio","bio","bio","bio","bio","none","none","none","none","none","none","none","none","none","none","none","none","bio","bio","bio","bio","bio","bio"],["Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Pech Rouge","Pech Rouge","Pech Rouge","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Chapitre","Chapitre","Chapitre","Pech Rouge","Pech Rouge","Pech Rouge","Chapitre","Chapitre","Chapitre","Chapitre","Chapitre","Chapitre","Chapitre","Chapitre","Chapitre","Vassal","Vassal","Vassal","Vassal","Vassal","Vassal","Vassal","Vassal","Vassal","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Pech Rouge","Pech Rouge","Pech Rouge","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Cazes","Chapitre","Chapitre","Chapitre","Pech Rouge","Pech Rouge","Pech Rouge","Chapitre","Chapitre","Chapitre","Chapitre","Chapitre","Chapitre","Chapitre","Chapitre","Chapitre","Vassal","Vassal","Vassal","Vassal","Vassal","Vassal","Vassal","Vassal","Vassal","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge","Pech Rouge"],["2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024"],["standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard","standard"],["2023-09-01","2023-09-01","2023-09-01","2023-09-13","2023-09-13","2023-09-13","2023-09-11","2023-09-11","2023-09-11","2023-09-01","2023-09-01","2023-09-01","2023-08-25","2023-08-25","2023-08-25","2023-08-30","2023-08-30","2023-08-30","2023-08-30","2023-08-30","2023-08-30","2023-09-11","2023-09-11","2023-09-11","2023-09-14","2023-09-14","2023-09-14","2023-08-31","2023-08-31","2023-08-31","2023-09-18","2023-09-18","2023-09-18","2023-08-25","2023-08-25","2023-08-25","2023-09-18","2023-09-18","2023-09-18","2023-09-12","2023-09-12","2023-09-12","2023-09-11","2023-09-11","2023-09-11","2023-08-24","2023-08-24","2023-09-12","2023-09-12","2023-09-12","2023-08-24","2023-08-24","2023-08-24","2023-08-21","2023-08-21","2023-08-21","2023-08-31","2023-08-31","2023-09-14","2023-09-14","2023-09-14","2023-08-28","2023-08-28","2023-08-28","2023-08-31","2023-08-31","2023-08-31","2023-08-28","2023-08-28","2023-08-28","2023-08-28","2023-08-28","2023-08-28","2023-08-28","2023-08-28","2023-08-28","2023-09-04","2023-09-04","2023-09-04","2023-08-29","2023-08-29","2023-08-29","2023-09-04","2023-09-04","2023-09-04","2023-09-01","2023-09-01","2023-09-01","2023-08-22","2023-08-22","2023-08-22","2023-08-23","2023-08-23","2023-08-23","2023-09-13","2023-09-13","2023-09-13","2023-08-23","2023-08-23","2023-08-23","2023-09-06","2023-09-06","26/8/2024","26/8/2024","26/8/2024","20/9/2024","20/9/2024","20/9/2024","10/9/2024","10/9/2024","10/9/2024","3/9/2024","3/9/2024","3/9/2024","17/9/2024","17/9/2024","17/9/2024","17/9/2024","17/9/2024","17/9/2024","30/8/2024","30/8/2024","30/8/2024","27/8/2024","27/8/2024","27/8/2024","10/9/2024","10/9/2024","10/9/2024","26/8/2024","26/8/2024","26/8/2024","10/9/2024","10/9/2024","10/9/2024","17/9/2024","17/9/2024","17/9/2024","10/9/2024","10/9/2024","10/9/2024","18/9/2024","18/9/2024","18/9/2024","27/8/2024","27/8/2024","27/8/2024","25/9/2024","25/9/2024","25/9/2024","25/9/2024","25/9/2024","25/9/2024","25/9/2024","25/9/2024","25/9/2024","4/9/2024","4/9/2024","4/9/2024","18/9/2024","18/9/2024","18/9/2024","28/8/2024","28/8/2024","28/8/2024","28/8/2024","28/8/2024","28/8/2024","17/9/2024","17/9/2024","17/9/2024","24/09/2024","24/09/2024","24/09/2024","25/09/2024","25/09/2024","25/09/2024","29/8/2024","29/8/2024","29/8/2024","30/8/2024","30/8/2024","30/8/2024","30/8/2024","30/8/2024","30/8/2024","29/8/2024","29/8/2024","29/8/2024","29/8/2024","29/8/2024","29/8/2024","4/9/2024","4/9/2024","4/9/2024","12/9/2024","12/9/2024","12/9/2024","4/9/2024","4/9/2024","4/9/2024","2/9/2024","2/9/2024","2/9/2024","27/8/2024","27/8/2024","27/8/2024","2/9/2024","2/9/2024","2/9/2024"],["OC01","OC01","OC01","OC10","OC10","OC10","OC11","OC11","OC11","OC12","OC12","OC12","OC13","OC13","OC13","OC14","OC14","OC14","OC15","OC15","OC15","OC16","OC16","OC16","OC17","OC17","OC17","OC18","OC18","OC18","OC19","OC19","OC19","OC02","OC02","OC02","OC20","OC20","OC20","OC21","OC21","OC21","OC22","OC22","OC22","OC23","OC23","OC24","OC24","OC24","OC25","OC25","OC25","OC26","OC26","OC26","OC27","OC27","OC28","OC28","OC28","OC29","OC29","OC29","OC03","OC03","OC03","OC30","OC30","OC30","OC31","OC31","OC31","OC32","OC32","OC32","OC33","OC33","OC33","OC34","OC34","OC34","OC35","OC35","OC35","OC04","OC04","OC04","OC05","OC05","OC05","OC06","OC06","OC06","OC07","OC07","OC07","OC08","OC08","OC08","OC09","OC09","OC06","OC06","OC06","OC07","OC07","OC07","OC08","OC08","OC08","OC01","OC01","OC01","OC10","OC10","OC10","OC11","OC11","OC11","OC12","OC12","OC12","OC13","OC13","OC13","OC14","OC14","OC14","OC15","OC15","OC15","OC16","OC16","OC16","OC17","OC17","OC17","OC18","OC18","OC18","OC19","OC19","OC19","OC02","OC02","OC02","OC20","OC20","OC20","OC21","OC21","OC21","OC22","OC22","OC22","OC23","OC23","OC23","OC24","OC24","OC24","OC25","OC25","OC25","OC26","OC26","OC26","OC27","OC27","OC27","OC28","OC28","OC28","OC28","OC28","OC28","OC29","OC29","OC29","OC03","OC03","OC03","OC30","OC30","OC30","OC31","OC31","OC31","OC32","OC32","OC32","OC33","OC33","OC33","OC34","OC34","OC34","OC35","OC35","OC35","OC04","OC04","OC04","OC05","OC05","OC05","OC09","OC09","OC09"],["19,6","19,6","19,6","21,6","21,6","21,6","26,2","26,2","26,2","21","21","21","19","19","19","21,2","21,2","21,2","25,6","25,6","25,6","20,4","20,6","20,6","23","23,2","23,4","16,2","16,4","16,4","22,2","22,2","22,2","22,8","22,8","22,8","23","23","23","24","24","24","21,6","21,6","21,6","25,6","25,6","22,2","22,2","22,2","21,8","21,8","21,8","23","22,8","23","27,8","27,8","24,4","24,4","24,4","20,4","20,6","21","22","22,2","22,2","20,8","21","21,6","18,6","18,6","18,6","20,4","20,4","20,4","19,8","19,8","19,8","20,8","20,6","20,6","19,8","20","19,8","20","20","20","18,8","18,4","18,6","20,8","20,8","20,8","22,8","22,6","22,8","22,4","22,4","22,4","22,6","22,6","22,2","22,2","22,2","23,0","23,0","23,0","21,8","21,8","21,8","19,2","19,2","19,2","22,6","22,6","22,6","26","26","26","19,6","19,6","19,6","19,4","19,4","19,4","19,8","19,8","19,8","22,8","22,8","22,8","19","19","19","24","24","24","18,6","18,6","18,6","20,8","20,8","20,8","23,6","23,6","23,6","21,4","21,4","21,4","23,6","23,6","23,6","21,4","21,4","21,4","24,6","24,6","24,6","22","22","22","21","21","21","23,8","23,8","23,8","23,2","23,2","23,2","20,6","20,6","20,6","20,6","20,6","20,6","20,2","20,6","19,4","22,2","22,2","22,2","19,8","19,6","20","19,8","20","19,4","21,6","21,6","20,4","24,2","24,2","24,2","20","20","20","24,6","24,6","24,6","17,6","17,6","17,6","17,8","17,8","17,8","22,8","22,8","22,8"],["2023-OC01-1-B","2023-OC01-2-B","2023-OC01-3-B","2023-OC10-1-B","2023-OC10-2-B","2023-OC10-3-B","2023-OC11-1-B","2023-OC11-2-B","2023-OC11-3-B","2023-OC12-1-B","2023-OC12-2-B","2023-OC12-3-B","2023-OC13-1-B","2023-OC13-2-B","2023-OC13-3-B","2023-OC14-1-B","2023-OC14-2-B","2023-OC14-3-B","2023-OC15-1-B","2023-OC15-2-B","2023-OC15-3-B","2023-OC16-1-B","2023-OC16-2-B","2023-OC16-3-B","2023-OC17-1-B","2023-OC17-2-B","2023-OC17-3-B","2023-OC18-1-B","2023-OC18-2-B","2023-OC18-3-B","2023-OC19-1-B","2023-OC19-2-B","2023-OC19-3-B","2023-OC02-1-B","2023-OC02-2-B","2023-OC02-3-B","2023-OC20-1-B","2023-OC20-2-B","2023-OC20-3-B","2023-OC21-1-B","2023-OC21-2-B","2023-OC21-3-B","2023-OC22-1-B","2023-OC22-2-B","2023-OC22-3-B","2023-OC23-1-B","2023-OC23-2-B","2023-OC24-1-B","2023-OC24-2-B","2023-OC24-3-B","2023-OC25-1-B","2023-OC25-2-B","2023-OC25-3-B","2023-OC26-1-B","2023-OC26-2-B","2023-OC26-3-B","2023-OC27-2-B","2023-OC27-3-B","2023-OC28-1-B","2023-OC28-2-B","2023-OC28-3-B","2023-OC29-1-B","2023-OC29-2-B","2023-OC29-3-B","2023-OC03-1-B","2023-OC03-2-B","2023-OC03-3-B","2023-OC30-1-B","2023-OC30-2-B","2023-OC30-3-B","2023-OC31-1-B","2023-OC31-2-B","2023-OC31-3-B","2023-OC32-1-B","2023-OC32-2-B","2023-OC32-3-B","2023-OC33-1-B","2023-OC33-2-B","2023-OC33-3-B","2023-OC34-1-B","2023-OC34-2-B","2023-OC34-3-B","2023-OC35-1-B","2023-OC35-2-B","2023-OC35-3-B","2023-OC04-1-B","2023-OC04-2-B","2023-OC04-3-B","2023-OC05-1-B","2023-OC05-2-B","2023-OC05-3-B","2023-OC06-1-B","2023-OC06-2-B","2023-OC06-3-B","2023-OC07-1-B","2023-OC07-2-B","2023-OC07-3-B","2023-OC08-1-B","2023-OC08-2-B","2023-OC08-3-B","2023-OC09-1-B","2023-OC09-2-B","2024-OC06-1-B","2024-OC06-2-B","2024-OC06-3-B","2024-OC07-1-B","2024-OC07-2-B","2024-OC07-3-B","2024-OC08-1-B","2024-OC08-2-B","2024-OC08-3-B","2024-OC01-1-B","2024-OC01-2-B","2024-OC01-3-B","2024-OC10-1-B","2024-OC10-2-B","2024-OC10-3-B","2024-OC11-1-B","2024-OC11-2-B","2024-OC11-3-B","2024-OC12-2-B","2024-OC12-3-B","2024-OC12-4-B","2024-OC13-1-B","2024-OC13-2-B","2024-OC13-3-B","2024-OC14-1-B","2024-OC14-2-B","2024-OC14-3-B","2024-OC15-1-B","2024-OC15-2-B","2024-OC15-3-B","2024-OC16-1-B","2024-OC16-2-B","2024-OC16-3-B","2024-OC17-1-B","2024-OC17-2-B","2024-OC17-3-B","2024-OC18-1-B","2024-OC18-2-B","2024-OC18-3-B","2024-OC19-1-B","2024-OC19-2-B","2024-OC19-3-B","2024-OC02-1-B","2024-OC02-2-B","2024-OC02-3-B","2024-OC20-1-B","2024-OC20-2-B","2024-OC20-3-B","2024-OC21-1-B","2024-OC21-2-B","2024-OC21-3-B","2024-OC22-1-B","2024-OC22-2-B","2024-OC22-3-B","2024-OC23-1-B","2024-OC23-2-B","2024-OC23-3-B","2024-OC24-1-B","2024-OC24-2-B","2024-OC24-3-B","2024-OC25-1-B","2024-OC25-2-B","2024-OC25-3-B","2024-OC26-1-B","2024-OC26-2-B","2024-OC26-3-B","2024-OC27-1-B","2024-OC27-2-B","2024-OC27-3-B","2024-OC28-1-B","2024-OC28-2-B","2024-OC28-3-B","2024-OC28-5-B","2024-OC28-6-B","2024-OC28-7-B","2024-OC29-1-B","2024-OC29-2-B","2024-OC29-3-B","2024-OC03-1-B","2024-OC03-2-B","2024-OC03-3-B","2024-OC30-1-B","2024-OC30-2-B","2024-OC30-3-B","2024-OC31-1-B","2024-OC31-2-B","2024-OC31-3-B","2024-OC32-1-B","2024-OC32-2-B","2024-OC32-3-B","2024-OC33-1-B","2024-OC33-2-B","2024-OC33-3-B","2024-OC34-1-B","2024-OC34-2-B","2024-OC34-3-B","2024-OC35-1-B","2024-OC35-2-B","2024-OC35-3-B","2024-OC04-1-B","2024-OC04-2-B","2024-OC04-3-B","2024-OC05-1-B","2024-OC05-2-B","2024-OC05-3-B","2024-OC09-1-B","2024-OC09-2-B","2024-OC09-3-B"],["4.27","4.27","4.27","15.2","15.2","15.2","15.2","15.2","15.2","11.33","11.33","11.33","3.0","3.0","3.0","11.33","11.33","11.33","11.33","11.33","11.33","2.0","2.0","2.0","9.82","9.82","9.82","2.0","2.0","2.0","9.82","9.82","9.82","3.0","3.0","3.0","9.82","9.82","9.82","9.82","9.82","9.82","9.82","9.82","9.82","9.82","9.82","2.0","2.0","2.0","2.0","2.0","2.0","2.0","2.0","2.0","2.0","2.0","2.0","2.0","2.0","0.0","0.0","0.0","12.77","12.77","12.77","0.0","0.0","0.0","0.0","0.0","0.0","10.69","10.69","10.69","3.0","3.0","3.0","16.34","16.34","16.34","3.0","3.0","3.0","4.27","4.27","4.27","11.33","11.33","11.33","11.33","11.33","11.33","17.1","17.1","17.1","11.33","11.33","11.33","11.33","11.33","8.3","8.3","8.3","23.6","23.6","23.6","8.3","8.3","8.3","4.27","4.27","4.27","16.8","16.8","16.8","13.8","13.8","13.8","8.3","8.3","8.3","3.0","3.0","3.0","8.3","8.3","8.3","8.3","8.3","8.3","5.33","5.33","5.33","14.04","14.04","14.04","14.04","14.04","14.04","20.69","20.69","20.69","3.0","3.0","3.0","14.04","14.04","14.04","14.04","14.04","14.04","14.04","14.04","14.04","14.04","14.04","14.04","5.33","5.33","5.33","5.33","5.33","5.33","5.33","5.33","5.33","5.33","5.33","5.33","14.04","14.04","14.04","14.04","14.04","14.04","0.0","0.0","0.0","17.45","17.45","17.45","0.0","0.0","0.0","0.0","0.0","0.0","5.17","5.17","5.17","3.0","3.0","3.0","16.18","16.18","16.18","3.0","3.0","3.0","4.27","4.27","4.27","8.3","8.3","8.3","16.48","16.48","16.48"],["103-colombiers","103-colombiers","103-colombiers","P72","P72","P72","P83","P83","P83","P85-vate","P85-vate","P85-vate","P58","P58","P58","P85-vate","P85-vate","P85-vate","P85-vate","P85-vate","P85-vate","-","-","-","-","-","-","-","-","-","-","-","-","P58","P58","P58","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","102-colombiers","102-colombiers","102-colombiers","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","97-colombiers","97-colombiers","97-colombiers","P85-vate","P85-vate","P85-vate","P85-vate","P85-vate","P85-vate","95-colombiers","95-colombiers","95-colombiers","P85-vate","P85-vate","P85-vate","P85-vate","P85-vate","P85-vate","P85-vate","P85-vate","95-colombiers","95-colombiers","95-colombiers","P85-vate","P85-vate","P85-vate","103-colombiers","103-colombiers","103-colombiers","P72","P83","P83","P83","P85-vate","P85-vate","P85-vate","P58","P58","P58","P85-vate","P85-vate","P85-vate","P85-vate","P85-vate","P85-vate","P85-vate","P85-vate","-","-","-","-","-","-","-","-","-","-","-","-","P58","P58","P58","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","102-colombiers","102-colombiers","102-colombiers","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","97-colombiers","97-colombiers","97-colombiers","P85-vate","P85-vate","P85-vate","P85-vate","P85-vate","P85-vate"],["colombiers","colombiers","colombiers","clape","clape","clape","clape","clape","clape","P85-vate","P85-vate","P85-vate","sable","sable","sable","P85-vate","P85-vate","P85-vate","P85-vate","P85-vate","P85-vate","-","-","-","-","-","-","-","-","-","-","-","-","sable","sable","sable","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","colombiers","colombiers","colombiers","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","colombiers","colombiers","colombiers","P85-vate","P85-vate","P85-vate","P85-vate","P85-vate","P85-vate","colombiers","colombiers","colombiers","P85-vate","P85-vate","P85-vate","P85-vate","P85-vate","P85-vate","P85-vate","P85-vate","colombiers","colombiers","colombiers","P85-vate","P85-vate","P85-vate","colombiers","colombiers","colombiers","clape","clape","clape","clape","P85-vate","P85-vate","P85-vate","sable","sable","sable","P85-vate","P85-vate","P85-vate","P85-vate","P85-vate","P85-vate","P85-vate","P85-vate","-","-","-","-","-","-","-","-","-","-","-","-","sable","sable","sable","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","colombiers","colombiers","colombiers","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","colombiers","colombiers","colombiers","P85-vate","P85-vate","P85-vate","clape","clape","clape"]],"container":"<table class=\"display\">\n <thead>\n <tr>\n <th> <\/th>\n <th>Type<\/th>\n <th>Variety_name<\/th>\n <th>Variety_type<\/th>\n <th>colour<\/th>\n <th>treatment<\/th>\n <th>locality<\/th>\n <th>Year<\/th>\n <th>inoculation<\/th>\n <th>collect.date<\/th>\n <th>modality<\/th>\n <th>Brix<\/th>\n <th>SampleName<\/th>\n <th>IFT<\/th>\n <th>Plot<\/th>\n <th>Plot_2<\/th>\n <\/tr>\n <\/thead>\n<\/table>","options":{"pageLength":10,"scrollX":true,"language":{"search":"Filter:"},"dom":"lftipB","buttons":["copy","csv","excel"],"columnDefs":[{"orderable":false,"targets":0},{"name":" ","targets":0},{"name":"Type","targets":1},{"name":"Variety_name","targets":2},{"name":"Variety_type","targets":3},{"name":"colour","targets":4},{"name":"treatment","targets":5},{"name":"locality","targets":6},{"name":"Year","targets":7},{"name":"inoculation","targets":8},{"name":"collect.date","targets":9},{"name":"modality","targets":10},{"name":"Brix","targets":11},{"name":"SampleName","targets":12},{"name":"IFT","targets":13},{"name":"Plot","targets":14},{"name":"Plot_2","targets":15}],"order":[],"autoWidth":false,"orderClasses":false}},"evals":[],"jsHooks":[]}</script>
```
:::
:::
Number of biological repetition per factor
::: {.cell}
```{.r .cell-code}
# count number of samples per condition
sample_data(physeq) |>
as_tibble() |>
group_by(Year) |>
dplyr::count(Year, Variety_type, locality, treatment) |>
datatable()
```
::: {.cell-output-display}
```{=html}
<div class="datatables html-widget html-fill-item" id="htmlwidget-ff4c45c795b1bac4962a" style="width:100%;height:auto;"></div>
<script type="application/json" data-for="htmlwidget-ff4c45c795b1bac4962a">{"x":{"filter":"none","vertical":false,"data":[["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22"],["2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2023","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024","2024"],["conventional","conventional","conventional","conventional","mediterraneen","resistant","resistant","resistant","resistant","resistant","resistant","conventional","conventional","conventional","conventional","mediterraneen","resistant","resistant","resistant","resistant","resistant","resistant"],["Cazes","Chapitre","Pech Rouge","Vassal","Cazes","Cazes","Cazes","Chapitre","Pech Rouge","Pech Rouge","Vassal","Cazes","Chapitre","Pech Rouge","Vassal","Cazes","Cazes","Cazes","Chapitre","Pech Rouge","Pech Rouge","Vassal"],["conventional","bio","bio","none","conventional","bas-intrants","conventional","bio","bio","none","none","conventional","bio","bio","none","conventional","bas-intrants","conventional","bio","bio","none","none"],[9,3,20,3,8,6,14,9,3,21,6,9,3,21,3,9,6,18,9,3,21,6]],"container":"<table class=\"display\">\n <thead>\n <tr>\n <th> <\/th>\n <th>Year<\/th>\n <th>Variety_type<\/th>\n <th>locality<\/th>\n <th>treatment<\/th>\n <th>n<\/th>\n <\/tr>\n <\/thead>\n<\/table>","options":{"pageLength":10,"scrollX":true,"language":{"search":"Filter:"},"dom":"lftipB","buttons":["copy","csv","excel"],"columnDefs":[{"className":"dt-right","targets":5},{"orderable":false,"targets":0},{"name":" ","targets":0},{"name":"Year","targets":1},{"name":"Variety_type","targets":2},{"name":"locality","targets":3},{"name":"treatment","targets":4},{"name":"n","targets":5}],"order":[],"autoWidth":false,"orderClasses":false}},"evals":[],"jsHooks":[]}</script>
```
:::
:::
Check affiliation at Species rank
::: {.cell}
```{.r .cell-code}
physeq %>% comp_barplot(tax_level = "Species") + coord_flip()
```
::: {.cell-output-display}
{width=960}
:::
:::
Separate the microbiome dataset by Year in TreeSummarizedExperiment format @TreeSummarizedExperiment. Manipulation of data will be performed using Microbiome analysis tools, mia R package @mia_package.
::: {.cell}
```{.r .cell-code}
# create TreeSummarizedExperiment objets
tse <- physeq |>
convertFromPhyloseq()
# manipulation
# assay(tse, "counts")[1:3, 1:3] #counts
# rowData(tse) |> head() # taxonomic table
# colData(tse) |> head() # samples table
```
:::
We would like to agglomerate counts at species rank. So we need available and unicity of taxonomic rank names. We also renamed rownames of rowData to facilitate visualisation.
::: {.cell}
```{.r .cell-code}
#taxonomyRanks(tse)
# il n'y a pas unicité au niveau espèce - faire une agglomération
# renommer les row si sequence ASV
#rowData(tse)$Species |> head()
table(taxonomyRankEmpty(tse, rank = "Species"))
```
::: {.cell-output .cell-output-stdout}
```
FALSE
1314
```
:::
```{.r .cell-code}
#rowData(tse)[is.na(rowData(tse)$Species), ]
index <- which(is.na(rowData(tse)$Species) == TRUE)
# assay(tse, "counts")[index, ] |>
# data.frame() |>
# colSums()
# nbASV <- assay(tse, "counts") |>
# data.frame() |>
# rowSums()
#assay(tse, "counts")[nbASV < 150, ]
# rare <- getRare(tse, rank = "Species", prevalence = 0.2, detection = 0)
# rare |> head()
```
:::
Aggregate at Species Rank
**To be done at Genus ?**
Affiliation corrections were made.
::: {.cell}
```{.r .cell-code}
tse_species <- agglomerateByRank(tse, rank = "Species")
tse_species
```
::: {.cell-output .cell-output-stdout}
```
class: TreeSummarizedExperiment
dim: 409 210
metadata(1): agglomerated_by_rank
assays(1): counts
rownames(409): Acanthophysium_bisporum Acaromyces_ingoldii ...
Zygosporium_pseudogibbum Zymoseptoria_brevis
rowData names(7): Kingdom Phylum ... Genus Species
colnames(210): 2023-OC01-1-B 2023-OC01-2-B ... 2024-OC09-2-B
2024-OC09-3-B
colData names(15): Type Variety_name ... Plot Plot_2
```
:::
::: {.cell-output .cell-output-stdout}
```
reducedDimNames(0):
mainExpName: NULL
```
:::
::: {.cell-output .cell-output-stdout}
```
altExpNames(0):
rowLinks: a LinkDataFrame (409 rows)
rowTree: 1 phylo tree(s) (409 leaves)
colLinks: NULL
colTree: NULL
referenceSeq: a DNAStringSet (409 sequences)
```
:::
:::
<!-- Not usefull with _clean_taxa.qmd script -->
<!-- Taxonomy table at Species rank for not unique species. -->
<!-- ```{r} -->
<!-- taxo_table_species <- rowData(tse_species) %>% as.data.frame() -->
<!-- taxo_table_species$species2 <- rownames(taxo_table_species) -->
<!-- # count different taxonomies for the same specie -->
<!-- freq <- taxo_table_species |> -->
<!-- group_by(Species) |> -->
<!-- summarise(nb = n()) -->
<!-- taxo_table_species <- dplyr::left_join(taxo_table_species, freq, -->
<!-- join_by(Species == Species)) -->
<!-- taxo_table_species <- taxo_table_species |> -->
<!-- filter(nb > 2) |> -->
<!-- arrange(nb, Species) -->
<!-- write_csv(taxo_table_species, "./output_data/taxo_table_species_fornotuniqueSpecies.csv") -->
<!-- ``` -->
<!-- Taxonomy table at ASV rank for not unique species. -->
<!-- ```{r} -->
<!-- taxo_table <- rowData(tse) %>% as.data.frame() -->
<!-- taxo_table$ASV <- rownames(taxo_table) -->
<!-- freq <- taxo_table |> -->
<!-- group_by(Species) |> -->
<!-- summarise(nb = n()) -->
<!-- taxo_table <- dplyr::left_join(taxo_table, freq, -->
<!-- join_by(Species == Species)) -->
<!-- taxo_table <- taxo_table |> -->
<!-- filter(nb > 2) |> -->
<!-- arrange(nb, Species) -->
<!-- write_csv(taxo_table, "./output_data/taxo_table_ASV_fornotuniqueSpecies.csv") -->
<!-- ``` -->
<!-- We performed a new affiliation given the sequence because of NA values at each taxonomic rank. -->
<!-- ```{r} -->
<!-- table(taxonomyRankEmpty(tse, rank = "Species")) -->
<!-- rowData(tse)[index, "Kingdom"] <- "Fungi" -->
<!-- rowData(tse)[index, "Phylum"] <- "Basidiomycota" -->
<!-- rowData(tse)[index, "Class"] <- "Microbotryomycetes" -->
<!-- rowData(tse)[index, "Order"] <- "Sporidiobolales" -->
<!-- rowData(tse)[index, "Family"] <- "Sporidiobolaceae" -->
<!-- rowData(tse)[index, "Genus"] <- "Sporobolomyces" -->
<!-- rowData(tse)[index, "Species"] <- "Sporobolomyces roseus" -->
<!-- cbind(sequence = rownames(rowData(tse)[index,]), rowData(tse)[index,]) |> -->
<!-- as_tibble() |> -->
<!-- datatable() -->
<!-- ``` -->
<!-- ```{r} -->
<!-- index <- which(rowData(tse)$Phylum == "c(\"Basidiomycota\", \"Basidiomycota\")") -->
<!-- rowData(tse)[index, ] -->
<!-- rowData(tse)[index, "Kingdom"] <- "Fungi" -->
<!-- rowData(tse)[index, "Phylum"] <- "Basidiomycota" -->
<!-- rowData(tse)[index, "Class"] <- "Tremellomycetes" -->
<!-- rowData(tse)[index, "Order"] <- "Tremellales" -->
<!-- rowData(tse)[index, "Family"] <- "Bulleribasidiaceae" -->
<!-- rowData(tse)[index, "Genus"] <- "Vishniacozyma" -->
<!-- rowData(tse)[index, "Species"] <- "Vishniacozyma_sp" -->
<!-- cbind(sequence = rownames(rowData(tse)[index,]), rowData(tse)[index,]) |> -->
<!-- as_tibble() |> -->
<!-- datatable() -->
<!-- ``` -->
<!-- C'est Bizarre. Il faudrait corriger -->
<!-- ```{r} -->
<!-- index <- which(rowData(tse)$Phylum == "Basidiomycota_sp") -->
<!-- rowData(tse)[index, ] -->
<!-- ``` -->
## Analyses by year
We analyzed separatly each year.
**Year 2023**
::: {.cell}
```{.r .cell-code}
# separate tse per year
tse_2023 <- tse_species[, tse_species$Year =="2023"]
tse_2023
```
::: {.cell-output .cell-output-stdout}
```
class: TreeSummarizedExperiment
dim: 409 102
metadata(1): agglomerated_by_rank
assays(1): counts
rownames(409): Acanthophysium_bisporum Acaromyces_ingoldii ...
Zygosporium_pseudogibbum Zymoseptoria_brevis
rowData names(7): Kingdom Phylum ... Genus Species
colnames(102): 2023-OC01-1-B 2023-OC01-2-B ... 2023-OC09-1-B
2023-OC09-2-B
colData names(15): Type Variety_name ... Plot Plot_2
```
:::
::: {.cell-output .cell-output-stdout}
```
reducedDimNames(0):
mainExpName: NULL
```
:::
::: {.cell-output .cell-output-stdout}
```
altExpNames(0):
rowLinks: a LinkDataFrame (409 rows)
rowTree: 1 phylo tree(s) (409 leaves)
colLinks: NULL
colTree: NULL
referenceSeq: a DNAStringSet (409 sequences)
```
:::
:::
Remove taxa with no counts
::: {.cell}
```{.r .cell-code}
tse_2023 <- tse_2023[ , colSums(assay(tse_2023, "counts")) != 0 ]
```
:::
Remove rare taxa with prevalence < 0.2
::: {.cell}
```{.r .cell-code}
# get rare taxa
# getRare(tse_2023, prevalence = 0.01) |>
# head()
tse_2023 <- subsetByPrevalent(tse_2023, prevalence = 0.2, detection = 0)
```
:::
::: {.cell}
```{.r .cell-code}
colData(tse_2023)$SampleName_short <- str_remove(colData(tse_2023)$SampleName, "2023-")
```
:::
::: {.cell}
```{.r .cell-code}
# Calculate summary tables
summary(tse_2023, assay.type = "counts")
```
::: {.cell-output .cell-output-stdout}
```
$samples
# A tibble: 1 × 6
total_counts min_counts max_counts median_counts mean_counts stdev_counts
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 9312353 44948 132792 91773 91298. 14976.
$features
# A tibble: 1 × 3
total singletons per_sample_avg
<int> <int> <dbl>
1 362 0 240.
```
:::
:::
**Year 2024**
::: {.cell}
```{.r .cell-code}
tse_2024 <- tse_species[, tse_species$Year =="2024"]
tse_2024
```
::: {.cell-output .cell-output-stdout}
```
class: TreeSummarizedExperiment
dim: 409 108
metadata(1): agglomerated_by_rank
assays(1): counts
rownames(409): Acanthophysium_bisporum Acaromyces_ingoldii ...
Zygosporium_pseudogibbum Zymoseptoria_brevis
rowData names(7): Kingdom Phylum ... Genus Species
colnames(108): 2024-OC06-1-B 2024-OC06-2-B ... 2024-OC09-2-B
2024-OC09-3-B
colData names(15): Type Variety_name ... Plot Plot_2
```
:::
::: {.cell-output .cell-output-stdout}
```
reducedDimNames(0):
mainExpName: NULL
```
:::
::: {.cell-output .cell-output-stdout}
```
altExpNames(0):
rowLinks: a LinkDataFrame (409 rows)
rowTree: 1 phylo tree(s) (409 leaves)
colLinks: NULL
colTree: NULL
referenceSeq: a DNAStringSet (409 sequences)
```
:::
:::
Remove taxa with no counts
::: {.cell}
```{.r .cell-code}
tse_2024 <- tse_2024[ , colSums(assay(tse_2024, "counts")) != 0 ]
```
:::
Get rare taxa with prevalence < 0.2
::: {.cell}
```{.r .cell-code}
# get rare taxa
# getRare(tse_2024, prevalence = 0.01) |>
# head()
tse_2024 <- subsetByPrevalent(tse_2024, prevalence = 0.2, detection = 0)
```
:::
::: {.cell}
```{.r .cell-code}
colData(tse_2024)$SampleName_short <- str_remove(colData(tse_2024)$SampleName, "2024-")
```
:::
::: {.cell}
```{.r .cell-code}
# Calculate summary tables
summary(tse_2024, assay.type = "counts")
```
::: {.cell-output .cell-output-stdout}
```
$samples
# A tibble: 1 × 6
total_counts min_counts max_counts median_counts mean_counts stdev_counts
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 6266132 40533 127883 56244. 58020. 13300.
$features
# A tibble: 1 × 3
total singletons per_sample_avg
<int> <int> <dbl>
1 306 0 177.
```
:::
:::
<!-- ```{r} -->
<!-- prev <- getPrevalent(tse, rank = "Genus", prevalence = 0.2, detection = 0) -->
<!-- prev |> head() -->
<!-- ``` -->
## Barplot of the total number of reads per sample by year
::: {.cell}
```{.r .cell-code}
colData(tse_2023)$nbtotal <- colSums(assay(tse_2023, "counts"))
colData(tse_2024)$nbtotal <- colSums(assay(tse_2024, "counts"))
```
:::
::: {.cell}
```{.r .cell-code}
tmp2023 <- colData(tse_2023) %>%
as_tibble() %>%
select(Variety_name, treatment, locality, SampleName_short, nbtotal)
tmp2024 <- colData(tse_2024) %>%
as_tibble() %>%
select(Variety_name, treatment, locality, SampleName_short, nbtotal)
tmp_paired <- dplyr::full_join(tmp2023, tmp2024,
by = join_by(SampleName_short == SampleName_short),
suffix = c(".2023", ".2024"))
tmp_paired_nbtotaldiff <- tmp_paired$nbtotal.2023 - tmp_paired$nbtotal.2024
```
:::
We observed a difference of sequence depth in median as {r median(tmp_paired_nbtotaldiff)} reads between the two years, based on paired samples.
::: {.cell}
```{.r .cell-code}
p1 <- ggplot(colData(tse_2023), aes(x = SampleName, y = nbtotal, fill = locality)) +
geom_col() +
facet_grid(~ Year + Variety_type + locality + treatment, scales = "free_x", space = "free") +
theme(axis.text.x = element_text(size = 6, hjust = 1, angle=90)) +
theme(legend.position="top")
p2 <- ggplot(colData(tse_2024), aes(x = SampleName, y = nbtotal, fill = locality)) +
geom_col() +
facet_grid(~ Year + Variety_type + locality + treatment, scales = "free_x", space = "free") +
theme(axis.text.x = element_text(size = 6, hjust = 1, angle=90)) +
theme(legend.position="none")
p1 / p2
```
::: {.cell-output-display}
{width=960}
:::
:::
## heatmap
Produce heatmap on normalized abundances using clr transformation. Rows and columns were clustered using euclidean distance and average aggregation method.
::: panel-tabset
### Year 2023
::: {.cell}
```{.r .cell-code}
#calculate clr normalized counts
tse_2023 <- transformAssay(
x = tse_2023,
assay.type = "counts",
method = "clr",
pseudocount = TRUE,
name = "clr"
)
# access clr normalized counts
#assay(tse_2023, "clr") |> head()
```
:::
::: {.cell}
```{.r .cell-code}
# heatmap options and annotations
# faster hclust
ht_opt$fast_hclust = TRUE
ht_opt$message = FALSE
# colors for column annotation
year_palette <- c(
"2023" = "#B0CBE7FF",
"2024" = "#5D74A5FF"
)
variety_type_palette <- c(
"resistant" = "#8EBACDFF",
"conventional" = "#246893FF",
"mediterraneen" = "#163274FF"
)
treatment_palette <- c(
"none" = "#FEF7C7FF",
"bio" = "#88B560FF",
"bas-intrants" = "#D89873FF",
"conventional" = "#803342FF"
)
locality_palette <- c(
"Pech Rouge" = "#F5C762FF",
"Cazes" = "#F8A856FF",
"Chapitre" = "#F5894CFF",
"Vassal" = "#DF5B47FF"
)
# column annotation
anno_df = data.frame(
year = colData(tse_2023)$Year,
variety_type = colData(tse_2023)$Variety_type,
treatment = colData(tse_2023)$treatment,
locality = colData(tse_2023)$locality
)
column_ha = HeatmapAnnotation(df = anno_df,
col = list(
year = year_palette,
variety_type = variety_type_palette,
treatment = treatment_palette,
locality = locality_palette)
)
# Defined a large set of colors from RColorBrewer package
library(RColorBrewer)
qual_col_pals <- brewer.pal.info[brewer.pal.info$category == 'qual',]
col_vector <- unlist(mapply(brewer.pal, qual_col_pals$maxcolors, rownames(qual_col_pals)))
#pie(rep(1,n), col=sample(col_vector, n))
# colors for row annotation
n <- length(unique(rowData(tse_2023)[, "Phylum"]))
rowphylum <- col_vector[1:n]
names(rowphylum) <- unique(rowData(tse_2023)[, "Phylum"])
# rows annotation
row_ha = HeatmapAnnotation(
name = "Phylum",
phylum = rowData(tse_2023)[, "Phylum"],
col = list(phylum = rowphylum),
which = "row"
)
# cell colors
# custom_colors <- colorRampPalette(c("skyblue", "white", "red"))
```
:::
::: {.cell}
```{.r .cell-code}
ht <- Heatmap(
assay(tse_2023, "clr"),
name = "clr(Abund.)",
# col = custom_colors(1000),
row_title = "Species",
column_title = "Samples",
clustering_distance_rows = "euclidean",
clustering_distance_columns = "euclidean",
clustering_method_columns = "average",
clustering_method_rows = "average",
cluster_columns = TRUE,
# row_split = nbclusters,
row_dend_reorder = TRUE,
# top_annotation = col_ha,
top_annotation = column_ha,
right_annotation = row_ha,
# row_names_gp = gpar(fontsize = 7),
show_column_names = FALSE,
show_row_names = FALSE,
use_raster = TRUE
)
draw(ht, merge_legend = TRUE)
```
::: {.cell-output-display}
{width=960}
:::
:::
### Year 2024
::: {.cell}
```{.r .cell-code}
#calculate clr normalized counts
tse_2024 <- transformAssay(
x = tse_2024,
assay.type = "counts",
method = "clr",
pseudocount = TRUE,
name = "clr"
)
# access clr normalized counts
#assay(tse_2024, "clr") |> head()
```
:::
::: {.cell}
```{.r .cell-code}
# heatmap options and annotations
# faster hclust
ht_opt$fast_hclust = TRUE
ht_opt$message = FALSE
# colors for column annotation
year_palette <- c(
"2023" = "#B0CBE7FF",
"2024" = "#5D74A5FF"
)
variety_type_palette <- c(
"resistant" = "#8EBACDFF",
"conventional" = "#246893FF",
"mediterraneen" = "#163274FF"
)
treatment_palette <- c(
"none" = "#FEF7C7FF",
"bio" = "#88B560FF",
"bas-intrants" = "#D89873FF",
"conventional" = "#803342FF"
)
locality_palette <- c(
"Pech Rouge" = "#F5C762FF",
"Cazes" = "#F8A856FF",
"Chapitre" = "#F5894CFF",
"Vassal" = "#DF5B47FF"
)
# column annotation
anno_df = data.frame(
year = colData(tse_2024)$Year,
variety_type = colData(tse_2024)$Variety_type,
treatment = colData(tse_2024)$treatment,
locality = colData(tse_2024)$locality
)
column_ha = HeatmapAnnotation(df = anno_df,
col = list(
year = year_palette,
variety_type = variety_type_palette,
treatment = treatment_palette,
locality = locality_palette)
)
# Defined a large set of colors from RColorBrewer package
library(RColorBrewer)
qual_col_pals <- brewer.pal.info[brewer.pal.info$category == 'qual',]
col_vector <- unlist(mapply(brewer.pal, qual_col_pals$maxcolors, rownames(qual_col_pals)))
#pie(rep(1,n), col=sample(col_vector, n))
# colors for row annotation
n <- length(unique(rowData(tse_2024)[, "Phylum"]))
rowphylum <- col_vector[1:n]
names(rowphylum) <- unique(rowData(tse_2024)[, "Phylum"])
# rows annotation
row_ha = HeatmapAnnotation(
name = "Phylum",
phylum = rowData(tse_2024)[, "Phylum"],
col = list(phylum = rowphylum),
which = "row"
)
# cell colors
# custom_colors <- colorRampPalette(c("skyblue", "white", "red"))
```
:::
::: {.cell}
```{.r .cell-code}
ht <- Heatmap(
assay(tse_2024, "clr"),
name = "clr(Abund.)",
# col = custom_colors(1000),
row_title = "Species",
column_title = "Samples",
clustering_distance_rows = "euclidean",
clustering_distance_columns = "euclidean",
clustering_method_columns = "average",
clustering_method_rows = "average",
cluster_columns = TRUE,
# row_split = nbclusters,
row_dend_reorder = TRUE,
# top_annotation = col_ha,
top_annotation = column_ha,
right_annotation = row_ha,
# row_names_gp = gpar(fontsize = 7),
show_column_names = FALSE,
show_row_names = FALSE,
use_raster = TRUE
)
draw(ht, merge_legend = TRUE)
```
::: {.cell-output-display}
{width=960}
:::
:::
:::
## References
## Computing information
::: panel-tabset
### save tse objects
::: {.cell}
```{.r .cell-code}
write_rds(tse_2023, "./output_data/tse_2023.rds")
write_rds(tse_2024, "./output_data/tse_2024.rds")
```
:::
### Session info
::: {.cell}
```{.r .cell-code}
sessioninfo::session_info(pkgs = "attached")
```
::: {.cell-output .cell-output-stdout}
```
─ Session info ───────────────────────────────────────────────────────────────
setting value
version R version 4.6.0 (2026-04-24)
os Ubuntu 24.04.4 LTS
system x86_64, linux-gnu
ui X11
language (EN)
collate fr_FR.UTF-8
ctype fr_FR.UTF-8
tz Europe/Paris
date 2026-06-04
pandoc 3.8.3 @ /usr/lib/rstudio/resources/app/bin/quarto/bin/tools/x86_64/ (via rmarkdown)
quarto 1.9.38 @ /usr/local/bin/quarto
─ Packages ───────────────────────────────────────────────────────────────────
package * version date (UTC) lib source
Biobase * 2.72.0 2026-04-28 [1] Bioconductor 3.23 (R 4.6.0)
BiocGenerics * 0.58.1 2026-05-14 [1] Bioconductor 3.23 (R 4.6.0)
Biostrings * 2.80.1 2026-05-22 [1] Bioconductor 3.23 (R 4.6.0)
ComplexHeatmap * 2.28.0 2026-04-28 [1] Bioconductor 3.23 (R 4.6.0)
data.table * 1.18.4 2026-05-06 [1] CRAN (R 4.6.0)
dplyr * 1.2.1 2026-04-03 [1] CRAN (R 4.6.0)
DT * 0.34.0 2025-09-02 [1] CRAN (R 4.6.0)
fastcluster * 1.3.0 2025-05-07 [1] CRAN (R 4.6.0)
forcats * 1.0.1 2025-09-25 [1] CRAN (R 4.6.0)
generics * 0.1.4 2025-05-09 [1] CRAN (R 4.6.0)
GenomicRanges * 1.64.0 2026-04-28 [1] Bioconductor 3.23 (R 4.6.0)
ggplot2 * 4.0.3 2026-04-22 [1] CRAN (R 4.6.0)
ggraph * 2.2.2 2025-08-24 [1] CRAN (R 4.6.0)
igraph * 2.3.1 2026-05-04 [1] CRAN (R 4.6.0)
InraeThemes * 3.1.0 2026-05-20 [1] Github (davidcarayon/InraeThemes@0564f7d)
IRanges * 2.46.0 2026-04-28 [1] Bioconductor 3.23 (R 4.6.0)
kableExtra * 1.4.0 2024-01-24 [1] CRAN (R 4.6.0)
lubridate * 1.9.5 2026-02-04 [1] CRAN (R 4.6.0)
MatrixGenerics * 1.24.0 2026-04-28 [1] Bioconductor 3.23 (R 4.6.0)
matrixStats * 1.5.0 2025-01-07 [1] CRAN (R 4.6.0)
mia * 1.20.0 2026-04-28 [1] Bioconductor 3.23 (R 4.6.0)
miaViz * 1.20.0 2026-04-28 [1] Bioconductor 3.23 (R 4.6.0)
microViz * 0.13.1 2026-05-26 [1] Github (david-barnett/microViz@b35bee4)
MultiAssayExperiment * 1.38.0 2026-04-28 [1] Bioconductor 3.23 (R 4.6.0)
openxlsx * 4.2.8.1 2025-10-31 [1] CRAN (R 4.6.0)
paletteer * 1.7.0 2026-01-08 [1] CRAN (R 4.6.0)
patchwork * 1.3.2 2025-08-25 [1] CRAN (R 4.6.0)
phyloseq * 1.56.0 2026-04-28 [1] Bioconductor 3.23 (R 4.6.0)
phyloseq.extended * 0.1.5 2026-05-05 [1] Github (mahendra-mariadassou/phyloseq-extended@d59e472)
purrr * 1.2.2 2026-04-10 [1] CRAN (R 4.6.0)
RColorBrewer * 1.1-3 2022-04-03 [1] CRAN (R 4.6.0)
readr * 2.2.0 2026-02-19 [1] CRAN (R 4.6.0)
S4Vectors * 0.50.1 2026-05-13 [1] Bioconductor 3.23 (R 4.6.0)
Seqinfo * 1.2.0 2026-04-28 [1] Bioconductor 3.23 (R 4.6.0)
SingleCellExperiment * 1.34.0 2026-04-28 [1] Bioconductor 3.23 (R 4.6.0)
stringr * 1.6.0 2025-11-04 [1] CRAN (R 4.6.0)
SummarizedExperiment * 1.42.0 2026-04-28 [1] Bioconductor 3.23 (R 4.6.0)
tibble * 3.3.1 2026-01-11 [1] CRAN (R 4.6.0)
tidygraph * 1.3.1 2024-01-30 [1] CRAN (R 4.6.0)
tidyr * 1.3.2 2025-12-19 [1] CRAN (R 4.6.0)
tidyverse * 2.0.0 2023-02-22 [1] CRAN (R 4.6.0)
TreeSummarizedExperiment * 2.20.0 2026-04-28 [1] Bioconductor 3.23 (R 4.6.0)
XVector * 0.52.0 2026-04-28 [1] Bioconductor 3.23 (R 4.6.0)
[1] /home/chennequet/R/x86_64-pc-linux-gnu-library/4.6
[2] /usr/local/lib/R/site-library
[3] /usr/lib/R/site-library
[4] /usr/lib/R/library
* ── Packages attached to the search path.
──────────────────────────────────────────────────────────────────────────────
```
:::
:::
:::
## Infer network with Poisson LogNormal model
We used these TreeSummarizedExperiment objects (tse) @TreeSummarizedExperiment at species taxonomic rank. The Poisson LogNormal model (PLN model) @PLNmodels was performed to infer network for each year separately. The best model was chosen with StARS criterion applied to PLN model.
::: {.cell}
```{.r .cell-code}
years <- c(2023, 2024)
```
:::
The PLN model is design to handle counts data. It is defined as follows :
$$ Y_{ij} | Z_{ij} \sim \mathcal{P}(\text{exp}(Z_{ij})), \quad Z_i \sim \mathcal{N}(o_i + X_i^T B, \Omega^{-1}) \quad \text{with} \quad ||\Omega||_{1,0} \leq c $$
PLN-network with offsets (vector $o_i$ corresponds to the total reads in sample i). Here, no covariate was included in the model. Inference in PLN-network focuses on the regression parameters $B$ and the inverse covariance $\Omega$.
<!-- Mind to activate or not eval -->
Report analyses
- [2023](./html/PLN_model_2023.html)
- [2024](./html/PLN_model_2024.html)
## Analysis and visualisation of networks.
We used tidygraph @tidygraph and igraph @igraph R packages to analyse and visualise networks.
::: {.cell}
```{.r .cell-code}
years <- c(2023, 2024)
```
:::
<!-- Mind to activate or not eval -->
Report analyses
- [2023](./html/Graph_static_PLN_2023.html)
- [2024](./html/Graph_static_PLN_2024.html)
Export of the association edges in xlsx format:
- [2023](./output_data/PLNnet_2023_network_interaction_edges.xlsx)
- [2024](./output_data/PLNnet_2024_network_interaction_edges.xlsx)
Export of the nodes informations involved in the association edges in xlsx format:
- [2023](./output_data/PLNnet_2023_network_interaction_nodes.xlsx)
- [2024](./output_data/PLNnet_2024_network_interaction_nodes.xlsx)
Export of graph in graphML format:
- [2023](./output_data/PLNnet_2023_network.gml)
- [2024](./output_data/PLNnet_2024_network.gml)
# Biostatistics based on kmer
We decided to not perform these network analyses as it will be difficult to interpret the results (2026/04/27).
<!-- # References -->
<!-- # Downloads -->
<!-- # Session info -->
<!-- ```{r} -->
<!-- sessioninfo::session_info(pkgs = "attached") -->
<!-- ``` -->