- Installer GIT (déjà présent sur BIRD)
- Ouvrir le terminal et se placer dans le répertoire où se trouve le fichier de code avec
cd - Cloner le dossier dans le répertoire avec
git clone https://github.com/MartBony/pre_annot.git
cd pre_annot
Modification Les gènes marqueurs sont dans le fichier diffGenesBase.csv et sont directement modifiables dans excel. Les gènes qui ne nous informent pas sur la nature de la cellule sont à mettre dans uselessGenes.csv.
Synchronisation Pour syncroniser le repo, il faut valider les changements en local :
git add .
git commit -m "Modification des gènes marqueurs"Puis importer la derniere version depuis le repo :
git pullDes problèmes de fusion de fichier peuvent survenir, dans ce cas il faut ouvrir les fichiers problématiques dans excel et les corriger soi-même. Puis exporter sa version locale vers github :
git push origin mainClôner dans un dossier /pre_annot/ dans le répertoire du fichier de code.
setwd("répertoire/absolu/de/mon/code")Importer le code de pré-annotation
source("../pre_annot/pre_annot.R", chdir=TRUE)Pour pré-annoter il faut :
- L'objet seurat de travail
SeurOBJ - Le tableau des gènes différentiellement exprimés
diff.expressed.genes(obtenu après filtration des gènes marqueurs). Il contient les champs :- p_val : p-valeur classique.
- avg_log2FC : Coefficient qui mesure la proportion d'expression différentielle.
- p_val_adj : p-valeur plus stricte, utilisée pour la pré-annotation.
- cluster
- gene
On peut calculer la matrice de comptage des gènes en communs. Cette matrice correspond plus ou moins à la méthode manuelle d'annotation. Elle est biaisée pour les types cellulaires qui possèdent beaucoup de gènes dans le tableau mais elle offre quand même les meilleurs résultats. Il faut quand même jeter un oeil à la matrice d'expression différentielle.
type.annot.matrix <- get_annot_matrix(SeurOBJ, diff.expressed.genes)PS : Un type cellulaire avec 1 seul gène (ex : LT cd8 pour l'instant) sera 0 ou 1 et apparaîtera prioritéaire sur tous les autres types. Ce cas est à éviter $\to$ ajouter des gènes.
La matrice d'expression différentielle assigne à chaque couple (cluster, type cellulaire) un score qui correspond à la moyenne des coefficients avg_log2FC (log fold-change) des gènes en communs du couple. Voir (Wikipedia : Fold Change)[https://en.wikipedia.org/wiki/Fold_change]
Elle capture à quel point les gènes en commun sont différentiellement exprimés. Elle peut être utilse pour moduler les matrices précédentes.
type.avg.matrix <- get_avg_matrix(SeurOBJ, diff.expressed.genes)Plus le score est grand, plus les coefficients associés aux gènes en commun sont grands.
La matrice de comparaison représente pour chaque cluster et pour chaque type le pourcentage des génes de références du type qui sont différentiellement exprimés dans le cluster. C'est la matrice de comptage corrigée par le nombre de gènes de références qui varie selon type cellulaire.
Elle est très biaisée pour les types cellulaires qui ont peu de gènes. Par exemple, si un type cellulaire a un seul gène marqueur, il arrivera toujours en premier dans les clusters où ce gène est différentiellement exprimé.
type.corresp.matrix <- get_corresp_matrix(SeurOBJ, diff.expressed.genes)display_heatmap(type.annot.matrix)
display_heatmap(type.annot.matrix, "Nombre de gènes") # Possibilité de mettre un titreOn peut comparer les deux matrices l'une à côté de l'autre :
display_heatmap(type.annot.matrix) + display_heatmap(type.avg.matrix)On peut croiser les informations de deux matrices en les multipliant élément par élément. Je pense que celle qui a le plus de potentiel est :
mtx <- type.annot.matrix * type.avg.matrixElle correspond à la somme des log fold-change (avg_log2FC).
Choisit le type cellulaire le plus probable à partir de la matrice choisie. Utilise une fonction basique pour marquer les choix incertains.
clusters.annot <- pre_labels(type.annot.matrix, seuil = 3) # Seuil optionnelPlus le seuil est haut, plus les assignations serons considérées comme incertaines.
On peut afficher directement les types cellulaires choisis :
clusters.annotnames(clusters.annot) <- levels(SeurOBJ)
LabeledSeurOBJ <- RenameIdents(SeurOBJ, clusters.annot)
DimPlot(LabeledSeurOBJ, reduction = "umap", label = TRUE, pt.size = 0.25) + NoLegend()On peut rajouter une colonne à la table des gènes différentiellement exprimés selon deux critères :
- Est-ce que le gène est déjà dans les données de pré-assignation ?
- Est-ce que le gène est dans la liste des gènes inexploitables ? (fichier ./pre_annot/uselessGenes.csv)
diff.expressed.genes <- mark_knowns(diff.expressed.genes)Puis on peut continuer l'assignation manuelle en se concentrant sur les gènes pas encore exploités et en s'aidant de la pré-assignation.
save.plot.png(ma.heatmap, "./mon_nom_de_fichier.png")# Générer les gènes marqueurs avant la pré-annotation
SeurOBJ.markers <- FindAllMarkers(SeurOBJ, only.pos = TRUE)
# Table of most unique genes per cluster
diff.expressed.genes <- SeurOBJ.markers %>%
group_by(cluster) %>%
dplyr::filter(avg_log2FC > 1) # requires library(dplyr)
# Pré-annotation
source("../pre_annot/pre_annot.R", chdir=TRUE)
diff.expressed.genes <- mark_knowns(diff.expressed.genes) # optionnal
type.annot.matrix <- get_annot_matrix(SeurOBJ, diff.expressed.genes)
type.avg.matrix <- get_avg_matrix(SeurOBJ, diff.expressed.genes)
type.corresp.matrix <- get_corresp_matrix(SeurOBJ, diff.expressed.genes)
type.modulated.matrix <- type.annot.matrix * type.avg.matrix
display_heatmap(type.annot.matrix, "Nombre de gènes")
display_heatmap(type.avg.matrix, "Expression différentielle")
display_heatmap(type.corresp.matrix, "% de correspondance")
display_heatmap(type.modulated.matrix, "Somme des log fold-change")
save.plot.png(display_heatmap(type.annot.matrix, "Nombre de gènes"), "./gene_count_matrix.png")
# Display annotations on UMAP
clusters.annot <- pre_labels(type.annot.matrix, seuil = 2)
clusters.annot
# Display annotations on UMAP
clusters.annot.modulated <- pre_labels(type.modulated.matrix, seuil = 2)
clusters.annot.modulated
names(clusters.annot) <- levels(SeurOBJ)
SeurOBJ.labeled <- RenameIdents(SeurOBJ, clusters.annot)
DimPlot(SeurOBJ.labeled, reduction = "umap", label = TRUE, pt.size = 0.25) +
NoLegend() # Pas sur bird : + labs(title = "Annotation par comparaison")
names(clusters.annot.modulated) <- levels(SeurOBJ)
SeurOBJ.labeled.modulated <- RenameIdents(SeurOBJ, clusters.annot.modulated)
DimPlot(SeurOBJ.labeled.modulated, reduction = "umap", label = TRUE, pt.size = 0.25) +
NoLegend() # Pas sur bird : + labs(title = "Annotation par comparaison et expression")