Mis a jour le 2024-10-20, 20:16

gseapy

Msigdb :
Enrichr :
  • gseapy.get_library_name(organism = Human') : renvoie la liste des librairies enrichr pour l'homme.
  • gseapy.get_library_name() : renvoie la liste des librairies enrichr (c'est le défaut).
  • gseapy.get_library(name = 'Reactome_2022', organism = 'Human') : renvoie un dictionnaire pathway vers liste de gènes.
Overrepresentationa analysis :
  • result = gseapy.enrich(myGeneList, myGeneSets) : fait de l'overreprésentation analysis, avec myGeneList la liste de gènes à étudier, et myGeneSets un dictionnaire pathway vers liste de gènes et renvoie un objet gseapy.enrichr.Enrichr avec result.res2d contenant un dataframe avec les résultats ayant les colonnes suivantes :
    • Term : le pathway.
    • Overlap : 5/27 (nombre de gènes présents dans la liste sur nombre de gènes total du pathway.
    • P-value : la p-value
    • Adjusted P-value : la p-value ajustée
    • Genes : les gènes présents dans la liste (numérateur de Overlap).
    paramètres de enrich :
    • background = myBackgroundListOfGenes : optionellement la liste de gènes exprimés dans l'expérience (recommandé, sinon, c'est la réunion des gènes présents dans tous les genesets qui sont utilisés).
    • cutoff = 0.05 : la p-value à utiliser (défaut = 0.05).
    • verbose = True : mode verbeux (défaut est False).
    • outdir = '.', format = 'png', figsize = (6.5, 6) : écrit un barplot avec les p-values et aussi un fichier txt (mais pas le choix du nom des fichiers ...
  • dotplot : gseapy.dotplot(result.res2d, column = 'Adjusted P-value', x = 'Gene_set', top_term = 10, figsize = (3, 5), cutoff = 0.05, cmap = 'viridis_r', title = 'myTitle', xticklabels_rot = 45, show_ring = True, marker = 'o') :
    • x = 'Gene_set' : c'est la colonne du dataframe si celui-ci contient plusieurs séries de GeneSet, sinon peut aussi être égal à 'Combined Score', une autre colonne du dataframe (défaut si non présent)
GSEA :
  • si df est un dataframe obtenu avec scanpy.tl.rank_genes_groups, il est trié par valeur - numpy.log(df['pvals']) * numpy.sign(df['logfoldchanges']) décroissante.
  • créer un nouveau dataframe df2 = pandas.DataFrame({'score': - numpy.log(df['pvals'].values) * numpy.sign(df['logfoldchanges'].values)}, index = df['gene'].values)
  • attention, s'il y a des pvals à 0, les remplacer par des valeurs > 0 : df['pvals'] = df['pvals'].apply(lambda x: sys.float_info.min if x == 0 else x)
  • lancer le GSEA avec : result = gseapy.prerank(df2, myGeneSets). Quelques paramètres :
    • threads = 4
    • outdir = '.' : directory pour les graphes (défaut est None, pas de graphes générés). Ils sont générés dans un sous-directory pre-rank
    • format = 'png' : pour les images
    • graph_num = 5 : le nombre de graphes à générer.
    • seed = 0
    • verbose = True : défaut est False
  • le résultat est un objet gseapy.gsea.Prerank et result.results est un dictionnaire dont les clefs sont les noms des genesets et les valeurs un dictionnaire avec notamment les clefs :
    • es : enrichment score
    • nes : normalized enrichment score
    • pval : p-value
    • fdr : false discovery rate ajustée
    • fwerp : family wise error rate p-value
    • matched_genes : les gènes matchés dans le geneSet.
    • lead_genes : les gènes avant le pic (si positif) ou après le pic (si négatif)
    • tag % : nombre de lead genes / nombre de matched genes.
    • RES : ce sont les valeurs qui permettrent de tracer le graphe.
  • result.res2d est aussi un dataframe triés par valeur absolue de NES descendant, avec notamment les colonnes Term, ES, NES, "FDR q-val", "FWER p-val", "Tag %", Lead_genes.
  • ax = result.plot(terms = myPathway) : plot le graphe du pathway indiqué.
  • ax = result.plot(terms = [pathway1,pathway2], colors = ['red', 'green']) : on peut donner plusieurs pathways et aussi indiquer un fichier où sauver l'image.
  • result.plot(terms = [pathway1,pathway2], colors = ['red', 'green'], ofname = 'myImage.png') : indique un fichier où sauver l'image.
  • dotplot :
    • ax = gseapy.dotplot(result.res2d, column = 'FDR q-val', title = 'myTitle', cmap = 'viridis_r') :
      • size = 6 : taille max des points
      • cutoff = 0.05 : cutoff sur la colonne donnée dans l'argument column (défaut est 0.05)
      • top_term = 10 : nombre maximum de pathways (défaut est 10)
      • show_ring = True : anneau avec la taille maximum autour des points.
      • marker = 'D' : marqueur diamond plutôt que rond (défaut est 'o')
      • figsize = (5, 5) : taille de la figure.
      • ofname = 'myImage.png' : fichier pour la sauvegarde.
Visualisation des relations entre pathways à partir d'un résultat GSEA :
  • nodes, edges = gseapy.enrichment_map(result.res2d) : examine les relations entre les pathways et renvoie 2 dataframes :
    • nodes : pathways sélectionnés (reprend les colonnes de result.res2d)
    • edges : arêtes entre les pathways avec comme colonnes notamment :
      • src_name
      • targ_name
      • jaccard_coef
      • overlap_coef
      • overlap_genes : la liste des gènes communs séparés par des virgules.
  • paramètres :
    • column = 'Adjusted P-value' : la colonne prise en compte pour sélectionner les pathways (c'est le défaut).
    • cutoff = 0.05 : le seuil de sélection des pathways (en fonction de la valeur de column), défaut de 0.05
    • top_term = 10 : le nombre maximum de pathways (défaut de 10)
  • représentation en utilisant le package networkx :
    • graph = networkx.from_pandas_edgelist(edges, source = 'src_idx', target = 'targ_idx', edge_attr=['jaccard_coef', 'overlap_coef', 'overlap_genes'])
    • nodeIdsInGraph = set(edges['src_idx'].tolist() + edges['targ_idx'].tolist()); nodes2 = nodes.loc[nodes.index.isin(nodeIdsInGraph)] : attention, si certains sommets n'ont aucune arête, il faut les enlever !
    • pos = networkx.layout.spiral_layout(graph)
    • networkx.draw_networkx_nodes(graph, pos = pos, cmap = 'RdYlBu', node_color = (nodes2['NES']).tolist(), node_size = (nodes2['Hits_ratio'] * 1000).tolist())
    • networkx.draw_networkx_labels(graph, pos = pos, labels = nodes2['Term'].to_dict())
    • edgeWeight = networkx.get_edge_attributes(graph, 'jaccard_coef').values()
    • networkx.draw_networkx_edges(graph, pos = pos, width = list(map(lambda x: x * 10, edgeWeight)), edge_color = 'gray')
    • pyplot.savefig('myImage.png')

Copyright python-simple.com
programmer en python, tutoriel python, graphes en python, Aymeric Duclert