Test du log-rank en R : comparer les courbes de survie

Testez si la survie diffère entre les groupes avec survdiff() — lisez le khi-deux et la p-value, puis tracez une courbe de Kaplan-Meier avec la p-value du log-rank sur le graphique

Apprenez le test du log-rank en R avec les packages survival et survminer. Comparez la survie entre groupes sur les données de cancer du poumon NCCTG avec survdiff(), lisez la statistique du khi-deux, les degrés de liberté et la p-value en langage clair, et tracez le graphique de Kaplan-Meier emblématique avec la p-value du log-rank, la table des effectifs à risque et les bandes de confiance dessus.

Date de publication

25 juin 2026

Modifié

7 juillet 2026

AstucePoints clés
  • Le test du log-rank (survdiff()) est le test standard pour répondre à « la survie diffère-t-elle entre les groupes ? » — traitement vs contrôle, homme vs femme, par stade de la maladie. Il compare les courbes de survie entières, pas la survie à un seul instant.
  • Il est non paramétrique : il ne fait aucune hypothèse sur la forme des distributions de survie. Il travaille sur le nombre d’événements observés vs attendus dans chaque groupe et renvoie une statistique du khi-deux et une p-value.
  • Sur les données de cancer du poumon, la survie diffère significativement entre les sexes : χ² = 10.3, df = 1, p = 0.0013 — les femmes vivent plus longtemps (médiane 426 vs 270 jours).
  • Exécutez-le avec survdiff(Surv(time, status) ~ group, data) ; visualisez-le avec le ggsurvplot(..., pval = TRUE, risk.table = TRUE, conf.int = TRUE) de survminer — les courbes de Kaplan-Meier avec la p-value du log-rank imprimée sur le graphique.
  • Le test du log-rank donne une p-value, pas une taille d’effet. Pour quantifier de combien la survie diffère (un hazard ratio), ajustez un modèle de Cox.

Introduction

Imaginez une cohorte de cancer du poumon : les patients sont suivis pendant des mois, certains décèdent, d’autres sont encore en vie à la fin de l’étude (leur temps de survie est censuré). Vous les répartissez en groupes — par bras de traitement, par sexe, par stade de la maladie — et vous voulez une réponse claire : la survie diffère-t-elle entre les groupes, ou l’écart que vous observez pourrait-il être dû au hasard ?

C’est à cette question que répond le test du log-rank. C’est la méthode la plus largement utilisée pour comparer les courbes de survie de deux groupes ou plus, et c’est le test derrière la p-value que vous voyez sur presque chaque graphique de Kaplan-Meier publié. Utilisez-le dès que vous avez un résultat de type temps jusqu’à l’événement (avec censure) et une variable de groupement catégorielle.

Le test du log-rank est non paramétrique — il ne suppose rien sur la forme des courbes de survie. À chaque instant où un événement survient, il compare le nombre d’événements réellement observés dans chaque groupe au nombre que vous attendriez si les groupes avaient une survie identique, puis accumule ces différences en une seule statistique du khi-deux. Un grand écart entre observés et attendus → une grande statistique → une petite p-value → une preuve que les courbes diffèrent.

Cette leçon exécute le test du log-rank en R avec survival (le test lui-même, survdiff()) et survminer (le graphique de Kaplan-Meier de qualité publication avec la p-value dessus), en utilisant le jeu de données classique de cancer du poumon NCCTG afin que vous puissiez reproduire les chiffres et la figure exacts.

NoteLes hypothèses

Le test du log-rank compare les courbes de survie entières des groupes :

H₀ : les courbes de survie sont identiques dans tous les groupes (aucune différence de survie). Hₐ : les courbes de survie diffèrent dans au moins un groupe.

Il ne dit pas que les courbes diffèrent à un instant précis — il les teste sur tout le suivi.

Les données : l’étude de cancer du poumon NCCTG

Nous utilisons lung, le jeu de données de cancer du poumon du North Central Cancer Treatment Group fourni avec le package survival : la survie de 228 patients atteints d’un cancer du poumon avancé. Chargez le package et regardez les premières lignes — avec survival attaché, lung est disponible directement (pas besoin d’appel à data()) :

library(survival)

head(lung)
  inst time status age sex ph.ecog ph.karno pat.karno meal.cal wt.loss
1    3  306      2  74   1       1       90       100     1175      NA
2    3  455      2  68   1       0       90        90     1225      15
3    3 1010      1  56   1       0       90        90       NA      15
4    5  210      2  57   1       1       90        60     1150      11
5    1  883      2  60   1       0      100        90       NA       0
6   12 1022      1  74   1       1       50        80      513       0

Les colonnes que nous allons utiliser :

  • time — temps de survie en jours.
  • status — statut de censure : 1 = censuré (vivant au dernier suivi), 2 = décédé (l’événement).
  • sex1 = homme, 2 = femme — notre variable de groupement.

L’objet Surv() — la réponse

La réponse dans toute comparaison de survie n’est pas un nombre unique mais une paire temps–événement : combien de temps nous avons observé le patient, et si l’événement (le décès) s’est réellement produit ou si l’observation a été censurée. Vous la construisez avec Surv(time, status). R lit status codé comme 1 = censuré / 2 = événement automatiquement ; un + après un temps marque une observation censurée :

library(survival)

head(Surv(lung$time, lung$status))
[1]  306   455  1010+  210   883  1022+

Cet objet Surv() est le membre de gauche de la formule dans survfit() (qui estime les courbes) comme dans survdiff() (qui les teste).

Estimer les courbes de survie

Avant de tester, estimez la courbe de survie de Kaplan-Meier pour chaque groupe avec survfit(). La formule Surv(time, status) ~ sex dit « estime une courbe distincte pour chaque niveau de sex » :

library(survival)

fit <- survfit(Surv(time, status) ~ sex, data = lung)
fit
Call: survfit(formula = Surv(time, status) ~ sex, data = lung)

        n events median 0.95LCL 0.95UCL
sex=1 138    112    270     212     310
sex=2  90     53    426     348     550

L’affichage donne, par groupe, le nombre de patients (n), le nombre d’événements (décès), et la survie médiane avec son intervalle de confiance à 95 %. Lisez-le directement : la survie médiane est de 270 jours pour les hommes (sex = 1) et de 426 jours pour les femmes (sex = 2) — les femmes semblent vivre plus longtemps. Mais « semble plus longtemps » n’est pas une preuve. Pour décider si cet écart est réel ou pourrait être dû au hasard, exécutez le test du log-rank.

Exécuter le test du log-rank : survdiff()

Le test du log-rank est survdiff(), avec la même formule que celle donnée à survfit() — la réponse Surv(time, status) à gauche, la variable de groupement à droite :

library(survival)

surv_diff <- survdiff(Surv(time, status) ~ sex, data = lung)
surv_diff
Call:
survdiff(formula = Surv(time, status) ~ sex, data = lung)

        N Observed Expected (O-E)^2/E (O-E)^2/V
sex=1 138      112     91.6      4.55      10.3
sex=2  90       53     73.4      5.68      10.3

 Chisq= 10.3  on 1 degrees of freedom, p= 0.001 

Lisez la sortie en langage clair :

  • Le tableau indique, pour chaque groupe, N (patients), les événements Observed (décès réellement survenus), et les événements Expected (décès que vous attendriez si les groupes avaient une survie identique). Les hommes ont eu 112 observés vs 91.6 attendusplus de décès qu’attendu ; les femmes ont eu 53 observés vs 73.4 attendusmoins qu’attendu. Cet écart est le signal.
  • Chisq = 10.3 on 1 degrees of freedom. La statistique du khi-deux accumule les écarts observés-vs-attendus sur chaque instant d’événement. Les degrés de liberté = nombre de groupes − 1 (deux groupes → 1 df). Un χ² plus grand signifie que les courbes des groupes sont plus éloignées que ce que le hasard produirait.
  • p = 0.001 (0.0013). C’est le résultat principal. Comme p < 0.05, nous rejetons H₀ : la survie diffère significativement entre les hommes et les femmes. Combinée aux médianes, la conclusion est que les patientes atteintes d’un cancer du poumon survivent significativement plus longtemps que les hommes dans ces données.
ImportantCe que le test du log-rank vous dit — et ne vous dit pas

Le test du log-rank répond à « les courbes diffèrent-elles ? » avec une p-value — et rien de plus. Il ne donne aucune taille d’effet : il ne vous dit pas de combien la survie d’un groupe est meilleure, ni dans quelle direction (la direction se lit sur les médianes ou le graphique). Pour quantifier la différence comme un hazard ratio (« le risque de décès est 40 % plus faible dans ce groupe »), ajustez un modèle de Cox à risques proportionnels — le test du log-rank et le modèle de Cox sur une seule covariable binaire concordent étroitement, mais seul Cox renvoie le HR.

Visualisez-le : le graphique de Kaplan-Meier avec la p-value du log-rank

Une comparaison de survie n’est complète qu’avec la figure. Le graphique de survie emblématique est le ggsurvplot() de survminer — il trace les courbes de Kaplan-Meier et, surtout, imprime la p-value du log-rank directement sur le graphique avec pval = TRUE. Ajoutez conf.int = TRUE pour les bandes de confiance à 95 % et risk.table = TRUE pour la table des effectifs à risque en dessous (le standard attendu dans le domaine) :

library(survival)
library(survminer)

fit <- survfit(Surv(time, status) ~ sex, data = lung)

ggsurvplot(
  fit,
  data = lung,
  pval = TRUE,                       # the log-rank p-value, ON the plot
  conf.int = TRUE,                   # 95% confidence bands
  risk.table = TRUE,                 # number-at-risk table beneath
  surv.median.line = "hv",           # mark the median survival
  palette = "jco",                   # colourblind-safe journal palette
  legend.labs = c("Male", "Female"),
  legend.title = "Sex",
  xlab = "Time (days)",
  ylab = "Survival probability",
  ggtheme = theme_minimal()
)

A survminer Kaplan-Meier plot comparing survival of male and female lung-cancer patients. The female curve stays above the male curve throughout follow-up, each with a shaded 95% confidence band; the log-rank test p-value of 0.0013 is printed on the plot, and a risk table beneath shows the number of patients still at risk over time.

Lisez le graphique comme le ferait un relecteur : la courbe féminine se situe au-dessus de la courbe masculine à chaque instant — meilleure survie — et l’écart est étayé par la p-value du log-rank p = 0.0013 imprimée sur le panneau. Les lignes médianes en pointillés confirment les 270 vs 426 jours lus depuis survfit(), et la table des effectifs à risque montre combien de patients restent à chaque instant (les courbes tout à droite reposent sur peu de patients, interprétez donc la queue avec prudence).

NoteHypothèse : risques proportionnels (et que faire si elle échoue)

Le test du log-rank est le plus puissant lorsque le hazard ratio est à peu près constant dans le temps — c’est-à-dire lorsque les deux courbes de survie restent proportionnelles et ne se croisent pas. Il reste valide si elles se croisent, mais il perd de la puissance et peut manquer une différence réelle (les différences précoces et tardives s’annulent). Vérifiez d’abord le graphique : si les courbes se croisent ou si l’effet change clairement au cours du suivi (par ex. un bénéfice thérapeutique différé), utilisez un test du log-rank pondéré (Fleming-Harrington), qui peut accentuer les différences précoces ou tardives, ou comparez la durée moyenne de survie restreinte. Le test du log-rank suppose aussi une censure non informative (censure non liée au pronostic).

Rapport

La survie a été comparée entre patients masculins et féminins avec le test du log-rank sur les données de cancer du poumon NCCTG (n = 228, 165 décès). La survie différait significativement entre les sexes (χ²(1) = 10.3, p = 0.0013) : la survie médiane était de 426 jours pour les femmes contre 270 jours pour les hommes, indiquant une survie significativement meilleure chez les femmes. Les courbes de Kaplan-Meier avec des bandes de confiance à 95 % sont présentées dans la Figure 1.

Le test du log-rank travaille sur les événements observés versus attendus. À chaque instant d’événement distinct \(t_i\), avec \(d_i\) événements au total parmi \(n_i\) patients encore à risque, les événements que vous attendriez dans le groupe 1 sous H₀ (survie identique) correspondent à sa part de l’ensemble à risque :

\[ E_{1i} = d_i \cdot \frac{n_{1i}}{n_i} \]

Sommez les événements observés \(O_1 = \sum_i d_{1i}\) et les événements attendus \(E_1 = \sum_i E_{1i}\) sur tous les instants d’événement. La statistique de test compare les deux, mise à l’échelle par la variance \(V\) accumulée sur les instants d’événement :

\[ \chi^2 = \frac{(O_1 - E_1)^2}{V} \]

Sous H₀, ceci suit une distribution du khi-deux à (nombre de groupes − 1) degrés de liberté. Un grand écart observés-moins-attendus → un grand \(\chi^2\) → une petite p-value. Parce qu’il somme les contributions sur chaque instant d’événement, le test du log-rank compare les courbes entières, pas la survie à un seul instant — et parce qu’il ne compte que l’ordre des événements, il n’a besoin d’aucune hypothèse sur la forme de la distribution de survie.

Quelle méthode et quand ?

AstuceChoisir votre comparaison de survie
  • Décrire la survie dans un seul groupe (la courbe, la médiane) → estimation de Kaplan-Meier.
  • Tester si la survie diffère entre 2 groupes catégoriels ou plus (une p-value), risques proportionnels → le test du log-rank (cette leçon), survdiff().
  • Courbes qui se croisent / effet différé ou variable dans le temps → un test du log-rank pondéré (Fleming-Harrington) ou la durée moyenne de survie restreinte.
  • Quantifier la différence comme un hazard ratio, ajuster pour d’autres covariables, ou utiliser un prédicteur continu → le modèle de Cox à risques proportionnels.

Essayez en direct

Exécutez le test du log-rank vous-même — comparez la survie selon une autre variable de groupement, ou modifiez le graphique. Le bac à sable démarre au premier Run.

🟢 Avec un agent IA

Demandez à Prova « exécute un test du log-rank comparant la survie entre mes groupes de traitement, dis-moi en langage clair s’ils diffèrent, et trace un graphique de Kaplan-Meier avec la p-value dessus » — elle répond avec du code survival + survminer que vous pouvez exécuter sur vos propres données. The runtime is the judge. Demandez à Prova →

Problèmes courants

Vos courbes se croisent — le test du log-rank dit « aucune différence » mais elles diffèrent clairement. Cela signale une violation des risques proportionnels, où le test standard perd de la puissance ; voir le rappel sur les risques proportionnels ci-dessus pour la solution (un test du log-rank pondéré ou la durée moyenne de survie restreinte).

Vous avez plus de deux groupes et voulez savoir lesquels diffèrent. survdiff(Surv(time, status) ~ group) avec trois groupes ou plus donne un seul test global (df = groupes − 1) — il vous dit que certains groupes diffèrent, pas lesquels. Faites suivre un test global significatif de tests du log-rank par paires et d’une correction pour la multiplicité : pairwise_survdiff(Surv(time, status) ~ group, data = data) (dans survminer) ajuste les p-values avec Holm par défaut.

Un petit groupe rend le résultat instable. Avec peu de patients — ou peu d’événements — dans un groupe, l’approximation du khi-deux est fragile et les bandes de confiance sont larges. Vérifiez le nombre d’événements par groupe (dans la sortie de survfit() / survdiff()), pas seulement le nombre de patients, avant de faire confiance à une p-value limite.

Questions fréquentes

Le test du log-rank sert à comparer les courbes de survie de deux groupes ou plus — par exemple, pour tester si un traitement améliore la survie par rapport à un contrôle, ou si la survie diffère selon le sexe ou le stade de la maladie. Il travaille sur des données de type temps jusqu’à l’événement avec censure et renvoie une statistique du khi-deux et une p-value pour l’hypothèse nulle selon laquelle les groupes ont une survie identique. C’est le test derrière la p-value sur la plupart des graphiques de Kaplan-Meier publiés.

La p-value teste H₀ selon laquelle les courbes de survie sont identiques dans tous les groupes. Une petite p-value (< 0.05) signifie que vous rejetez H₀ — la survie diffère significativement entre les groupes ; une grande p-value signifie qu’il n’y a pas assez de preuves d’une différence. La p-value vous dit si les courbes diffèrent, pas quel groupe est meilleur ni de combien — lisez la direction sur les temps de survie médians ou le graphique de Kaplan-Meier, et quantifiez l’ampleur de la différence avec un hazard ratio issu d’un modèle de Cox.

Le test du log-rank compare la survie entre groupes catégoriels et ne donne qu’une p-value — aucune taille d’effet, et aucun moyen d’utiliser un prédicteur continu ou d’ajuster pour des facteurs de confusion. Le modèle de Cox à risques proportionnels est une régression : il estime un hazard ratio (la taille d’effet) pour chaque prédicteur, gère les prédicteurs continus et catégoriels, et ajuste chaque effet pour les autres. Sur un seul groupe binaire, les deux concordent étroitement ; utilisez le test du log-rank pour une comparaison rapide de groupes et Cox quand vous avez besoin du hazard ratio ou d’un ajustement sur covariables.

Utilisez le ggsurvplot() de survminer avec pval = TRUE : passez-lui un objet survfit() et survminer calcule le test du log-rank et imprime la p-value sur le panneau. Par exemple ggsurvplot(survfit(Surv(time, status) ~ sex, data = lung), data = lung, pval = TRUE). Ajoutez pval.method = TRUE pour étiqueter aussi le nom du test, et risk.table = TRUE / conf.int = TRUE pour la table des effectifs à risque et les bandes de confiance.

Le test du log-rank est le plus puissant lorsque le hazard ratio est à peu près constant dans le temps (les courbes ne se croisent pas). Si les courbes se croisent ou si l’effet est différé ou variable dans le temps, le test standard perd de la puissance et peut manquer une différence réelle. Utilisez un test du log-rank pondéré (Fleming-Harrington — survdiff(..., rho = 1) accentue les différences précoces, rho = 0 est le test standard) ou comparez la durée moyenne de survie restreinte, et inspectez toujours le graphique de Kaplan-Meier avant de rapporter le résultat.

Testez vos connaissances

  1. Exécutez-le. Dans la cellule interactive ci-dessous, exécutez un test du log-rank comparant la survie selon le score de performance ECOG (ph.ecog) au lieu du sexe. Remplissez le blanc. La différence entre les groupes de score de performance est-elle statistiquement significative ?
  2. Interprétez. Un test du log-rank comparant deux bras de traitement donne χ² = 0.8 on 1 df, p = 0.37. En langage clair, que concluez-vous sur la survie des deux bras ?

Remplissez le blanc avec ph.ecog. La réponse est toujours Surv(time, status). Dans la sortie, lisez la ligne Chisq et sa valeur p : p < 0.05 signifie que la survie des groupes diffère significativement. (Les degrés de liberté seront le nombre de niveaux ECOG moins 1, puisqu’il y a plus de deux groupes.)

surv_diff <- survdiff(Surv(time, status) ~ ph.ecog, data = lung)
surv_diff
#> Chisq ~ 22 on 3 df, p ~ 6e-05 — survival differs significantly across ECOG groups:
#> a worse performance score is associated with worse survival.

Pour la question 2 : χ² = 0.8, p = 0.37 > 0.05 — vous ne rejetez pas H₀. Il n’y a aucune différence significative de survie entre les deux bras ; les données ne fournissent pas de preuve qu’un bras survit plus longtemps que l’autre. (Notez qu’« aucune différence significative » n’est pas une preuve d’« aucune différence » — une étude petite ou sous-dimensionnée peut manquer un effet réel.)

AstuceVérification rapide

Un test du log-rank comparant deux groupes donne une p-value clairement significative (p = 0.001). Pouvez-vous rapporter à partir de ce test seul que « le groupe B a un risque de décès 40 % plus faible que le groupe A » ?

Non. Le test du log-rank ne donne qu’une p-value — une preuve que les courbes diffèrent — pas une taille d’effet. Il ne peut pas vous dire la magnitude (les 40 %) ni même la direction de la différence. Pour rapporter un hazard ratio comme « risque 40 % plus faible », ajustez un modèle de Cox à risques proportionnels ; lisez la direction de la différence sur les temps de survie médians ou le graphique de Kaplan-Meier.

Conclusion

Vous savez maintenant exécuter le test du log-rank en R pour comparer la survie entre groupes : estimez les courbes avec survfit(), testez-les avec survdiff(Surv(time, status) ~ group, data), et lisez la sortie complète — les événements observés vs attendus, la statistique du khi-deux, ses degrés de liberté (groupes − 1), et la p-value. Sur les données de cancer du poumon, la survie différait significativement entre les sexes (χ² = 10.3, p = 0.0013), les femmes survivant plus longtemps. Le graphique de Kaplan-Meier ggsurvplot(..., pval = TRUE) de survminer transforme ce résultat en une figure prête à publier avec la p-value du log-rank dessus. Souvenez-vous des limites du test : il donne une p-value, pas une taille d’effet, et il perd de la puissance lorsque les courbes se croisent — pour le hazard ratio et l’ajustement sur covariables, passez au modèle de Cox.

Leçons connexes

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

Prouvez que vous savez le faire. Maîtrisez toute la série Analyse de survie en R — suivez votre parcours, construisez des projets et obtenez un certificat.

Commencer gratuitement →

Passez à Pro — Prova illimité sur vos propres données et un certificat vérifiable qui atteste la compétence.

dès 15 $/mois facturé annuellement

Passer à Pro →

✓ Vous êtes Pro — continuez. The runtime is the judge.

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

Chaque résultat de cette page a été produit par le code montré, exécuté au moment du build contre un environnement R figé — modifiez n’importe quel bloc et faites Run pour le reproduire vous-même.

Réutilisation

Citation

BibTeX
@online{2026,
  author = {},
  title = {Test du log-rank en R : comparer les courbes de survie},
  date = {2026-06-25},
  url = {https://www.datanovia.com/learn/biostatistics/survival-analysis/log-rank-test},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“Test du log-rank en R : comparer les courbes de survie.” 2026. June 25. https://www.datanovia.com/learn/biostatistics/survival-analysis/log-rank-test.