Gènes marqueurs Seurat & annotation des types cellulaires en R (pbmc3k)

Trouvez les gènes qui définissent chaque regroupement avec FindAllMarkers, lisez les marqueurs PBMC canoniques sur l’UMAP, et attribuez des étiquettes biologiques de types cellulaires pour produire un UMAP annoté

Un guide pratique pour trouver les gènes marqueurs et annoter les types cellulaires dans des données de RNA-seq single-cell avec Seurat. À partir d’un objet pbmc3k regroupé, exécutez FindAllMarkers pour obtenir les gènes qui distinguent chaque regroupement, visualisez les marqueurs PBMC canoniques avec FeaturePlot et VlnPlot, raisonnez de ces marqueurs vers une étiquette de type cellulaire pour chaque regroupement, réétiquetez avec RenameIdents, et produisez l’UMAP annoté que vous mettez dans un article.

Date de publication

29 juin 2026

Modifié

7 juillet 2026

AstucePoints clés
  • Les regroupements 0–8 sont des groupes anonymes de cellules similaires. FindAllMarkers() trouve les gènes que chaque regroupement sur-exprime par rapport à tous les autres — la preuve statistique à partir de laquelle vous annotez.
  • Exécutez-le en positif seulement et légèrement filtré : FindAllMarkers(only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25) (un test de Wilcoxon par gène et par regroupement). Triez par avg_log2FC pour les marqueurs les plus forts de chaque regroupement.
  • Annotez en faisant correspondre les marqueurs à des types cellulaires connus. Tracez les marqueurs PBMC canoniques sur l’UMAP avec FeaturePlot() / VlnPlot() et lisez quel regroupement s’illumine : IL7R → CD4 T, CD14/LYZ → monocytes, MS4A1 → B, CD8A → CD8 T, GNLY/NKG7 → NK, FCER1A → cellules dendritiques, PPBP → plaquettes.
  • RenameIdents() transforme les numéros de regroupement en noms de types cellulaires ; le DimPlot() réétiqueté est la figure emblématique de toute l’analyse.
  • Soyez honnête sur ce que les marqueurs peuvent et ne peuvent pas résoudre. Naive vs memory CD4 T est une distinction réellement subtile, et les regroupements rares (DC, plaquette) reposent sur un seul marqueur fort — étiquetez-les, mais dites-le.

Introduction

Le regroupement vous a donné neuf groupes, étiquetés de 0 à 8. Ces numéros sont arbitraires : le regroupement 0, c’est « 684 cellules que le graphe a placées ensemble », pas « des lymphocytes T ». Cette leçon fait le travail d’interprétation qui rend l’analyse utile — elle nomme les regroupements. La logique est simple et c’est celle que tout immunologiste utilise à la paillasse : trouver les gènes qui sont activés dans un regroupement et éteints dans le reste, reconnaître ces gènes comme les marqueurs d’un type cellulaire connu, et étiqueter le regroupement en conséquence.

Deux étapes suffisent. D’abord, FindAllMarkers() calcule, pour chaque regroupement, les gènes qui le distinguent de toutes les autres cellules — la preuve issue des données. Ensuite, vous faites correspondre les marqueurs aux identités en confrontant une courte liste de marqueurs PBMC canoniques aux regroupements et en raisonnant de la biologie vers un nom. Nous reprenons depuis la leçon de regroupement sur le même objet pbmc3k, de sorte que le workflow se transpose directement à vos propres données regroupées.

Reprendre à partir de C4 : reconstruire l’objet regroupé

Chaque bloc de code ici est autonome : il commence donc par recréer l’objet regroupé de la leçon précédente — charger la matrice 10x, construire l’objet Seurat, filtrer en CQ, normaliser, trouver les gènes variables, mettre à l’échelle, exécuter la PCA, construire le graphe de voisinage, regrouper à la résolution 0.5, et exécuter l’UMAP. C’est exactement l’objet sur lequel vous avez terminé C4 : 2 638 cellules dans 9 regroupements.

library(Seurat)

# Re-establish the clustered object from C2 (QC) + C3 (normalize) + C4 (cluster + UMAP)
pbmc.data <- Read10X("_data/filtered_gene_bc_matrices/hg19")
pbmc <- CreateSeuratObject(pbmc.data, project = "pbmc3k",
                           min.cells = 3, min.features = 200)
pbmc[["percent.mt"]] <- PercentageFeatureSet(pbmc, pattern = "^MT-")
pbmc <- subset(pbmc, subset = nFeature_RNA > 200 & nFeature_RNA < 2500 & percent.mt < 5)
pbmc <- NormalizeData(pbmc)
pbmc <- FindVariableFeatures(pbmc, selection.method = "vst", nfeatures = 2000)
pbmc <- ScaleData(pbmc)
pbmc <- RunPCA(pbmc, features = VariableFeatures(pbmc))
pbmc <- FindNeighbors(pbmc, dims = 1:10)
pbmc <- FindClusters(pbmc, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 2638
Number of edges: 95927

Running Louvain algorithm...
Maximum modularity in 10 random starts: 0.8728
Number of communities: 9
Elapsed time: 0 seconds
pbmc <- RunUMAP(pbmc, dims = 1:10)

table(Idents(pbmc))             # 9 clusters, largest first

  0   1   2   3   4   5   6   7   8 
684 481 476 344 291 162 155  32  13 

Neuf regroupements, de 684 cellules jusqu’à 13. Tout ce qui suit s’exécute sur cet objet.

Trouver les gènes marqueurs de chaque regroupement

Un gène marqueur d’un regroupement est un gène exprimé bien plus dans ce regroupement que dans le reste des cellules. FindAllMarkers() les trouve en testant, un regroupement à la fois, l’expression de chaque gène dans ce regroupement contre toutes les autres cellules avec un test de rang de Wilcoxon, et en renvoyant les gènes qui passent. Trois arguments gardent la sortie centrée sur les marqueurs exploitables :

  • only.pos = TRUE — ne garder que les gènes à la hausse dans le regroupement (c’est la sur-expression qui nomme un type cellulaire ; on n’annote pas à partir des gènes qu’un regroupement n’a pas).
  • min.pct = 0.25 — ignorer les gènes détectés dans moins de 25 % des cellules de l’un ou l’autre groupe (un marqueur présent dans une poignée de cellules n’est pas une caractéristique définissante).
  • logfc.threshold = 0.25 — ignorer les gènes dont le fold-change log₂ est inférieur à 0,25 (sauter les gènes à peine différents ; c’est aussi ce qui rend la fonction assez rapide pour s’exécuter sur chaque regroupement).
library(Seurat)
library(dplyr)
pbmc.data <- Read10X("_data/filtered_gene_bc_matrices/hg19")
pbmc <- CreateSeuratObject(pbmc.data, project = "pbmc3k",
                           min.cells = 3, min.features = 200)
pbmc[["percent.mt"]] <- PercentageFeatureSet(pbmc, pattern = "^MT-")
pbmc <- subset(pbmc, subset = nFeature_RNA > 200 & nFeature_RNA < 2500 & percent.mt < 5)
pbmc <- NormalizeData(pbmc)
pbmc <- FindVariableFeatures(pbmc, selection.method = "vst", nfeatures = 2000)
pbmc <- ScaleData(pbmc)
pbmc <- RunPCA(pbmc, features = VariableFeatures(pbmc))
pbmc <- FindNeighbors(pbmc, dims = 1:10)
pbmc <- FindClusters(pbmc, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 2638
Number of edges: 95927

Running Louvain algorithm...
Maximum modularity in 10 random starts: 0.8728
Number of communities: 9
Elapsed time: 0 seconds
# One Wilcoxon test per gene per cluster; keep up-regulated, well-expressed, clearly-changed genes
markers <- FindAllMarkers(pbmc, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)

# The two strongest markers per cluster, ranked by fold-change
markers %>%
  group_by(cluster) %>%
  slice_max(avg_log2FC, n = 2) %>%
  ungroup() %>%
  as.data.frame()
           p_val avg_log2FC pct.1 pct.2     p_val_adj cluster          gene
1   9.571984e-88   2.397366 0.447 0.108  1.312702e-83       0          CCR7
2   1.354319e-51   2.136530 0.342 0.103  1.857312e-47       0          LEF1
3  7.070375e-139   7.280842 0.299 0.004 9.696312e-135       1         FOLR3
4  3.380744e-121   6.737730 0.277 0.006 4.636352e-117       1       S100A12
5   2.966019e-58   2.089320 0.420 0.111  4.067598e-54       2          AQP3
6   5.030519e-34   1.874084 0.263 0.070  6.898854e-30       2        CD40LG
7  2.397625e-272   7.379757 0.564 0.009 3.288103e-268       3     LINC00926
8  2.745016e-237   7.135051 0.488 0.007 3.764515e-233       3        VPREB3
9  7.254885e-165   4.407540 0.577 0.055 9.949349e-161       4          GZMK
10  3.269389e-88   3.736401 0.419 0.061  4.483640e-84       4          GZMH
11 8.230606e-168   5.881212 0.370 0.005 1.128745e-163       5           CKB
12 1.689064e-212   5.428812 0.506 0.010 2.316382e-208       5        CDKN1C
13 8.097030e-179   6.221917 0.471 0.013 1.110427e-174       6        AKR1C3
14 5.382427e-112   6.065475 0.290 0.007 7.381461e-108       6        SH2D1B
15 1.456261e-207   8.026573 0.500 0.002 1.997116e-203       7      SERPINF1
16 1.480764e-220   7.633833 0.812 0.011 2.030720e-216       7        FCER1A
17  0.000000e+00  14.358608 0.615 0.000  0.000000e+00       8        LY6G6F
18 7.321398e-222  13.925994 0.385 0.000 1.004057e-217       8 RP11-879F14.2

Lisez les colonnes. avg_log2FC est le fold-change log₂ moyen (regroupement vs reste) — la force du marqueur ; pct.1 et pct.2 sont la fraction de cellules exprimant le gène à l’intérieur du regroupement vs à l’extérieur. Un bon marqueur a un avg_log2FC élevé et un pct.1 bien au-dessus de pct.2. Le meilleur résultat du regroupement 0, CCR7 (avg_log2FC ≈ 2,4, détecté dans 45 % de ses cellules contre 11 % ailleurs), en est un exemple typique.

Certains regroupements se signalent d’eux-mêmes ici — CCR7/LEF1 (regroupement 0) sont des gènes de lymphocytes T naïfs, CD79A (regroupement 3) est un gène de lymphocyte B, GZMK (regroupement 4) est un gène de lymphocyte T cytotoxique, FCER1A (regroupement 7) est un gène de cellule dendritique. D’autres (FOLR3, CKB, AKR1C3) sont de vrais marqueurs très spécifiques, mais pas les noms que la plupart des gens reconnaissent. Donc plutôt que d’annoter gène par gène à partir de ce tableau, nous confrontons un court panel de marqueurs PBMC canoniques aux regroupements — la façon rapide et robuste d’attribuer les identités.

Visualiser les marqueurs canoniques sur l’UMAP

La façon fiable d’annoter consiste à prendre une poignée de marqueurs PBMC classiques — un ou deux par type cellulaire attendu — et à demander quel regroupement exprime chacun d’eux. FeaturePlot() colore l’UMAP selon l’expression d’un gène, donc la réponse est visuelle : le regroupement qui s’illumine pour CD14 correspond aux monocytes, celui qui s’illumine pour MS4A1 correspond aux lymphocytes B, et ainsi de suite.

library(Seurat)
pbmc.data <- Read10X("_data/filtered_gene_bc_matrices/hg19")
pbmc <- CreateSeuratObject(pbmc.data, project = "pbmc3k",
                           min.cells = 3, min.features = 200)
pbmc[["percent.mt"]] <- PercentageFeatureSet(pbmc, pattern = "^MT-")
pbmc <- subset(pbmc, subset = nFeature_RNA > 200 & nFeature_RNA < 2500 & percent.mt < 5)
pbmc <- NormalizeData(pbmc)
pbmc <- FindVariableFeatures(pbmc, selection.method = "vst", nfeatures = 2000)
pbmc <- ScaleData(pbmc)
pbmc <- RunPCA(pbmc, features = VariableFeatures(pbmc))
pbmc <- FindNeighbors(pbmc, dims = 1:10)
pbmc <- FindClusters(pbmc, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 2638
Number of edges: 95927

Running Louvain algorithm...
Maximum modularity in 10 random starts: 0.8728
Number of communities: 9
Elapsed time: 0 seconds
pbmc <- RunUMAP(pbmc, dims = 1:10)

# One canonical marker per expected PBMC population
FeaturePlot(pbmc, features = c("IL7R", "CD14", "LYZ", "MS4A1", "CD8A",
                               "FCGR3A", "GNLY", "FCER1A", "PPBP"))

A 3-by-3 grid of UMAP plots of the pbmc3k cells, each coloured by one canonical marker gene (grey = low, blue = high). IL7R is high across the large T-cell island; CD14 is confined to the central monocyte island; LYZ is bright across both monocyte clusters and the dendritic-cell cluster; MS4A1 marks the separate B-cell island; CD8A highlights a sub-region of the T-cell island; FCGR3A picks out one monocyte tip plus the NK cells; GNLY is high in the NK cluster at the edge of the T-cell island; FCER1A lights up a single tiny dendritic-cell cluster; PPBP marks a single, isolated tiny platelet cluster.

Chaque panneau localise un marqueur dans une région de la carte. IL7R (récepteur de l’interleukine-7) est élevé sur tout le grand îlot supérieur — les lymphocytes T CD4. CD14 et LYZ marquent les monocytes ; LYZ déborde aussi dans le regroupement des cellules dendritiques (les deux sont myéloïdes). MS4A1 marque proprement l’îlot séparé des lymphocytes B. CD8A et GNLY/NKG7 séparent le coin cytotoxique en lymphocytes T CD8 et cellules NK. FCER1A et PPBP illuminent chacun un seul tout petit regroupement — les cellules dendritiques et les plaquettes.

Un graphique en violon dit la même chose quantitativement : la distribution de l’expression de chaque marqueur au sein de chaque regroupement, de sorte que vous voyez non seulement un gène est activé, mais aussi avec quelle intensité et dans quelle fraction des cellules.

library(Seurat)
pbmc.data <- Read10X("_data/filtered_gene_bc_matrices/hg19")
pbmc <- CreateSeuratObject(pbmc.data, project = "pbmc3k",
                           min.cells = 3, min.features = 200)
pbmc[["percent.mt"]] <- PercentageFeatureSet(pbmc, pattern = "^MT-")
pbmc <- subset(pbmc, subset = nFeature_RNA > 200 & nFeature_RNA < 2500 & percent.mt < 5)
pbmc <- NormalizeData(pbmc)
pbmc <- FindVariableFeatures(pbmc, selection.method = "vst", nfeatures = 2000)
pbmc <- ScaleData(pbmc)
pbmc <- RunPCA(pbmc, features = VariableFeatures(pbmc))
pbmc <- FindNeighbors(pbmc, dims = 1:10)
pbmc <- FindClusters(pbmc, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 2638
Number of edges: 95927

Running Louvain algorithm...
Maximum modularity in 10 random starts: 0.8728
Number of communities: 9
Elapsed time: 0 seconds
VlnPlot(pbmc, features = c("IL7R", "CD14", "MS4A1", "CD8A",
                           "FCGR3A", "GNLY", "FCER1A", "PPBP"),
        ncol = 4, pt.size = 0)

A grid of violin plots, one panel per marker gene, with the nine clusters (0–8) on the x-axis and expression on the y-axis. IL7R is high in clusters 0 and 2 (the CD4 T cells); CD14 is high only in cluster 1; MS4A1 only in cluster 3; CD8A in cluster 4; FCGR3A in clusters 5 and 6 (highest in the FCGR3A+ monocytes); GNLY in cluster 6; FCER1A in cluster 7; PPBP in cluster 8. Each marker is high in exactly one or two clusters and near zero elsewhere, confirming each is cluster-specific.

Les violons rendent la spécificité de regroupement indéniable : chaque marqueur est élevé dans un ou deux regroupements et plat, proche de zéro, dans le reste. CD14 est élevé uniquement dans le regroupement 1 ; MS4A1 uniquement dans le regroupement 3 ; PPBP uniquement dans le regroupement 8. Ce motif un-à-un est exactement ce qui vous permet d’attribuer un nom à chaque regroupement en toute confiance.

Faire correspondre les regroupements aux types cellulaires

Lisez maintenant les marqueurs sur les graphiques et raisonnez vers une étiquette pour chaque regroupement. Le tableau ci-dessous est le résultat de ce raisonnement — chaque ligne présente la preuve issue des marqueurs de cette exécution plus le panel canonique, et l’identité qu’elle implique.

Regroupement Marqueurs qui l’ont défini (cette exécution) Type cellulaire
0 IL7R, CCR7, LEF1 (élevés), aucun gène cytotoxique Naive CD4 T
1 CD14, LYZ, S100A8/9/12 CD14+ Mono
2 IL7R élevé mais CCR7/LEF1 faibles, S100A4, CD2 Memory CD4 T
3 MS4A1, CD79A B
4 CD8A, GZMK, NKG7 CD8 T
5 FCGR3A, MS4A7, CDKN1C, CD14 faible FCGR3A+ Mono
6 GNLY, NKG7 très élevés, aucun CD8A NK
7 FCER1A, CST3 DC
8 PPBP, PF4 Platelet

Quelques-unes de ces attributions méritent que leur raisonnement soit explicité, car l’annotation est un jugement, pas une simple consultation :

  • Les regroupements 0 et 2 sont tous deux des lymphocytes T CD4, et les distinguer est l’appréciation subtile. Les deux sont IL7R-élevés sans gènes cytotoxiques, donc les deux sont des lymphocytes T auxiliaires (CD4). Ce qui les sépare, c’est CCR7 et LEF1 : élevés dans le regroupement 0 (une signature naïve) et faibles dans le regroupement 2, qui porte à la place S100A4 (un marqueur de mémoire/activation). Ils sont côte à côte sur l’UMAP pour exactement cette raison — leur biologie est proche. Appeler l’un « naïf » et l’autre « mémoire » est défendable ici, mais c’est l’attribution que vous signaleriez comme la moins certaine.
  • Les regroupements 4 et 6 partagent les marqueurs cytotoxiques NKG7 et GNLY. Ce qui les sépare, c’est CD8A : présent dans le regroupement 4 (lymphocytes T CD8) et absent du regroupement 6, dont les GNLY/NKG7 sont extrêmement élevés sans CD8 — la signature des cellules NK.
  • Les regroupements 5 vs 1 sont tous deux des monocytes, mais de types différents. Le regroupement 1 est CD14-élevé (classique, CD14+) ; le regroupement 5 est CD14-faible et FCGR3A/MS4A7-élevé (non classique, FCGR3A+).
  • Les regroupements 7 (DC) et 8 (plaquette) sont rares — 32 et 13 cellules. Chacun repose sur un seul marqueur très fort (FCER1A pour les cellules dendritiques, PPBP pour les plaquettes). Les marqueurs sont sans ambiguïté, mais avec si peu de cellules, traitez ces étiquettes comme bien étayées plutôt que richement caractérisées.

Cette correspondance coïncide avec l’annotation pbmc3k établie de longue date — rassurant, mais notez que nous l’avons dérivée des propres marqueurs de cette exécution, sans la supposer. Annotez toujours à partir de vos données : les numéros de regroupement sont arbitraires et changent avec les paramètres, de sorte que l’identité d’un regroupement vient de ses gènes, jamais de son numéro.

Réétiqueter les regroupements et tracer l’UMAP annoté

La correspondance étant arrêtée, RenameIdents() remplace les numéros de regroupement par des noms de types cellulaires, dans l’ordre des regroupements (0 → 8). Le DimPlot() réétiqueté est la figure vers laquelle toute l’analyse tendait — une carte du sang, avec chaque population nommée.

library(Seurat)
pbmc.data <- Read10X("_data/filtered_gene_bc_matrices/hg19")
pbmc <- CreateSeuratObject(pbmc.data, project = "pbmc3k",
                           min.cells = 3, min.features = 200)
pbmc[["percent.mt"]] <- PercentageFeatureSet(pbmc, pattern = "^MT-")
pbmc <- subset(pbmc, subset = nFeature_RNA > 200 & nFeature_RNA < 2500 & percent.mt < 5)
pbmc <- NormalizeData(pbmc)
pbmc <- FindVariableFeatures(pbmc, selection.method = "vst", nfeatures = 2000)
pbmc <- ScaleData(pbmc)
pbmc <- RunPCA(pbmc, features = VariableFeatures(pbmc))
pbmc <- FindNeighbors(pbmc, dims = 1:10)
pbmc <- FindClusters(pbmc, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 2638
Number of edges: 95927

Running Louvain algorithm...
Maximum modularity in 10 random starts: 0.8728
Number of communities: 9
Elapsed time: 0 seconds
pbmc <- RunUMAP(pbmc, dims = 1:10)

# Map cluster numbers (0-8, in order) to the cell types we read from the markers
new.ids <- c("Naive CD4 T", "CD14+ Mono", "Memory CD4 T", "B", "CD8 T",
             "FCGR3A+ Mono", "NK", "DC", "Platelet")
names(new.ids) <- levels(pbmc)
pbmc <- RenameIdents(pbmc, new.ids)

DimPlot(pbmc, reduction = "umap", label = TRUE, pt.size = 0.5) + NoLegend()

A UMAP of the 2,638 pbmc3k cells with every cluster relabelled as a cell type. The large T/NK island holds Naive CD4 T and Memory CD4 T cells next to each other, with CD8 T and then NK extending to one edge. The monocyte island holds CD14+ Mono and FCGR3A+ Mono with the small DC cluster beside them. The B cells form their own separate island, and the Platelets a tiny isolated group. Each point is one cell and each cell type is labelled at its centre.

Lisez-la comme la biologie qu’elle encode désormais. Les lymphocytes T CD4 (naïfs et mémoire) se regroupent avec les lymphocytes T CD8 et les cellules NK dans un seul territoire connecté — le continuum lymphocytaire, avec les populations cytotoxiques (lymphocytes T CD8, NK) à un bord. Les deux populations de monocytes forment un second îlot, avec les cellules dendritiques à proximité (toutes myéloïdes). Les lymphocytes B se tiennent à l’écart comme leur propre îlot, et les plaquettes — la population la plus distincte de toutes — sont complètement isolées. La géométrie que vous voyiez sous forme de regroupements numérotés dans C4 est maintenant une carte étiquetée du sang périphérique.

Rapportez-le comme ceci. Une phrase de méthodes que vous pouvez coller dans un article :

Les cellules ont été regroupées sur les 10 premières composantes principales (FindNeighbors/FindClusters, résolution 0.5), donnant 9 regroupements. Les gènes marqueurs ont été identifiés avec FindAllMarkers (test de rang de Wilcoxon, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25), et les regroupements ont été annotés par des marqueurs PBMC canoniques (IL7R, CCR7, S100A4, CD14, LYZ, MS4A1, CD8A, GZMK, FCGR3A, MS4A7, GNLY, NKG7, FCER1A, CST3, PPBP) comme lymphocytes T CD4 naïfs, lymphocytes T CD4 mémoire, lymphocytes T CD8, cellules NK, monocytes CD14+, monocytes FCGR3A+, lymphocytes B, cellules dendritiques et plaquettes (Seurat 5.4.0).

Problèmes fréquents

Les meilleurs marqueurs par fold-change ne sont pas toujours ceux des manuels. Trier par avg_log2FC fait remonter les gènes les plus spécifiques, qui peuvent être obscurs (FOLR3, LY6G6F) plutôt que les marqueurs célèbres (CD14, PPBP). C’est attendu — un gène rare, parfaitement spécifique d’un regroupement, obtient un fold-change énorme. Utilisez le tableau des meilleurs marqueurs non biaisé pour caractériser un regroupement, mais annotez les identités à partir d’un panel de marqueurs canoniques sélectionné, tracé avec FeaturePlot/VlnPlot, où ce sont les gènes des manuels qui nomment.

RenameIdents() attribue les étiquettes par position, donc l’ordre compte. names(new.ids) <- levels(pbmc) apparie vos étiquettes avec les identités actuelles dans l’ordre (0, 1, 2, …). Si votre vecteur d’étiquettes est dans le désordre, vous étiquetterez tous les regroupements à tort en toute confiance. Après le renommage, vérifiez toujours avec un DimPlot et quelques VlnPlot que chaque regroupement nommé exprime le marqueur que vous annoncez.

Un regroupement sans marqueurs clairs, ou portant les marqueurs de deux types cellulaires à la fois. Parfois un regroupement exprime les marqueurs de deux lignées (un possible doublet) ou n’a aucun gène distinctif (cellules de basse qualité passées au travers du CQ). Ne forcez pas une étiquette. Signalez-la, envisagez de resserrer le CQ ou la résolution, et — pour les doublets en particulier — un outil dédié comme DoubletFinder est la bonne étape suivante.

Questions fréquentes

Exécutez FindAllMarkers(pbmc, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25) sur votre objet regroupé. Il réalise un test de rang de Wilcoxon pour chaque gène de chaque regroupement (regroupement vs toutes les autres cellules) et renvoie les gènes à la hausse, bien exprimés et nettement modifiés. Triez les marqueurs de chaque regroupement par avg_log2FC pour voir ses gènes définissants les plus forts.

FindAllMarkers() teste chaque regroupement contre tous les autres en un seul appel — utilisez-le pour annoter l’ensemble du jeu de données. FindMarkers(ident.1 = "A", ident.2 = "B") compare deux groupes spécifiques — utilisez-le quand vous voulez les gènes différentiellement exprimés entre, par exemple, deux sous-ensembles de lymphocytes T, ou un regroupement contre un autre.

Tracez un court panel de marqueurs canoniques pour votre tissu (pour les PBMC : IL7R, CD14, LYZ, MS4A1, CD8A, FCGR3A, GNLY, NKG7, FCER1A, PPBP) avec FeaturePlot() ou VlnPlot(), voyez quel regroupement chaque marqueur illumine, puis faites correspondre regroupement → type cellulaire et appliquez-le avec RenameIdents(). Dérivez toujours la correspondance des marqueurs de vos propres données — les numéros de regroupement sont arbitraires et changent avec les paramètres.

avg_log2FC est le fold-change log₂ moyen du gène dans le regroupement par rapport à toutes les autres cellules (plus élevé = marqueur plus fort). pct.1 est la fraction de cellules dans le regroupement exprimant le gène ; pct.2 est la fraction à l’extérieur. Un marqueur fort a un avg_log2FC élevé et un pct.1 bien plus grand que pct.2.

Pour le sang périphérique : IL7R/CCR7 (lymphocytes T CD4 naïfs), IL7R/S100A4 (lymphocytes T CD4 mémoire), CD8A/GZMK (lymphocytes T CD8), GNLY/NKG7 (NK), CD14/LYZ (monocytes CD14+), FCGR3A/MS4A7 (monocytes FCGR3A+), MS4A1/CD79A (lymphocytes B), FCER1A/CST3 (cellules dendritiques), et PPBP/PF4 (plaquettes).

Testez vos connaissances

À partir de l’objet pbmc3k regroupé, exécutez FindAllMarkers avec les réglages standard, extrayez les 5 meilleurs marqueurs du regroupement 3 par avg_log2FC, et confirmez avec un VlnPlot de MS4A1 que le regroupement 3 correspond aux lymphocytes B.

Filtrez le data frame des marqueurs sur cluster == 3, puis slice_max(avg_log2FC, n = 5). VlnPlot(pbmc, features = "MS4A1") montre la distribution par regroupement — le regroupement des lymphocytes B devrait être le seul à être élevé.

library(Seurat)
library(dplyr)
pbmc.data <- Read10X("_data/filtered_gene_bc_matrices/hg19")
pbmc <- CreateSeuratObject(pbmc.data, project = "pbmc3k",
                           min.cells = 3, min.features = 200)
pbmc[["percent.mt"]] <- PercentageFeatureSet(pbmc, pattern = "^MT-")
pbmc <- subset(pbmc, subset = nFeature_RNA > 200 & nFeature_RNA < 2500 & percent.mt < 5)
pbmc <- NormalizeData(pbmc)
pbmc <- FindVariableFeatures(pbmc, selection.method = "vst", nfeatures = 2000)
pbmc <- ScaleData(pbmc)
pbmc <- RunPCA(pbmc, features = VariableFeatures(pbmc))
pbmc <- FindNeighbors(pbmc, dims = 1:10)
pbmc <- FindClusters(pbmc, resolution = 0.5)

markers <- FindAllMarkers(pbmc, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)

markers %>%
  filter(cluster == 3) %>%
  slice_max(avg_log2FC, n = 5)        # LINC00926, VPREB3, CD79A, ... — all B-cell genes

VlnPlot(pbmc, features = "MS4A1")     # high only in cluster 3

Les meilleurs marqueurs du regroupement 3 incluent CD79A et MS4A1 — deux gènes de lymphocytes B — et le violon de MS4A1 est élevé dans le seul regroupement 3. L’étiquette « lymphocytes B » est bien étayée.

A. Lymphocytes T CD8 — ils expriment des gènes cytotoxiques. B. Cellules NK — marqueurs cytotoxiques sans CD8. C. Monocytes CD14+.

B. Cellules NK. Les lymphocytes T CD8 comme les cellules NK expriment les gènes cytotoxiques GNLY et NKG7, donc ceux-ci seuls ne les distinguent pas. Le discriminant est CD8A : présent dans les lymphocytes T CD8, absent des cellules NK. Des marqueurs cytotoxiques élevés sans CD8A, c’est la signature NK.

Conclusion

L’annotation est la récompense du workflow single-cell, et elle tient en deux gestes. FindAllMarkers(only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25) vous donne les gènes qui définissent chaque regroupement, et un panel sélectionné de marqueurs canoniques — tracé avec FeaturePlot et VlnPlot — vous indique de quel type cellulaire connu relève chaque regroupement. Vous avez raisonné des marqueurs vers les identités (naïf vs mémoire CD4 T d’après CCR7 ; CD8 T vs NK d’après CD8A ; monocytes classiques vs non classiques d’après CD14 vs FCGR3A), réétiqueté avec RenameIdents(), et tracé l’UMAP annoté — une carte nommée du sang périphérique. La leçon durable : les numéros de regroupement sont arbitraires, les identités viennent des gènes, et une annotation honnête dit quelles étiquettes sont certaines et lesquelles relèvent du jugement.

Cela achève l’analyse guidée de pbmc3k — d’une matrice 10x brute jusqu’à des types cellulaires nommés. Aller plus loin signifie généralement plus de cellules et plus de conditions : intégrer plusieurs échantillons, corriger les effets de lot, scorer les états cellulaires, ou modéliser des trajectoires de différenciation — des analyses à la fois lourdes en pipeline et en calcul. C’est là qu’un environnement de calcul géré gagne sa place : les leçons gratuites enseignent le moteur (Seurat), et l’exécuter à grande échelle sur de vrais jeux de données, c’est précisément ce pour quoi Arkon est conçu.

Leçons connexes

🟢 Avec un agent IA

Demandez à Prova « comment trouver les gènes marqueurs de mes regroupements Seurat et les annoter en types cellulaires ? » — elle répond avec du code R que vous pouvez exécuter sur votre propre objet, lance FindAllMarkers, trace vos marqueurs canoniques avec FeaturePlot/VlnPlot, et vous aide à raisonner des marqueurs vers une correspondance RenameIdents. The runtime is the judge. Demander à Prova →

Cette page vous a-t-elle été utile ?

Recevez les nouvelles leçons R & Python par e-mail

Pratique, reproductible, sans spam. Désinscription à tout moment.

Double opt-in. Nous ne partageons jamais votre e-mail.

Partager cette pageXLinkedInRedditHN
Note

Cette leçon est reproductible : chaque figure et chaque nombre ont été produits par le code montré — copiez n’importe quel bloc et exécutez-le pour les reproduire. The runtime is the judge.

Références

  • Hao, Y., et al. (2021). Integrated analysis of multimodal single-cell data (Seurat v4). Cell, 184(13), 3573–3587.
  • Satija, R., Farrell, J. A., Gennert, D., Schier, A. F., & Regev, A. (2015). Spatial reconstruction of single-cell gene expression data. Nature Biotechnology, 33(5), 495–502.
  • Stuart, T., et al. (2019). Comprehensive integration of single-cell data. Cell, 177(7), 1888–1902.
  • 10x Genomics. 3k PBMCs from a Healthy Donor — la matrice gène–code-barres filtrée pbmc3k canonique (Cell Ranger 1.1.0).

Réutilisation

Citation

BibTeX
@online{2026,
  author = {},
  title = {Gènes marqueurs Seurat \& annotation des types cellulaires en
    R (pbmc3k)},
  date = {2026-06-29},
  url = {https://www.datanovia.com/learn/bioinformatics/single-cell/scrnaseq-marker-genes-annotation.html},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“Gènes marqueurs Seurat & annotation des types cellulaires en R (pbmc3k).” 2026. June 29. https://www.datanovia.com/learn/bioinformatics/single-cell/scrnaseq-marker-genes-annotation.html.