M2BBS - IDH draft
From silico.biotoul.fr
Introduction et présentation des différentes approches d'intégration
Durée : 1/2 journée
- Approches et généralités
- Analyses préliminaires sur les données d'E. coli : ppi.vs.coexp.html
Modélisation, représentation et construction d'une base de connaissances sur E. coli puis exploitation
Durée : 1 journée
- Prise en main de Neo4j et intégration des données sur le génome d'E. coli : Ecoli.knowledge.base.html
- Intégration de données d'expression
- Intégration de données d'interaction protéine-protéine
- Intégration de données phylogénomiques
- Gènes co-exprimés et interactions protéiques et lien phylogénomique
- Recherche de caractéristiques sur-représentées
- Intégration de données d'annotation et recherche d'annotations sur-représentées chez les gènes/protéines partageant un lien de coexpression/interaction/phylogénomique
Enrichment analysis
Dans cette partie, il s'agit d'analyser un groupe de gènes en le confrontant à des groupes de gènes obtenus selon différentes fonctions de regroupement.
La fonction de regroupement proposée est l'appartenance à une même voie métabolique dans la banque de données BioCyc. Ainsi, pour chaque pathway, un groupe de gènes est formé.
Le script python blastset.py (github ou gitlab) permet de charger ces ensembles de gènes pré-formés EcolA.biocyc.sets et de chercher les plus similaires à un groupe de gènes d'intérêts. Essayez-le avec ALAS ARGS ASNS ASPS CYSS GLTX GLYQ GLYS HISS ILES par exemple pour vous faire une idée de son fonctionnement.
Remarque : le script python utilise le module scipy, installation si besoin :
conda activate devenv conda install scipy
Comparez les résultats avec ceux obtenus en recherchant parmi les ensembles formés des gènes annotés avec le même terme de la Gene Ontology (EcolA.go.sets). Que constatez-vous ?
Travail à réaliser :
- Analyser le code source du script blastset.py
- Pour chaque pathway biocyc, proposer le term GO le plus représentatif
- Visualisation des résultats avec REVIGO
Intégration dans une base de données orientée graphes
Sites et documentations :
- https://neo4j.com/
- https://neo4j.com/developer/get-started/
- pilotes : python ; R
- Cypher reference card: https://neo4j.com/docs/cypher-refcard/current/
- et dans guest@intervenant:/home/Documents/eBooks
- exemples d'applications :
- graphe de co-expression : https://neo4j.com/graphgist/dba96ed2-2d3c-469c-a1a4-cda067c873fc
- réseau métabolique : https://neo4j.com/graphgist/563e4bfc-a3d8-479d-b065-1f9c9b84027e#listing_category=science
Téléchargement linux https://neo4j.com/download-center/#releases (onglet Community server)
Installation (cf.https://neo4j.com/docs/operations-manual/current/installation/)
version=4.1.2 tar tf neo4j-community-$version-unix.tar.gz tar xf neo4j-community-$version-unix.tar.gz ln -s neo4j-community-$version neo4j-community cd neo4j-community/
Démarrage et arrêt du serveur
./bin/neo4j console
Le processus est au premier plan donc pour arrêter le serveur il faut faire Ctrl + C dans le terminal.
Utilisation depuis le navigateur (vérifier le port renseigné lors de la précédente commande)
http://localhost:7474/
A la première connexion, le mot de passe est neo4j, le système demande ensuite de changer le mot de passe. Explorez l'interface Web de Neo4j browser, notamment le côté gauche avec les paramètres, et les informations sur la base de données.
Dans la partie favoris, suivre le premier exemple dans Example Graphs intitulé Movie Graph.
Passer ensuite à l'exemple suivant Northwind Graph et adapter les commandes pour importer le modèle suivant :
- les termes de la Gene Ontology et leurs relations is_a et part_of qui ne sont pas "périmés" (obsolete) ; cf. http://geneontology.org/ et http://geneontology.org/page/download-ontology http://geneontology.org/page/lead-database-schema et http://archive.geneontology.org/latest-termdb/go_daily-termdb-data.gz
- les protéines annotés avec ces termes ; cf. STRINGdb
Requêtes Cypher depuis Neo4j browser ou depuis le shell :
./bin/cypher-shell
Utilisation depuis python.
Utilisation depuis R.
Données et scripts
- enrichment analysis
- R-STRINGdb tutoriel
Neo4j
Restauration de la base de données entière récupérée sur geneontology.org :
mysql -uroot -p -e 'create database go' mysql -uroot -p go < go_daily-termdb-data
Extraction d'un fichier csv tabulé pour l'import dans neo4j (dans le répertoire import)
mysql -uroot -p go -B -e "SELECT id, acc, term_type, name FROM term WHERE acc LIKE 'GO:%' AND is_obsolete=0" > neo4j-community/import/go.terms.tsv
Pour pouvoir importer les données depuis un fichier local, il faut modifier la configuration de neo4j : dans le fichier conf/neo4j.conf, ajouter vers la ligne 227 :
dbms.security.allow_csv_import_from_file_urls=true
Import des termes GO dans Neo4j :
LOAD CSV WITH HEADERS FROM "file:///go.terms.tsv" AS row FIELDTERMINATOR '\t' CREATE (n:GOTerm) SET n = row, n.id = row.id, n.acc = row.acc, n.term_type = row.term_type, n.name = row.name
Création des index :
CREATE INDEX ON :GOTerm(id) CREATE INDEX ON :GOTerm(acc)
Exploration :
MATCH (n:GOTerm) RETURN count(n) MATCH (n:GOTerm) RETURN n LIMIT 10 MATCH (n:GOTerm {name: 'reproduction'} ) RETURN n
Ajout des relations de type is_a et part_of. On recherche leur identifiant interne (qui change régulièrement) :
SELECT * FROM term WHERE is_relation;
# IS_A (internal term id = 1) mysql -uroot -p go -B -e "SELECT term1_id, term2_id FROM term2term WHERE relationship_type_id = 1" > neo4j-community/import/go.rel.is_a.dump.txt
Commandes dans Neo4j pour l'import :
USING PERIODIC COMMIT 1000 LOAD CSV WITH HEADERS FROM "file:///go.rel.is_a.dump.txt" AS line FIELDTERMINATOR '\t' MATCH (t1:GOTerm),(t2:GOTerm) WHERE t1.id=line.term1_id AND t2.id=line.term2_id WITH t1,t2 MERGE (t2)-[:IS_A]->(t1)
- ajout des relations part_of
# PART_OF (internal term id = 20) mysql -uroot -p go -B -e "SELECT term1_id, term2_id FROM term2term WHERE relationship_type_id = 20" > neo4j-community/import/go.rel.part_of.dump.txt vi neo4j-community/import/go.rel.part_of.dump.txt USING PERIODIC COMMIT 1000 LOAD CSV WITH HEADERS FROM "file:///go.rel.part_of.dump.txt" AS line FIELDTERMINATOR '\t' MATCH (t1:GOTerm),(t2:GOTerm) WHERE t1.id=line.term1_id AND t2.id=line.term2_id WITH t1,t2 MERGE (t2)-[:PART_OF]->(t1)
Ajout des sommets correspondants aux protéines
sdb = STRINGdb$new(version='10', species=511145, score_threshold=0, input_directory='repo_data') g=sdb$get_graph() sp=sdb$get_proteins()
cp repo_data/511145__proteins.tsv.gz neo4j-community/import/ gunzip neo4j-community/import/511145__proteins.tsv.gz
# remplacer les tabulations par des virgules (si besoin) USING PERIODIC COMMIT 1000 LOAD CSV WITH HEADERS FROM "file:///511145__proteins.csv" AS row CREATE (n:Protein) SET n = row, n.id = toInt(row.protein_id), n.name = row.protein_external_id
Ajout de l'index
CREATE INDEX ON :Protein(name)
Test
MATCH (p:Protein) RETURN p LIMIT 10
Ajout des liens entre protéines et annotations
annot=sdb$get_annotations()
cp repo_data/annotations_511145.tsv.gz neo4j-community/import/ gunzip neo4j-community/import/annotations_511145.tsv.gz # remplacer les tabulations par des virgules et rajouter les noms de colonnes # prot,got,branch,iea echo 'prot,got,branch,iea' > neo4j-community/import/go.annotations_511145.csv grep 'GO:' neo4j-community/import/annotations_511145.tsv >> neo4j-community/import/annotations_511145.csv
USING PERIODIC COMMIT 1000 LOAD CSV WITH HEADERS FROM "file:///annotations_511145.csv" AS line MATCH (p:Protein), (goterm:GOTerm) WHERE p.name=line.prot AND goterm.acc=line.got WITH p, goterm, line CREATE UNIQUE (goterm)-[r:GOAnnotates { branch: line.branch }]->(p)
- Script python
#!/usr/bin/python from neo4j.v1 import GraphDatabase, basic_auth driver = GraphDatabase.driver("bolt://localhost", auth=basic_auth("neo4j", "bioinfo")) session = driver.session() #~ session.run("CREATE (a:Person {name:'Arthur', title:'King'})") result = session.run("MATCH (f:GOTerm)-[:IS_A]->(g:GOTerm) WHERE g.name='reproduction' RETURN f.acc AS acc, f.name AS name") for record in result: print "acc: %s, name: %s" % (record['acc'], record['name']) print session.close()
- R
library(RNeo4j) graph = startGraph("http://localhost:7474/db/data/", 'neo4j','bioinfo') graph = startGraph("http://localhost:7474/db/data/") query = "match (g:GOTerm {name:'transport'})-[r:GOAnnotates]->(p:Protein) return p.name,p.protein_size" cypher(graph,query) # GOTerm les plus utilisés query = "MATCH (:Protein)<-[:GOAnnotates]-(g:GOTerm) RETURN g.name AS GOTerm, COUNT(*) AS count ORDER BY count DESC LIMIT 50" cypher(graph,query) # GOTerm les plus utilisés dans Biological Process, ou autre query = "MATCH (:Protein)<-[:GOAnnotates]-(g:GOTerm {term_type:{param}}) RETURN g.name AS GOTerm, COUNT(*) AS count ORDER BY count DESC LIMIT 50" cypher(graph, query, param = "biological_process") # ou bien avec les attributs sur les arcs query = "MATCH (g:GOTerm)-[:GOAnnotates {branch:{param}}]->(:Protein) RETURN g.name AS GOTerm, COUNT(*) AS count ORDER BY count DESC LIMIT 50" cypher(graph, query, param = "Process")
Projets 2019-20
Caractérisation d'ensemble par recoupement de voisinages
Intégration et préparation des données
Outline:
- choisir un organisme. Le même organisme ne peut pas être pris par plusieurs personnes. La liste des choix attribués (premier arrivé, premier servi) sera disponible en fin de cette section.
- fournir un script permettant d'obtenir à partir du graphe de la Gene Ontology et des associations 2 fichiers :
- le premier fournit les associations directes : la liste des gènes annotés directement par un même terme
- le second fournit les associations implicites : la listes des gènes annotés par un même terme ou un de ses descendants (plus spécifiques)
- choisir l'organisme de quelqu'un d'autre (là aussi, ne pas prendre plusieurs fois le même), afin de vérifier que le script précédent fonctionne bien sur un autre organisme.
- utiliser le script sur les 2 organismes et faire une synthèse (par exemple : nombre de gènes annotés sur le génome, nombre de termes par gène, nombre de gènes par terme, ...). L'organisme choisi est-il "bien" annoté par la GO ?
Prénom Organisme Autre organisme choisi Cheryn Microlunatus phosphovorus Marine Yersinia pestis Soufiane Bacillus cereus Eve Caenorhabditis elegans Tristan Drosophila melanogaster Elise Canis lupus familiaris Chloé Plasmodium falciparum Nicolas Anaplasma marginale Juliette Gallus gallus Clara Apis mellifera Geoffrey Arabidopsis thaliana Matthieu Danio rerio Julien Ornithorhynchus anatinus Marion Pseudomonas fluorescens Alexandre Schistosoma mansoni
Ajout de fonctionnalités à blastset.py
Notation : On considère un ensemble requête Q (query) et un ensemble cible T (target, appartenant à un jeu de données de référence). Les deux ensembles sont inclus dans l'ensemble des gènes de l'organisme G (génome). Ils ont respectivement des cardinalités q, t, g.
Il s'agit de proposer d'autres mesures de dissemblance. La première est naïve (non statistique) que l'on nommera overlap ou coverage et consiste à considérer quelles fractions des 2 ensembles se correspondent. Pour la cohérence avec les autres mesures la valeur sera de 1 quand aucun élément n'est commun aux 2 ensembles, et 0 pour 2 ensembles identiques. Il s'agit donc de multiplier c/q par c/t avec c le nombre d'éléments communs aux ensembles Q et T respectivement de cardinalités q et t, et de soustraire cette valeur à 1.
La deuxième mesure à ajouter est un χ2 d'indépendance en considérant les ensembles Q et T comme 2 variables qualitatives. Le test est donc à effectuer sur la table de contingence :
T | G \ T | Σ | |
Q | c | q - c | q |
G \ Q | t - c | g - q - t + c | g - q |
Σ | t | g - t | g |
Remarque : Il est possible de s'autoriser à transformer la mesure non statistique (coverage) afin qu'elle indique la dissemblance entre 2 ensembles (0 : identique, >0 : dissemblable). Ainsi les résultats seront triés dans le même ordre pour coverage et pour les p-valeurs (du χ2 par exemple).
Comparaison des mesures ajoutées
Proposez une approche et comparez les différentes mesures intégrées au script. Laquelle est-il préférable d'utiliser ?
Comparaison de fonction de regroupement
Les voisinages obtenus par différentes fonction de regroupement se ressemblent-ils ?
A partir d'une question biologique, par exemple, les gènes organisés en opéron sont-ils, de manière générale, co-exprimés, reformulez-la en comparaison de voisinage pour y répondre. Pour cela, choisissez deux fonctions de regroupement (par exemple la co-régulation et une autre) et proposez et mettez en oeuvre la comparaison des voisinages obtenus selon ces fonctions de regroupement sur l’organisme que vous avez choisi. Au final, à partir des données intégrées, il s'agira de répondre à la question posée, chiffres et analyses à l'appui.
Rapport à rendre
Un rapport succinct est demandé. L'objectif est de fournir plutôt un rapport technique pour l'ajout des mesures au script et méthodologique pour la partie comparaison des mesures. Il doit donc être complet, pertinent, ciblé (qui est le lecteur ?), scientifique et rigoureux.
Il doit inclure
- une brève introduction générale décrivant le contexte, les objectifs et le plan de ce qui suit.
- intégration et préparation des données
- données utilisées (sans oublier les versions)
- méthodes d'intégration envisagées, choix et détails dans la réalisation
- synthèse de l'annotation GO de l'organisme choisi
- ajout de fonctionnalités :
- des explications sur les modifications apportées au script original,
- comment utiliser le script modifié,
- un exemple d'utilisation des fonctionnalités ajoutées.
- comparaison des mesures intégrées :
- approches envisagées et méthode pour en sélectionner une
- mise en oeuvre
- synthèse des résultats obtenus
- bilan : quelle mesure utiliser de préférence, pourquoi
- perspectives d'amélioration
- bilan personnel sur cette partie du projet et sur cette UE : motivations ? critiques ? suggestions ? apports ? ... ?
Contraintes :
- Le rapport doit être au format PDF.
- Le rapport peut être en anglais ou en français mais pas les 2.
- Le script modifié et les éventuels jeux de tests utilisés et résultats obtenus doivent être disponibles dans votre github.
Sujets alternatifs aux questions 1.2 à 1.4
- Etudier la possibilité d'extrapoler la correction du seuil alpha par fonction de répartition empirique des minPi en fonction de la taille de l'ensemble requête
- Implémenter le filtrage des ensembles cibles considérés par critère de pertinence (strict ou ratio de pertinence) sur :
- pour un graphe orienté sans circuit (DAG)
- pour un arbre
- pour un treillis (ordre des gènes sur le chromosome)
- Implémenter la recherche d'enrichissement sur un graphe par marches aléatoires
Partie 2 collective 2018-19 (pas à faire): Intégration et exploitation de données hétérogènes dans un modèle graphique
Le but de cette partie est de mettre en oeuvre certains principes vus jusqu'ici afin de répondre à une question biologique : les gènes co-régulés chez un organisme donné le sont-ils aussi chez Escherichia coli K-12 MG1655 ?
Afin d'y répondre, il faudra choisir un organisme, déterminer les gènes co-régulés dans les 2 génomes ainsi que la correspondance des gènes entre les 2 génomes.
La co-régulation des gènes peut se trouver dans la littérature et les bases de données mais les connaissances actuelles ne sont pas complètes. Pour pallier ce manque, on pourra choisir de faire une prédiction de la co-régulation avec une approximation : il s'agit de supposer que les gènes co-exprimés sont co-régulés. Pour déterminer les gènes co-exprimés chez un organisme, on se base généralement sur un compendium de données d'expression comprenant suffisamment de conditions expérimentales différentes. A partir des profils d'expression des gènes dans toutes ces conditions, on applique une méthode de clustering pour identifier les ensembles de gènes co-exprimés. Il est bien sûr aussi possible d'utiliser une base de données de référence, si elle existe, ou bien une base de données contenant des scores de co-expression entre les paires de gènes de l'organisme étudié.
La correspondance des gènes entre les 2 génomes peut là aussi, bien sûr, si elle existe être établie à partir d'une base de données de référence, ou bien être calculée selon une méthode d'identification des gènes orthologues 1:1.
Objectifs et problématiques :
- choix d'un organisme
- les gènes orthologues chez E. coli K-12 MG1655 des gènes co-exprimés dans l'organisme choisi sont-ils aussi co-exprimés ?
- quel est le groupe de gènes le mieux conservé (en termes d'orthologie, de co-expression, et d'annotation) ?
- bonus (à réaliser si vous le souhaitez)
- les ensemble de gènes conservés en co-expression forment-ils un opéron chez E. coli ?
- vaut-il mieux utiliser les orthologues fournis par String ou Roland B. ? (Si RB vous a fourni ces données)
- associer une ou des annotations aux groupes de gènes co-exprimés
Etapes clés :
- détermination des gènes co-exprimés
- identification des gènes orthologues 1:1 chez E. coli
- constitution des jeux de données (de type graph database)
- correspondance des groupes de gènes co-exprimés chez l'organisme choisi et E. coli
- bonus
- détermination des opérons chez E. coli
- correspondance avec les opérons de E. coli
- mise en oeuvre avec d'autres méthodes pour l'identification des gènes co-exprimés et des orthologues, et comparaison des résultats
- annotation automatique de groupes de gènes
Contraintes :
- Les organismes choisis par les différents groupes doivent être différents (premier arrivé = premier servi).
- Utilisation de Neo4j pour la représentation sous forme de graphe des données intégrées (expression, orthologie, annotation, ...).
Rapport à rendre
Là aussi, un rapport succinct est demandé. L'objectif est de fournir des informations sur la réalisation de cette partie et les choix effectués pour y arriver. Il doit donc être complet, pertinent, scientifique et rigoureux.
Il doit inclure
- une brève introduction générale décrivant le contexte, les objectifs et le plan de ce qui suit.
- Analyse et conception
- choix de l'organisme
- méthode(s) pour la sélection des données utilisées
- méthode(s) pour l'identification des gènes co-régulés
- methode(s) utilisée pour l'identification des gènes orthologues
- Réalisation
- environnement de travail, constitution des données utilisées (modèle graph database), paramétrages des méthodes utilisées, logiciels et banques utilisés
- résultats
- Bilan et perspectives
- synthèses et conclusions sur l'étude demandée
- perspectives d'amélioration de ce type d'étude, pistes d'analyses qu'elle ouvre (sur l'organisme sélectionné, ou plus généralement)
- Bilan du groupe sur cette partie du projet
- part de chacun dans les différents aspects du travail effectué
- difficultés rencontrées
- avis sur les bases de données de types graph database
Contraintes :
- Le rapport doit être au format PDF.
- Le rapport peut être en anglais ou en français mais pas les 2.
- Les scripts et programmes développés et les éventuels jeux de tests utilisés et résultats obtenus doivent être fournis ou disponibles sous forme d'archive.
Présentation
La présentation orale se fera par groupe. La durée de la présentation ne doit pas dépasser 20 minutes. Elle sera suivie de questions, commentaires et d'une discussion.
La présentation sera sur le thème d'une présentation interne à une équipe ou un institut, c'est-à-dire que le public connaît les enjeux et les contraintes. Elle portera donc davantage sur les choix des méthodes et leur réalisation, ainsi que sur la discussion et les résultats obtenus.
Calendrier
Partie 1 individuelle : Le rapport individuel et l'archive associée sont à remettre par voie électronique avant le 15 octobre 2018.
Partie 2 collective, les dates indiquées sont les dates limites exclues (par exemple l'information sur la composition des groupes doit parvenir avant le 24/09, donc vous avez jusqu'au 23)
- 24/09 détermination des groupes (et information transmise à RB)
- 01/10 choix d'un organisme (et information transmise à RB)
Le rapport collectif est à remettre par voie électronique avant le 10 décembre.
Remarque : tout retard sur le calendrier, notamment la remise des livrables, pourra être pris en compte dans la note d'évaluation.