DEG vers Insights Fonctionnels : Un Workflow clusterProfiler Pratique (avec un Squelette de Script R)

Un tableau d'expressions différentielles (DEG) est un point de départ utile, mais ce n'est que rarement la fin de l'histoire. La plupart des gens se heurtent à la même question suivante : que signifient ces changements au niveau des gènes en ce qui concerne les voies et les fonctions biologiques ? C'est là qu'intervient l'analyse d'enrichissement fonctionnel.

Ce guide de style ressource présente un flux de travail complet et répétable en R : QC → normalisation → expression différentielle → enrichment (ORA et GSEA) → visualisation, en utilisant clusterProfiler (un package R de Bioconductor) pour l'enrichissement et les graphiques adaptés à l'enrichissement. Il est rédigé de manière à ce que vous puissiez copier la structure dans votre propre carnet d'analyse ou l'adapter en un petit script. Vous trouverez également un squelette de script R compact près de la fin.

En cours de route, nous nous concentrerons sur les détails pratiques qui ont tendance à être les plus importants dans les projets réels : les formats d'entrée, les identifiants de gènes, l'univers génétique de référence, comment choisir entre l'ORA et la GSEA, et comment réaliser les trois graphiques que les gens utilisent réellement (volcan + bar + point).

Si vous hésitez encore sur la manière de définir les seuils, d'interpréter le log2FC et le FDR, ou de structurer votre tableau de DEG pour une analyse ultérieure, vous pourriez trouver cet aperçu de l'expression différentielle utile : Analyse de l'expression génique différentielle.

End-to-end steps from QC and normalization through differential expression, enrichment (ORA/GSEA), and visualization.Aperçu du flux de travail du pipeline d'enrichissement DEG basé sur clusterProfiler.

Ce que vous produirez (Résultats)

Une fois que vous aurez terminé ce flux de travail, vous devriez avoir un petit ensemble de résultats faciles à réutiliser et à partager :

  • Une table DEG avec au moins :
    • ID de gène (votre ID d'origine et un ID mappé)
    • log2ChangementDePli
    • valeur p
    • padj (valeur p ajustée par FDR)
    • stat optionnel (utile pour le classement dans GSEA)
  • Tableaux de résultats d'enrichissement (compatible CSV) pour :
    • enrichissement GO (par exemple, Processus Biologique)
    • Enrichissement KEGG (optionnel, selon l'organisme et les identifiants)
    • Résultats GSEA (optionnel mais recommandé lorsque vous préférez une analyse basée sur le classement)
  • Trois figures clés
    1. Graphique en volcan (aperçu DE)
    2. Diagramme à barres d'enrichissement (Principaux termes, aperçu rapide)
    3. Graphique d'enrichissement en points/bulles (résumé compact des termes)
  • Un "squelette de script" réutilisable cela :
    • lit les entrées
    • exécute DE (ou charge les résultats DEG)
    • exécute l'enrichissement
    • exporte des tableaux et des graphiques dans des dossiers prévisibles

Si vous rédigez un article de blog de style méthode ou un SOP interne, ces résultats s'intègrent parfaitement à une structure de dossier simple :

  • tables/ (DEG + enrichissement)
  • tracés/ (volcan + barre + point)
  • logs/ (informations de session optionnelles, notes de fonctionnement)

Entrées et configuration (Données, Identifiants, Paquets)

Deux points de départ courants

Option A : Commencer par les comptes (recommandé)

Vous avez :

  • une matrice de comptage brute (gènes × échantillons, comptages entiers)
  • un tableau de métadonnées d'exemple (identifiants d'échantillon + condition + covariables optionnelles)

C'est l'itinéraire le plus propre car vous contrôlez l'ensemble de la chaîne.

Option B : Commencer à partir d'un tableau DEG (le plus rapide)

Vous avez déjà des résultats de DESeq2/edgeR/limma :

  • ID de gène
  • log2FC
  • valeur p et/ou FDR

C'est bien pour l'enrichissement tant que la table DEG est bien formée et que vous pouvez reconstruire un classement pour GSEA si vous le souhaitez.

Identifiants de gènes : décidez tôt, épargnez-vous plus tard

Dans les flux de travail d'enrichissement, le moment le plus courant de "pourquoi est-ce vide ?" est un décalage d'ID.

Identifiants typiques que vous verrez :

  • SYMBOLE (par exemple, TP53)
  • ENSEMBLE (par exemple, ENSG00000141510)
  • ENTREZID (par exemple, 7157)

clusterProfiler peut fonctionner avec plusieurs types, mais de nombreux flux de travail GO/KEGG sont plus simples si vous convertissez en ENTREZID pour l'enrichissement. L'approche pratique est :

  1. Conservez votre identifiant de gène original dans le tableau DEG (pour la traçabilité).
  2. Créer un tableau de correspondance (original → ENTREZID).
  3. Exécutez l'enrichissement en utilisant l'ENTREZID.
  4. Exportez à la fois les résultats d'enrichissement et le tableau de correspondance.

Cette table de correspondance devient votre "colle" lorsque vous devez interpréter des résultats ou établir des listes de gènes pour une analyse ultérieure.

Paquets minimaux dont vous aurez probablement besoin

Une pile stable et courante ressemble à ceci :

  • Expression différentielleDESeq2 (ou edgeR/limma-voom)
  • Enrichissement: clusterProfiler
  • Annotation: org.Hs.eg.db / org.Mm.eg.db / etc + AnnotationDbi
  • Visualisation: ggplot2
  • Graphiques d'enrichissement: enrichplot (fonctionne parfaitement avec les résultats de clusterProfiler)

Remarque : la disponibilité et le comportement de KEGG peuvent varier selon l'organisme et la manière dont les identifiants sont gérés. Si vous travaillez avec une espèce moins courante, GO peut être plus simple que KEGG, à moins que vous ne disposiez d'un bon soutien en annotation.

Étape 1 — QC (Avant de faire confiance à DEG)

Le contrôle qualité ne doit pas être compliqué, mais il doit être intentionnel. L'objectif est simple : assurez-vous que vos échantillons se comportent comme votre conception d'étude l'attend.

Trois vérifications couvrent beaucoup de terrain :

1) Échantillonnage de regroupement / corrélation

  • Calculez la corrélation d'échantillon à échantillon sur une matrice d'expression stabilisée (par exemple, VST de DESeq2).
  • Cherchez :
    • les répliques se regroupent
    • paires inattendues
    • un échantillon qui "refuse de rejoindre le groupe"

2) ACP (ou MDS)

L'ACP est rapide, visuelle et généralement informative.

  • Coloriez les points par condition, lot, donneur, date de préparation de la bibliothèque—quoi que vous ayez.
  • Si un facteur indésirable domine les premières composantes, ne l'ignorez pas. Souvent, la solution consiste à ajouter un covarié à la formule de conception DE plutôt qu'à supprimer des échantillons.

Sample clustering pattern showing separation by condition and overall similarity among replicates.Visualisation de contrôle qualité des échantillons basée sur l'ACP.

3) Vérifications de la taille de la bibliothèque / de la distribution

  • Comptes totaux par échantillon
  • Distribution des comptes / nombre de gènes détectés

De petites différences sont normales. De grandes différences peuvent être un signe de problèmes techniques.

Une note pratique sur les valeurs aberrantes :

Si vous retirez un échantillon, notez-le. pourquoi En une phrase, et gardez une trace. Même pour un travail interne, votre futur vous vous en sera reconnaissant.

Étape 2 — Normalisation (Pour l'expression différentielle)

La normalisation est l'un de ces mots qui signifie des choses différentes selon les contextes.

Pour l'expression différentielle, la plupart des méthodes établies s'attendent à des comptes bruts et effectuent la normalisation dans le cadre du modèle :

  • DESeq2 utilise des facteurs de taille.
  • edgeR utilise TMM
  • limma-voom utilise des poids de précision (après transformation des comptages)

Un détour fréquent consiste à utiliser TPM/FPKM pour l'analyse de l'expression différentielle (DE). Le TPM est utile pour certains types de comparaisons, mais pour l'analyse DE basée sur les comptes, il soulève généralement plus de questions qu'il n'apporte de réponses. Si votre objectif est un test différentiel fiable, restez dans la voie basée sur les comptes.

Filtrage des gènes à faible nombre de comptes

Un certain filtrage est utile :

  • supprimer les gènes qui sont essentiellement absents dans tous les échantillons
  • utiliser une règle indépendante des étiquettes de condition (par exemple, "au moins X occurrences dans au moins Y échantillons")

Le filtrage améliore la puissance et réduit le bruit, en particulier dans les petites études.

Étape 3 — Expression différentielle (Générer un tableau DEG)

Votre table DEG est le point de pivot entre les statistiques au niveau des gènes et l'enrichissement. Une "bonne" table DEG pour l'enrichissement en aval comprend :

  • une colonne d'ID de gène stable (gène, SYMBOLE ou ENSEMBL)
  • log2ChangementDePli
  • valeur p
  • padj (FDR)
  • optionnel : une statistique de test (stat) pour le classement

Seuils : gardez-les utilisables, pas dogmatiques

Un point de départ commun est :

  • padj < 0,05
  • optionnellement |log2FC| >= 1

Mais de nombreuses analyses bénéficient d'une certaine flexibilité :

  • Pour ORA, les seuils sont importants car vous sélectionnez un sous-ensemble de gènes.
  • Pour GSEA, les seuils importent moins car vous utilisez une liste classée de tous les gènes.

Si vous savez que votre signal est subtil (ou que votre taille d'échantillon est modeste), envisagez de vous appuyer davantage sur une GSEA basée sur le classement plutôt que d'essayer de "forcer" une grande liste de DEG.

Divisé en haut et en bas ?

Pour ORA, il est souvent utile de réaliser l'enrichissement séparément pour :

  • gènes régulés à la hausse
  • gènes régulés à la baisse

Cela maintient la clarté de la directionnalité. Sinon, vous pouvez vous retrouver avec un ensemble de gènes mélangé où un terme est "enrichi" mais les gènes qui le composent se déplacent dans les deux directions.

Étape 4 — Enrichissement avec clusterProfiler (ORA & GSEA)

C'est le cœur du guide. clusterProfiler prend en charge plusieurs approches d'enrichissement, mais deux sont particulièrement courantes pour RNA-seq interprétation :

  • ORA (Analyse de Sur-Représentation): Qu'est-ce qui est surreprésenté parmi les gènes significatifs ?
  • GSEA (Analyse d'enrichissement des ensembles de gènes): Quels parcours se déplacent dans l'ensemble de la liste classée ?

ORA : enrichGO / enrichKEGG

Entrées dont vous avez besoin

  • Une liste de gènes (généralement des gènes exprimés différemment significatifs, éventuellement divisée en gènes régulés à la hausse/à la baisse)
  • Un univers de fond (fortement recommandé)

À propos de l'univers (ensemble de gènes de fond)

Si vous ne définissez pas un univers, votre enrichissement est souvent comparé à un large fond par défaut provenant de la base de données d'annotation. Dans de nombreux cas, un univers plus pratique et défendable est :

  • Univers = tous les gènes qui ont été testés dans l'expression différentielle.
    (c'est-à-dire, après filtrage et configuration du modèle)

Cela aligne le fond d'enrichissement avec ce que votre expérience pourrait détecter de manière réaliste.

Enrichissement GO (point de départ recommandé)

  • GO a trois ontologies communes : BP, MF, CC.
  • Le processus biologique (BP) est souvent le plus intuitif pour une interprétation initiale.

Enrichissement KEGG (optionnel)

KEGG peut être très utile, mais c'est aussi là que les problèmes d'ID et d'organisme apparaissent plus souvent. Si KEGG renvoie des résultats vides :

  • confirmez vos identifiants (l'ENTREZID est généralement attendu)
  • confirmer le soutien aux organismes
  • essayez GO d'abord pour valider que le pipeline fonctionne

GSEA : gseGO / gseKEGG

GSEA modifie la question. Au lieu de sélectionner un "sous-ensemble de gènes significatifs", vous classez tous les gènes selon une statistique et vous demandez si les gènes d'une voie ont tendance à apparaître près du haut ou du bas.

Ce dont vous avez besoin pour GSEA

  • un vecteur numérique nommé :
    • les noms sont des identifiants de gènes (souvent ENTREZID)
    • les valeurs sont des statistiques de classement (plus élevé = plus associé à la condition A, par exemple)
  • trié par ordre décroissant

Classement des choix faciles à expliquer

  • Statistique de Wald DESeq2 (stat) si disponible
  • signé -log10(valeur p) mis à l'échelle par direction :
    • signe(log2FC) * -log10(valeur_p)

Si vous choisissez l'approche des valeurs p signées, protégez-vous contre les zéros et les NA (par exemple, fixez les valeurs p à un minimum comme 1e-300).

Étape 5 — Visualisation (Volcan / Barres / Points)

Ce flux de travail se concentre intentionnellement sur trois graphiques car ils couvrent la plupart des besoins sans transformer votre rédaction en un musée de figures.

Graphique en volcan (aperçu DE)

Un graphique en volcan montre :

  • magnitude (log2FC)
  • signification (souvent -log10(padj))

Bonnes habitudes :

  • étiqueter uniquement une poignée de gènes (meilleurs résultats ou marqueurs connus)
  • garder les seuils visibles mais pas écrasants

Volcano plot summarizing differential expression results.Graphique en volcan résumant les résultats de l'expression différentielle.

Diagramme à barres d'enrichissement (Termes principaux)

Utilisez des diagrammes à barres pour montrer une courte liste des termes les plus enrichis. Restez concis :

  • 10 à 20 termes suffisent généralement.
  • trier par p.adjust sauf si vous avez une raison claire de ne pas le faire

Graphique d'enrichissement en points/bulles (résumé compact)

Les dotplots sont un excellent résumé en "un seul panneau" :

  • couleur : signification (p.adjust)
  • taille : Compte ou GeneRatio

Si vous publiez des dotplots, veillez à ce que la légende soit lisible et évitez de montrer trop de termes.

Functional categories compared by enrichment magnitude and statistical significance using dot size and color. Diagramme à points résumant les termes fonctionnels enrichis avec un encodage par taille et couleur.

Choix clés et pièges courants (Liste de contrôle)

Cette section est destinée à être une liste de contrôle rapide "avant d'exporter les résultats".

1) Qualité de la cartographie des identifiants

  • Combien de gènes ont été cartographiés avec succès ?
  • Y a-t-il des doublons (mapping plusieurs-à-un) ?
  • Avez-vous laissé tomber une grande fraction par inadvertance ?

Astuce : exportez un tableau de correspondance et conservez-le avec vos résultats. Cela évite la confusion par la suite.

2) Univers de fond dans ORA

Si les résultats d'ORA semblent étranges (trop larges, trop vides, trop génériques), revoyez l'univers.

Un défaut pratique :

  • univers = gènes testés dans DE

3) Choix entre ORA et GSEA

  • ORA est sensible aux seuils.
  • GSEA est sensible à la définition du classement.

Si vous n'êtes pas satisfait des résultats d'ORA, essayez GSEA avant de réécrire vos seuils cinq fois.

Trop de termes GO similaires

GO est par nature hiérarchique et redondant. Si vos meilleurs résultats ressemblent à des répétitions :

  • réduire le nombre de catégories affichées
  • considérer la réduction de la redondance (par exemple, la simplification basée sur la similarité sémantique)
  • regrouper les résultats par thème plutôt que de lister 40 quasi-doublons

"Résultats KEGG vides"

Raisons courantes :

  • type d'identifiant incorrect
  • problèmes de soutien aux organismes
  • trop peu de gènes (ORA)
    Essaye :
  • confirmation de la cartographie ENTREZID
  • exécution d'abord l'enrichissement GO
  • utiliser GSEA avec une liste classée

Lisibilité de l'intrigue

Un graphique techniquement correct peut néanmoins être difficile à lire.

  • termes de limite
  • utiliser un tri cohérent
  • gardez les légendes et les étiquettes courtes
  • Rédigez des légendes qui expliquent ce que représente la taille/couleur.

Télécharger : Ébauche de script R

Voici un squelette de script compact que vous pouvez adapter. Il suppose :

  • matrice de comptage + métadonnées
  • DESeq2 pour l'analyse de l'expression différentielle (DE)
  • clusterProfiler pour l'enrichissement GO (ORA) et GSEA optionnel
  • exportations de tableaux + graphiques

C'est intentionnellement minimal afin que vous puissiez l'intégrer dans un téléchargement de ressource de blog et laisser les lecteurs modifier quelques lignes.

suppressPackageStartupMessages({

bibliothèque(DESeq2)

bibliothèque(clusterProfiler)

bibliothèque(enrichplot)

bibliothèque(AnnotationDbi)

library(org.Hs.eg.db) # remplacez par votre organisme

bibliothèque(ggplot2)

bibliothèque(dplyr)

})

# ---- Entrées (modifier) ----

counts_file <- "counts.csv" # gènes x échantillons, comptes bruts

meta_fichier <- "meta.csv" # échantillon, condition (et lot optionnel)

id_type_in <- "SYMBOLE" # SYMBOLE ou ENSEMBL

cond_a <- "traité"

cond_b <- "contrôle"

dir.create("tables", showWarnings = FALSE)

dir.create("plots", showWarnings = FALSE)

# ---- Charger ----

counts <- read.csv(fichier_counts, row.names = 1, check.names = FALSE)

meta <- read.csv(meta_file, stringsAsFactors = FALSE)

counts <- counts[, meta$échantillon]

# ---- FR ----

dds <- DESeqDataSetFromMatrix(

countData = arrondi(as.matrix(counts)),

colData = data.frame(meta, row.names = meta$échantillon),

design = ~ condition

)

# Filtrage simple

dds <- dds[rowSums(counts(dds) >= 10) >= 2, ]

dds <- DESeq(dds)

res <- résultats(dds, contraste = c("condition", cond_a, cond_b))

res <- as.data.frame(res) %>%

muter(gène = rownames(.)) %>%

filtrer(!est.na(padj))

write.csv(res, "tables/DEG_results.csv", row.names = FALSE)

# ---- Volcan ----

vol <- res %>% mutate(sig = padj < 0,05 & abs(log2FoldChange) >= 1)

p_vol <- ggplot(vol, aes(log2FoldChange, -log10(padj))) +

geom_point(aes(alpha = sig), size = 1) +

scale_alpha_manual(values = c(`VRAI` = 0.8, `FAUX` = 0.2), guide = "aucune") +

theme_bw() +

labs(x = "Changement de Fold log2", y = "-log10(FDR)", title = "Diagramme de volcan")

ggsave("plots/volcano.pdf", p_vol, width = 6.5, height = 5)

# ---- Mappage d'ID ----

mapped <- bitr(res$gene,

fromType = id_type_in,

toType = "ENTREZID",

OrgDb = org.Hs.eg.db)

res_entrez <- res %>%

inner_join(mapped, by = c("gene" = id_type_in)) %>%

distinct(ENTREZID, .keep_all = TRUE)

write.csv(res_entrez, "tables/DEG_with_ENTREZID.csv", row.names = FALSE)

write.csv(mapped, "tables/ID_mapping.csv", row.names = FALSE)

# ---- ORA (GO BP) ----

deg_up <- res_entrez %>% filtrer(padj < 0.05, log2FoldChange >= 1) %>% tirer(ENTREZID)

deg_dn <- res_entrez %>% filtrer(padj < 0.05, log2FoldChange <= -1) %>% tirer(ENTREZID)

univers <- res_entrez$ENTREZID

ego_up <- enrichGO(gene = deg_up, univers = univers,

OrgDb = org.Hs.eg.db, typeDeClé = "ENTREZID",

ont = "BP", méthodePAdj = "BH", seuilQvalue = 0.05)

ego_dn <- enrichGO(gène = deg_dn, univers = univers,

OrgDb = org.Hs.eg.db, typeDeClé = "ENTREZID",

ont = "BP", méthodePAdj = "BH", seuilQvalue = 0,05)

write.csv(as.data.frame(ego_up), "tables/GO_ORA_up.csv", row.names = FALSE)

write.csv(as.data.frame(ego_dn), "tables/GO_ORA_down.csv", row.names = FALSE)

# ---- Graphiques : barres + points ----

ggsave("plots/GO_ORA_up_bar.pdf", barplot(ego_up, showCategory = 15), width = 7, height = 5)

ggsave("plots/GO_ORA_up_dot.pdf", dotplot(ego_up, showCategory = 15), width = 7, height = 5)

# ---- Optionnel : GSEA ----

rank_vec <- res_entrez$stat

si (tous(est.na(rank_vec))) {

p <- pmax(res_entrez$pvalue, 1e-300)

rank_vec <- signe(res_entrez$log2FoldChange) * -log10(p)

}

noms(rank_vec) <- res_entrez$ENTREZID

rank_vec <- sort(rank_vec, decreasing = TRUE)

gse_bp <- gseGO(listeDeGènes = rank_vec,

OrgDb = org.Hs.eg.db, typeDeClé = "ENTREZID",

ont = "BP", pAdjustMethod = "BH", verbose = FALSE)

write.csv(as.data.frame(gse_bp), "tables/GO_GSEA_BP.csv", row.names = FALSE)

ggsave("plots/GO_GSEA_dot.pdf", dotplot(gse_bp, showCategory = 15), width = 7, height = 5)

Comment transformer cela en une ressource téléchargeable.

  • Placez tous les champs éditables en haut (chemins, base de données d'organismes, type d'ID, conditions).
  • Toujours exporter :
    • table DEG
    • Table de correspondance des ID
    • tables d'enrichissement
    • intrigues
  • Gardez les noms de dossiers cohérents afin que la sortie soit prévisible.

FAQ

Dois-je exécuter DESeq2 pour utiliser clusterProfiler ?

Non. Vous pouvez utiliser clusterProfiler avec les résultats de n'importe quelle méthode d'analyse différentielle, tant que vous avez une liste de gènes pour l'ORA ou un vecteur de gènes classés pour le GSEA.

Devrais-je utiliser ORA ou GSEA pour l'enrichissement des voies ?

Utilisez ORA lorsque vous souhaitez une enrichissement sur un ensemble de DEG sélectionné. Utilisez GSEA lorsque vous préférez tester l'enrichissement sur une liste classée sans vous fier à un seuil strict.

Pourquoi l'enrichissement ne renvoie-t-il aucun résultat ?

Le plus souvent, il s'agit d'un décalage entre l'ID et l'organisme (surtout pour KEGG) ou la liste d'entrée est trop petite. Vérifier la conversion des ID et passer à GSEA sont des solutions courantes.

Quel ensemble de gènes de fond (univers) devrais-je utiliser pour l'ORA ?

Un défaut pratique est l'ensemble des gènes testés dans votre analyse DE (après filtrage), et non l'ensemble du génome.

Combien de termes devrais-je tracer ?

En général, 10 à 20 termes suffisent pour une figure claire ; davantage tend à devenir répétitif et difficile à lire.

Références :

  1. Yu, Guangchuang, et al. "clusterProfiler : Un package R pour comparer les thèmes biologiques parmi les clusters de gènes." OMICS : Une revue de biologie intégrative, vol. 16, no. 5, 2012, pp. 284–287.
  2. Amour, Michael I., Wolfgang Huber, et Simon Anders. "Estimation modérée du changement de pli et de la dispersion pour les données RNA-seq avec DESeq2." Biologie du génome, vol. 15, 2014, p. 550.
  3. Robinson, Mark D., Davis J. McCarthy, et Gordon K. Smyth. "edgeR : un package Bioconductor pour l'analyse de l'expression différentielle des données d'expression génique numériques" Bioinformatique, vol. 26, no. 1, 2010, pp. 139–140.
  4. Lois, Charity W., et al. "voom : des poids de précision déverrouillent les outils d'analyse de modèles linéaires pour les comptes de lectures RNA-seq." Biologie des génomes, vol. 15, 2014, p. R29.
  5. Le Consortium de l'Ontologie des Gènes. "La Ressource de l'Ontologie des Gènes : Enrichir une Mine d'Or." Recherches sur les Acides Nucléiques, vol. 49, no. D1, 2021, pp. D325–D334.
  6. Kanehisa, Minoru, et Susumu Goto. "KEGG : Encyclopédie de Kyoto des gènes et des génomes." Recherche sur les acides nucléiques, vol. 28, no 1, 2000, pp. 27–30.
  7. Subramanian, Aravind, et al. "Analyse d'enrichissement des ensembles de gènes : une approche basée sur la connaissance pour interpréter les profils d'expression à l'échelle du génome." Actes de l'Académie nationale des sciences, 2005.
  8. Benjamini, Yoav, et Yosef Hochberg. "Contrôler le taux de fausses découvertes : une approche pratique et puissante pour les tests multiples." Journal de la Royal Statistical Society : Série B (Méthodologique), vol. 57, no. 1, 1995, pp. 289–300.
À des fins de recherche uniquement, non destiné à un diagnostic clinique, un traitement ou des évaluations de santé individuelles.
Services associés
Téléchargement PDF
* Adresse e-mail:

CD Genomics a besoin des informations de contact que vous nous fournissez afin de vous contacter au sujet de nos produits et services ainsi que d'autres contenus qui pourraient vous intéresser. En cliquant ci-dessous, vous consentez à la conservation et au traitement des informations personnelles soumises ci-dessus par CD Genomics pour fournir le contenu que vous avez demandé.

×
Demande de devis
! À des fins de recherche uniquement, non destiné à un diagnostic clinique, un traitement ou des évaluations de santé individuelles.
Contactez CD Genomics
Conditions Générales | Politique de confidentialité | Retour d'information   Droit d'auteur © CD Genomics. Tous droits réservés.
Haut