Les éléments répétés du génome humain : aperçu rapide avec R et le tidyverse

Dans un pré­cé­dent article, nous avions regar­dé le fichier d'annotation des gènes du génome humain d’après Gen­code. J'avais uti­li­sé pour cela la puis­sante com­bi­nai­son dplyr + ggplot2 (packages cen­traux du tidy­verse), par­ti­cu­liè­re­ment adap­tée à tout ce qui est mani­pu­la­tion et visua­li­sa­tion de don­nées tabu­laires.

Mais notre génome n'est pas consti­tué que de gènes, loin s'en faut ! Les élé­ments répé­tés sont en fait bien plus majo­ri­taires. Je ne vais pas me ris­quer à don­ner ici une défi­ni­tion pré­cise de ce qu'est un élé­ment répé­té, je me conten­te­rai de rap­pe­ler que si les élé­ments trans­po­sables sont des élé­ments répé­tés, tout les élé­ments répé­tés ne sont pas trans­po­sables ! Comme sou­vent en bio-infor­ma­tique, je vais me conten­ter de la défi­ni­tion prag­ma­tique d'élément répé­té : un élé­ment répé­té est un élé­ment décrit dans ma table d'annotation des élé­ments répé­tés. :-p

Les sources d'annotation des élé­ments répé­tés du génome humain sont bien plus rares que pour ce qui concerne les gènes. Je vous pro­pose d'utiliser le temps de cet article une table dis­po­nible sur le UCSC table brow­ser. Alors oui, l'interface a mal vieilli, mais le UCSC table brow­ser reste une for­mi­dable col­lec­tion de fichiers d'annotation du génome. Pour obte­nir la table en ques­tion, il suf­fit nor­ma­le­ment de chan­ger le champ group sur Repeats et de lais­ser le reste par défaut.

Com­ment obte­nir une table d'annotation des élé­ments répé­tés du génome humain. Vous pou­vez cli­quer sur le bou­ton des­cribe table sche­ma pour une des­crip­tion des colonnes de la table.

J'ai per­son­nel­le­ment télé­char­gé cette table le 4 avril 2017. Peut-être la vôtre sera-t-elle plus récente, et donc légè­re­ment dif­fé­rente ? En effet, les anno­ta­tions du génome humain, gènes comme élé­ments répé­tés, ne sont pas encore par­faites et sont tou­jours acti­ve­ment amé­lio­rées. Cette table a été géné­rée à l'aide de l'outil Repeat­Mas­ker, outil qui per­met de mas­quer (en rem­pla­çant par des N) les nucléo­tides d'un fichier fas­ta qui sont inclus dans des élé­ments répé­tés. Je trouve assez iro­nique qu'une des meilleures sources d'annotation des élé­ments répé­tés soit issue d'un logi­ciel visant à s'en débar­ras­ser. ^^ Ce logi­ciel de plus de 20 ans sert notam­ment à faci­li­ter l'annotation des gènes des génomes en mas­quant les séquences répé­tées.

Si vous sou­hai­tez repro­duire les ana­lyses ci-des­sous, je vous laisse donc télé­char­ger la table, la mettre dans un réper­toire de tra­vail, et lan­cer R. Si vous n'en avez rien à faire de R, vous pou­vez tout à fait sau­ter les blocs de code et autres expli­ca­tions pour vous conten­ter de regar­der les jolies images. 🙂 Je détaille cepen­dant ma démarche, en espé­rant qu'au moins l'une ou l'un d'entre vous puisse en reti­rer une astuce utile, au prix d'un alour­dis­se­ment assez consé­quent de ce billet.

Import et toilettage des données

Après avoir lan­cé R et défi­ni un réper­toire de tra­vail appro­prié (via la com­mande

setwd()

 ), je com­mence par char­ger quelques packages que j'aime bien :

J'importe la table dans R à l'aide d'une fonc­tion du package rea­dr, fonc­tion qui est plus rapide et qui a des valeurs par défaut de ses para­mètres plus adap­tées que la fonc­tion

read.table()

  de R base :

Je vais ensuite ne gar­der que les colonnes qui m'intéressent, que je renomme. J'en pro­fite aus­si pour ne gar­der que les lignes concer­nant les chro­mo­somes stan­dards, en fil­trant les haplo­types alter­na­tifs qui ne feraient qu'alourdir cer­taines figures par la suite.

Ce qui me donne cette table-ci :

chr start end strand name fami­ly class
chr1 67108753 67109046 + L1P5 L1 LINE
chr1 8388315 8388618 - AluY Alu SINE
chr1 25165803 25166380 + L1MB5 L1 LINE
chr1 33554185 33554483 - AluSc Alu SINE
chr1 41942894 41943205 - AluY Alu SINE
chr1 50331336 50332274 + HAL1 L1 LINE

Nous avons donc une clas­si­fi­ca­tions des élé­ments répé­tés en trois niveaux hié­rar­chiques, dans l'ordre : class > fami­ly > name.

Avant de regar­der plus en détail cette clas­si­fi­ca­tion, j'en pro­fite pour fil­trer les quelques lignes conte­nant un "?", qui cor­res­pondent à des clas­si­fi­ca­tions incer­taines. Je pour­rais les gar­der, mais il y en a rela­ti­ve­ment peu, et elles com­plexi­fie­raient l'analyse et alour­di­raient les figures.

Les classes d'éléments répétés

La pre­mière figure que nous allons géné­rer s’intéresse au 1er niveau hié­rar­chique de la clas­si­fi­ca­tion : les classes d'éléments répé­tés. Com­bien y en a‑t-il ? (divul­gâ­chis : 16) Quel est l’effectif de cha­cune des classes ? Quelle frac­tion du génome chaque classe couvre-t-elle ? Quelle est la dis­tri­bu­tion des lon­gueurs des élé­ments au sein de chaque classe ?

Je vais trier les classes par effec­tif décrois­sant pour rendre la figure plus jolie. Pour cela, comme j'utiliserai ggplot2, il me faut modi­fier l'ordre des levels de la colonne class après l'avoir trans­for­mée en fac­tor. J'utilise quelques fonc­tions du package for­cats.

Pour le pre­mier pan­neau, un dia­gramme en barres, j'utilise des astuces vues dans le pré­cé­dent billet. Si vous décou­vrez ggplot2, pour­quoi ne pas jeter un coup d’œil sur cet article star du blog ? Comme tou­jours, ce qui prend le plus de lignes, ce n'est pas la figure en elle-même, mais tous les petits ajus­tages néces­saires pour la rendre plus jolie.

Pour le deuxième pan­neau, j'ai envie de voir la lon­gueur totale cou­verte par chaque classe d'éléments répé­tés. Pour aider à la lec­ture, ce ne serait pas mal d'indiquer aus­si la frac­tion du génome cou­verte par chaque classe. Voi­là une excel­lente occa­sion d'utiliser une fea­ture récem­ment ajou­tée à ggplot2 : le second axe ! Avant toute chose, et comme la der­nière fois, je récu­père auprès de UCSC la lon­gueur totale de chaque chro­mo­some :

Pour faci­li­ter les pro­chains cal­culs, je rajoute une colonne conte­nant la lar­geur de chaque élé­ment :

Et c'est par­ti pour un peu de magie dplyr ! Je groupe mon tableau par classe d'éléments répé­tés (avec

group_​by()

), je cal­cule ensuite la lon­gueur totale cou­verte par chaque classe (avec

sum­ma­rise()

 ), et je lance le tout dans ggplot2 ! Je spé­ci­fie bien que je sou­haite un axe secon­daire, qui est une trans­for­ma­tion linéaire de l'axe prin­ci­pal (

sec.axis = sec_​axis(~100 * . /​ genome_​length, name = "% du génome")

 ).

Le troi­sième et der­nier pan­neau sera un aper­çu de la dis­tri­bu­tion des lar­geurs pour chaque classe d'éléments répé­tés. Des boites à mous­taches géné­rées avec ggplot2 suf­fisent ici :

Enfin, j'arrange labo­rieu­se­ment les pan­neaux à l'aide du package cow­plot et de quelques nombres magiques qui vont bien pour rendre la figure plai­sante à l’œil :

alt-text Figure 1 : Les classes d'éléments répé­tés du génome humain. A. Nombre d'éléments répé­tés pour chaque classe. B. Frac­tion du génome cou­vert par chaque classe. C. Dis­tri­bu­tion des tailles d'éléments répé­tés pour chaque classe.

Les plus obser­va­teurs d'entre vous auront peut être réa­li­sé, avec stu­peur, qu'en effet Repeat­Mas­ker caté­go­rise les gènes d'ARN ribo­so­maux (rRNA) et de trans­ferts (tRNA) comme étant des élé­ments répé­tés ! Ce qui est tech­ni­que­ment exact, mais m'a un peu sur­pris au début (ça va mieux main­te­nant, mer­ci). Je me suis amu­sé à com­pa­rer le nombre de copies de gènes d'ARN ribo­so­maux recen­sé par GENCODE, vu la der­nière fois (544) avec ceux repé­rés par Repeat­Mas­ker (1 751). Peut-être la dif­fé­rence est-elle due aux copies non fonc­tion­nelles, incluses dans la liste Repeat­Mas­ker mais pas dans celle de GENCODE ? Une telle dif­fé­rence se retrouve pour d'autres caté­go­ries de gènes ARN. Par exemple GENCODE recense 1 900 snR­NA et Repeat­Mas­ker 4 285.

Si les SINE (short inter­sper­sed nuclear ele­ments) sont plus nom­breux que les LINE (Long inter­sper­sed nuclear ele­ments), ils sont en géné­ral plus courts, et donc consti­tuent une frac­tion moindre de notre génome. La troi­sième classe la plus abon­dante, à la fois en effec­tif et en frac­tion du génome, est celle des élé­ments à LTR (long ter­mi­nal repeat). Il s'agit donc d'éléments issus de rétro­vi­rus endo­gènes.

Notez que la figure 1C ne montre pas les points ous­ti­ders. En effet, les plus longs élé­ments répé­tés le sont tel­le­ment que les mon­trer écra­se­raient le reste de la figure. Voyez plu­tôt :

chr start end strand name class fami­ly width
chr1 123500000 124000000 + ALR/​Alpha Satel­lite cen­tr 500000
chr1 123000000 123500000 + ALR/​Alpha Satel­lite cen­tr 500000
chr5 48000000 48500000 + ALR/​Alpha Satel­lite cen­tr 500000
chr7 59000000 59500000 + ALR/​Alpha Satel­lite cen­tr 500000
chr8 44500000 45000000 + ALR/​Alpha Satel­lite cen­tr 500000
chr12 35000000 35500000 + ALR/​Alpha Satel­lite cen­tr 500000

D’après la table d'annotation, les élé­ments répé­tés les plus longs sont donc les cen­tro­mères, fai­sant tous exac­te­ment 500 000 paires de base. Quelle coïn­ci­dence ! En fait, à l'heure d’écriture de cet article, les cen­tro­mères du génome humain ne sont tou­jours pas assem­blés… Parce que figu­rez-vous qu'assembler 23 ou 24 régions d'environ 500 kb très hau­te­ment répé­tées, ce n'est pas de la tarte ! En atten­dant, les cen­tro­mères sont donc anno­tés avec une lon­gueur esti­mée arbi­traire. Mais avec le rapide déve­lop­pe­ment des tech­no­lo­gies de séquen­çage de frag­ments longs, il est pos­sible que les cen­tro­mères humains soient assem­blés pro­chai­ne­ment. Les plus longs reads séquen­cés par la tech­no­lo­gie Nano­pore se rap­prochent de la méga-base !

Notre génome est en tout cas consti­tué par envi­ron :

49,4% d'éléments répé­tés ! Sont-ils homo­gè­ne­ment répar­tis entre les chro­mo­somes ? C'est ce que je vous pro­pose de décou­vrir ensuite.

Distributions des éléments répétés entre chromosomes

Tout d'abord, sou­hai­tant mettre en évi­dence les trois plus grandes caté­go­ries d'éléments répé­tés (LINE, SINE et LTR), je crée une nou­velle colonne  via un

mutate()

  et un

if_​else()

 . Je regroupe ensuite le tableau par chro­mo­some (

group_​by()

 ) et par classe et somme les lar­geurs d'éléments répé­tés (

mutate(sum(width))

 ). Je joins le tableau à celui conte­nant la lon­gueur des chro­mo­somes (

left_​join()

 ) pour pou­voir cal­cu­ler la frac­tion de chaque chro­mo­some conte­nant des élé­ments répé­tés (le second

mutate()

 ). J'en pro­fite pour réorien­ter les levels de fac­tors pour ordon­ner les dif­fé­rentes colonnes dans la figure. Et enfin j'envoie les don­nées dans ggplot2, en ajus­tant tout un tas de micro-détails pour avoir une figure exac­te­ment comme j'aime :

alt-text Figure 2 : Conte­nu en élé­ments répé­tés de chaque chro­mo­some.

En pre­mière approxi­ma­tion, il semble que chaque auto­some ait un conte­nu en élé­ments répé­tés à peu près équi­valent, oscil­lant entre envi­ron 42% pour le chro­mo­some 22, et 59% pour le chro­mo­some 19. Il est amu­sant de com­pa­rer cette figure avec celle du conte­nu en gènes de chaque chro­mo­some géné­rée la der­nière fois. Ain­si le chro­mo­some 19 est à la fois l'autosome le plus riche en gènes pro­téiques et le plus riche en élé­ments répé­tés ! L'énigmatique chro­mo­some 13 est rela­ti­ve­ment pauvre en élé­ments répé­tés, et en même temps pauvre en gènes. Les chro­mo­somes sexuels font ici leur malin, avec le chro­mo­some X ayant le plus fort taux en élé­ments répé­tés (62%), et le chro­mo­some Y le plus faible (28%). Éton­nam­ment (en tout cas pour moi), notre chro­mo­some Y est donc ni riche en pseu­do­gènes, ni riche en élé­ments répé­tés, il est juste… petit.

Les familles d'éléments répétés

Après avoir détaillé les classes d'éléments répé­tés, jetons un œil aux niveaux de clas­si­fi­ca­tions sui­vants, familles et sous-familles :

class n_​family n_​subfamily n_​element
DNA 16 226 479941
LINE 7 171 1516226
LTR 6 567 709475
SINE 6 60 1779233
Satel­lite 4 22 7018
Simple_​repeat 1 14162 678663
Unk­nown 1 71 5531
tRNA 1 62 1777
snR­NA 1 12 4285
Retro­po­son 1 6 5397
scR­NA 1 5 1334
Low_​complexity 1 4 98618
rRNA 1 3 1751
RC 1 3 1754
RNA 1 1 666
srpR­NA 1 1 1595

Nous allons essayer de repré­sen­ter gra­phi­que­ment cette diver­si­té, en affi­chant des dia­grammes en barres d'effectif de chaque famille de répé­tés. Je vais colo­rier les barres par le nombre de sous-familles pour chaque famille. Les effec­tifs variant énor­mé­ment, je suis contraint d'utiliser une échelle loga­rith­mique. J'ai alors été sur­pris de décou­vrir que pour l'instant,

coord_​flip()

  et

annotation_​logticks()

  sont mutuel­le­ment exclu­sif !

Je com­mence par pré­pa­rer les don­nées :

Géné­rons ensuite un pan­neau de figure par classe d'éléments répé­tés pos­sé­dant de mul­tiples sous-familles (classes Satel­lite, LTR, LINE, SINE et DNA). J'utilise pour cela la fonc­tion

map()

  du package purrr, une variante de

lap­ply()

 , en défi­nis­sant une fonc­tion ano­nyme via les nota­tions quelque peu éso­té­riques

~

  et

.x

 .

Géné­rons ensuite le même type de pan­neau pour toutes les classes d'éléments ayant une seule famille :

Je récu­père la légende pour l'afficher à part, à l'aide d'une fonc­tion de cow­plot :

J'utilise un peu de magie noire pour homo­gé­néi­ser les marges de mes dif­fé­rents pan­neaux et gérer l'alignement ver­ti­cal. Ne me deman­dez pas d'expliquer, j'ai juste copié-col­lé un bout de code depuis inter­net.

Enfin, j'arrange les dif­fé­rents pan­neaux, et j'exporte la figure dans un .SVG :

alt-text Figure 3 : Les familles d'éléments répé­tés.

Recon­nais­sez-vous des noms fami­liers ? Par exemple, nous avons 2 118 inser­tions d'éléments Pig­gy­Bac dans notre génome. Ce trans­po­son est à l'origine d'une méthode de clo­nage de gènes dans des plas­mides assez popu­laire.

Ce que je remarque sur­tout, c'est que des ARN de trans­ferts (tRNA) se baladent dans la caté­go­rie des SINE. MAIS POURQUOI ! POURQUOI ON NE PEUT PAS AVOIR DES CLASSIFICATIONS COHÉRENTES EN BIOINFORMATIQUE !

Hum hum, par­don.

En fait tout va bien : la clas­si­fi­ca­tion est stric­te­ment non che­vau­chante au niveau des sous-familles : les tRNA de classe SINE ne contiennent pas les même sous-familles de tRNA que les tRNA de classe tRNA. Oui, je sais, ce n'est pas très clair.  Mais il se trouve qu'un cer­tain nombre de SINE dérivent de séquences d'ARN de trans­ferts. Je pense donc que cette clas­si­fi­ca­tion est tout à fait jus­ti­fiée.

Je pour­rais me perdre ensuite dans les détails des dif­fé­rentes sous-familles d'élément répé­tés, mais je pré­fère lais­ser les plus curieux d'entre vous se perdre dans ce fas­ci­nant tableau, et nous racon­ter leurs trou­vailles en com­men­taires. Et c'est donc sur cette abrupte conclu­sion que je conclus.

 

Un grand mer­ci aux super relec­teurs et relec­trice : Clé­mence, eorn, Mathu­rin et Max, sans qui cet article serait beau­coup moins bien.



Pour continuer la lecture :


Commentaires

2 réponses à “Les éléments répétés du génome humain : aperçu rapide avec R et le tidyverse”

  1. "Je trouve assez iro­nique qu'une des meilleures sources d'annotation des élé­ments répé­tés soit issue d'un logi­ciel visant à s'en débar­ras­ser" => Mieux connaître son enne­mi pour l'éliminer :p

    "divul­gâ­chis" <3

    Sinon très bon article, clair et péda­gogue.
    Ce serait amu­sant d'appliquer cette métho­do­lo­gie sur d'autres orga­nisme pour com­pa­rer 🙂

  2. Une des vignettes de cow­plot a dis­pa­ru de CRAN, et a été mise à jour, résul­tant un un lien mort.

    "Ne me deman­dez pas d'expliquer, j'ai juste copié-col­lé un bout de code depuis inter­net."

    La vignette en ques­tion est tou­jours visible entre autre via la way­back machine de l'internet archive :

    https://web.archive.org/web/20170711035139/https://cran.r‑project.org/web/packages/cowplot/vignettes/plot_grid.html

    Mais il y a main­te­nant des méthodes plus recom­man­dables d'alignement des plots :

    https://​wil​ke​lab​.org/​c​o​w​p​l​o​t​/​a​r​t​i​c​l​e​s​/​a​l​i​g​n​i​n​g​_​p​l​o​t​s​.​h​tml

Laisser un commentaire