Lorsque l'on traite des données de RNA-seq, il arrive très souvent de se retrouver avec une matrice de quantification de l'expression des gènes (un tableau avec le nombre de reads par gène) dont le nom des gènes est représenté par leur identifiant (ou ID) de chez Ensembl (ex. : "ENSG00000128573") et non par leurs symboles (ex. : "Foxp2", le gène de la parole).
Afin de donner du sens à nos résultats et faire de belles figures pour les publications, nous devons transformer les IDs en symboles de gènes.
Il y a 2 façons de faire :
- en amont : il est possible de modifier le fichier GTF (ou GFF) de l'annotation du génome pour remplacer les IDs par les symboles des gènes. Ainsi, la matrice de comptage d'expression contiendra directement les symboles au lieu des IDs et vous n'aurez pas à changer vos matrices après le mapping et la quantification.
- en aval : en constituant une table de correspondance ID — symbole et en remplaçant les IDs dans la matrice de comptage.
C'est cette dernière solution que je vais vous montrer.
Convertir les IDs en symboles
Prenons l'exemple de la matrice de comptage du nombre de reads par gène provenant du traitement de données RNA-seq via le pipeline nf-core/rnaseq. Les données ont été mappées sur le génome de référence de la souris téléchargé depuis Gencode.
Voici à quoi ressemble cette matrice à la sortie du pipeline nf-core :
gene_id | transcript_id(s) | Sample1 | Sample2 | Sample3 |
ENSMUSG00000000001.4 | ENSMUST00000000001.4 | 6637 | 7392 | 5200 |
ENSMUSG00000000003.15 | ENSMUST00000000003.13,ENSMUST00000114041.2 | 0 | 0 | 0 |
ENSMUSG00000000088.7 | ENSMUST00000000090.7,ENSMUST00000213678.1,ENSMUST00000214154.1 | 2302.55 | 3752.86 | 1961.77 |
ENSMUSG00000000094.12 | ENSMUST00000000096.11,ENSMUST00000108045.2,ENSMUST00000108047.7 | 1 | 1 | 14 |
Les deux premières colonnes contiennent les IDs des gènes ("gene_id"), et les IDs des transcrits alternatifs de chacun des gènes ("transcript_id(s)"). Les colonnes suivantes décrivent le nombre de reads par gène pour chacun des échantillons.
Pour convertir les IDs, nous aurons besoin de charger la librairie R contenant l'annotation du génome de la souris disponible sur Bioconductor :
1 2 3 4 5 6 7 8 9 |
# Verify that you have the BiocManager package installed if (!require("BiocManager", quietly = TRUE)) install.packages("BiocManager") # Install the mouse genome database package BiocManager::install("org.Mm.eg.db") # Load the package library(org.Mm.eg.db) |
Ensuite, nous allons ouvrir notre tableau d'expression, enlever la colonne qui concerne les transcrits alternatifs parce qu'elle ne nous intéresse pas, puis extraire les IDs des gènes contenus dans notre tableau d'expression qui se trouvent dans la colonne "gene_id" :
1 2 3 4 5 6 7 8 |
# Open the read count matrix file <- read.table("rsem.merged.gene_counts.tsv", header=TRUE) # Remove the transcript IDs column matrix <- file[,-2] # Extract the gene IDs genes <- matrix$gene_id |
Vous remarquerez que les IDs ensemble se terminent par un point suivi d'un chiffre (ex. : "ENSMUSG00000000001.4"). Il s'agit du numéro de la version de l'annotation des gènes. Ce numéro est absent de l'annotation contenue dans le paquet "org.Mm.eg.db" que nous avons installé, il va donc falloir le retirer :
1 2 3 4 5 |
# Remove the version number of the ID (everything after the ".") genes <- sapply(strsplit(genes,"[.]"), function(x) x[1]) # Replace the rownames by the gene IDs without the version number rownames(matrix) <- genes |
Enfin, nous allons récupérer les symboles des gènes grâce à la fonction mapIds() du paquet "org.Mm.eg.db" :
1 2 3 4 5 6 7 8 9 10 11 |
# Obtain the correspondence table between the gene IDs and their symbols from the mouse database gene_names <- na.omit( as.data.frame( mapIds( org.Mm.eg.db, keys = genes, column = 'SYMBOL', keytype = 'ENSEMBL' ) ) ) |
On obtient alors un tableau avec les IDs des gènes en nom de ligne, et les symboles correspondant dans la première colonne :
1 2 3 4 5 |
mapIds(org.Mm.eg.db, keys = genes, column = "SYMBOL", keytype = "ENSEMBL") ENSMUSG00000000001 Gnai3 ENSMUSG00000000003 Pbsn ENSMUSG00000000093 Tbx2 ENSMUSG00000000103 Zfy2 |
On va ensuite remplacer les IDs des gènes par les symboles dans la matrice de comptage en utilisant la fonction merge(), qui permet de s'assurer une parfaite correspondance entre les noms de lignes des deux tableaux :
1 2 3 4 5 |
# Rename the vector for convenience names(gene_names) <- "gene_symbol" # Merge the new gene_name vector with the matrix using the rownames (by=0) merged <- merge(x = gene_names, y = matrix, by = 0) |
Voilà ce que l'on obtient à l'issue du merge effectué sur les noms de lignes :
1 2 3 4 5 |
Row.names gene_symbol gene_id Sample1 Sample2 Sample3 1 ENSMUSG00000000001 Gnai3 ENSMUSG00000000001.4 6637 7392 5200 2 ENSMUSG00000000003 Pbsn ENSMUSG00000000003.15 0 0 0 3 ENSMUSG00000000093 Tbx2 ENSMUSG00000000093.6 238 367 193 4 ENSMUSG00000000103 Zfy2 ENSMUSG00000000103.12 0 0 0 |
Enfin, on va enlever les colonnes non nécessaires, éliminer les lignes en double (ça arrive de temps en temps avec la fonction merge()…), et renseigner les symboles des gènes en noms de ligne.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# Remove the unnecessary columns merged <- merged[,c(-1,-3)] # Discard the duplicated rows (side effect of the merge function) merged <- merged[!duplicated(merged$gene_symbol), ] # Make the gene symbols as rownames rownames(merged) <- merged$gene_symbol # Remove the gene symbol column merged <- merged[,-1] # Save the new matrix as csv write.csv(merged, file="my_new_matrix.csv") |
Voilà, vous avez maintenant une matrice directement utilisable pour faire votre analyse d'expression différentielle !
1 2 3 4 5 |
Sample1 Sample2 Sample3 Gnai3 6637 7392 5200 Pbsn 0 0 0 Tbx2 238 367 193 Zfy2 0 0 0 |
Conclusion
Il existe probablement d'autre façon de faire, peut-être même plus efficaces, je vous ai présenté ici celle que j'utilise.
Si vous souhaitez convertir une liste d'IDs de gènes sans forcément passer par R, vous pouvez également utiliser des outils de conversion disponibles sur divers sites internet, tels que David, g:profiler et BioMart/MartView pour ne citer qu'eux.
Merci à Ista, Gwenaelle et Azerin pour la relecture.
Laisser un commentaire