library(survival)
head(lung[, c("time", "status", "sex")]) time status sex
1 306 2 1
2 455 2 1
3 1010 1 1
4 210 2 1
5 883 2 1
6 1022 1 1
survdiff(rho = ) (Peto-Peto)FH(p, q) avec survMiscQuand les courbes de survie se croisent ou que l’effet du traitement est retardé, le test log-rank standard perd en puissance — pondérez les événements précoces ou tardifs avec survdiff(rho=) et survMisc::comp()
Exécutez des tests log-rank pondérés en R lorsque les risques proportionnels font défaut. Utilisez survdiff(rho = 1) pour le test de Peto-Peto à emphase précoce et survMisc::comp() pour la famille Fleming-Harrington FH(p, q), comparez les p-values au test log-rank standard sur les données pulmonaires NCCTG, et apprenez quel poids préspécifier pour les effets retardés, précoces ou qui se croisent — sans pêcher.
25 juin 2026
7 juillet 2026
survdiff(..., rho = 1) de base — le test de Peto-Peto, qui met l’accent sur les différences précoces ; rho = 0 est le test standard. La famille complète est Fleming-Harrington FH(p, q) via survMisc::comp() — FH(1, 0) précoce, FH(0, 1) tardif.Le test log-rank est l’outil par défaut pour comparer la survie entre groupes, et pour une bonne raison — mais il a un angle mort. Il donne un poids égal à tous les temps d’événement, ce qui en fait le test le plus puissant uniquement quand le hazard ratio est à peu près constant sur le suivi (risques proportionnels). Les essais modernes brisent régulièrement cette hypothèse :
Dans ces trois cas, le test log-rank standard perd en puissance et peut manquer une différence réelle. Un test log-rank pondéré corrige cela en mettant l’accent sur la partie du suivi où vit réellement la différence. Cette leçon les exécute en R — le test rapide de Peto-Peto avec le survdiff(..., rho = ) de base, puis la famille complète Fleming-Harrington FH(p, q) avec survMisc — sur les données du cancer du poumon NCCTG, en comparant chaque résultat au test standard.
Un test log-rank pondéré est la réponse à un problème spécifique : les risques non proportionnels. Avant d’y recourir, confirmez que le problème existe — inspectez les courbes de Kaplan-Meier et exécutez la vérification formelle dans Tester l’hypothèse des risques proportionnels (cox.zph()). Si les risques sont proportionnels, le test log-rank standard est le choix le plus puissant et un test pondéré ne fait que vous coûter de la puissance.
La statistique du log-rank accumule, sur chaque temps d’événement \(t_i\), l’écart entre les événements observés dans un groupe et les événements attendus sous H₀. Un test pondéré multiplie chaque écart par un poids \(w(t_i)\) avant la somme :
La famille Fleming-Harrington paramètre le poids avec deux nombres, p et q, appliqués à l’estimation de survie de Kaplan-Meier groupée \(\hat S(t)\) :
\[ w(t_i) = \hat S(t_i)^{\,p} \cdot \left[1 - \hat S(t_i)\right]^{\,q} \]
Tôt dans le suivi, \(\hat S(t)\) est proche de 1, donc \(\hat S(t)^p\) est grand et \([1-\hat S(t)]^q\) est petit ; tard dans le suivi, l’inverse tient. Cela donne un cadran net :
FH(0, 0) → \(w = 1\) : le test log-rank standard.FH(1, 0) → \(w = \hat S(t)\) : emphase précoce (poids élevé tant que la survie est élevée).FH(0, 1) → \(w = 1 - \hat S(t)\) : emphase tardive (le poids croît à mesure que les patients meurent — pour les effets retardés).FH(1, 1) → poids maximal au milieu du suivi.La fonction survdiff() de base prend un paramètre unique, rho, qui n’est pas le p de Fleming-Harrington. survdiff(rho = 0) est le test standard ; survdiff(rho = 1) est le test de Peto-Peto, qui pondère par \(\hat S(t)\) — emphase précoce (équivalent au Fleming-Harrington FH(1, 0)). Pour la famille complète à deux paramètres — y compris l’emphase tardive — utilisez survMisc::comp(), qui prend p et q directement.
Nous utilisons lung, le jeu de données du North Central Cancer Treatment Group du package survival : la survie de 228 patients atteints d’un cancer du poumon avancé. Avec survival attaché, lung est disponible directement — aucun appel à data() n’est nécessaire. Nous comparons la survie selon le sex (1 = homme, 2 = femme) :
time status sex
1 306 2 1
2 455 2 1
3 1010 1 1
4 210 2 1
5 883 2 1
6 1022 1 1
time — temps de survie en jours.status — 1 = censuré, 2 = décédé (l’événement).sex — 1 = homme, 2 = femme (la variable de groupe).Regardez les courbes avant de tester quoi que ce soit. Le graphique principal ci-dessous marque la portion précoce du suivi — la période qu’un test à emphase précoce met en valeur :
library(survival)
library(survminer)
fit <- survfit(Surv(time, status) ~ sex, data = lung)
ggsurvplot(
fit,
data = lung,
conf.int = TRUE,
palette = "jco", # colourblind-safe journal palette
legend.labs = c("Male", "Female"),
legend.title = "Sex",
xlab = "Time (days)",
ylab = "Survival probability",
ggtheme = theme_minimal()
)$plot +
ggplot2::annotate(
"rect", xmin = 0, xmax = 300, ymin = 0, ymax = 1,
alpha = 0.08, fill = "#3a86d4"
) +
ggplot2::annotate(
"text", x = 150, y = 0.05, label = "early emphasis",
size = 3, colour = "#3a86d4"
)
Les courbes se séparent tôt — la courbe féminine passe au-dessus de la courbe masculine dès les premières centaines de jours — et l’écart est le plus large tant que la plupart des patients sont encore à risque. Cette forme prédit ce que nous sommes sur le point de voir : un test à emphase précoce sera le plus puissant ici, et un test à emphase tardive sera le plus faible.
survdiff(rho = ) (Peto-Peto)Le survdiff() de base vous donne gratuitement un test pondéré à un paramètre. rho = 0 est le test log-rank standard ; rho = 1 est le test de Peto-Peto, qui pondère par \(\hat S(t)\) — emphase précoce. Exécutez les deux et comparez :
Call:
survdiff(formula = Surv(time, status) ~ sex, data = lung, rho = 0)
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
Call:
survdiff(formula = Surv(time, status) ~ sex, data = lung, rho = 1)
N Observed Expected (O-E)^2/E (O-E)^2/V
sex=1 138 70.4 55.6 3.95 12.7
sex=2 90 28.7 43.5 5.04 12.7
Chisq= 12.7 on 1 degrees of freedom, p= 4e-04
Lisez les deux côte à côte :
rho = 0) : χ² = 10.3 sur 1 df, p = 0.0013. La survie diffère significativement entre les sexes — le résultat que vous rapporteriez sous risques proportionnels.rho = 1) : χ² = 12.7 sur 1 df, p = 0.0004. Le test à emphase précoce est plus significatif (un χ² plus grand, un p plus petit). C’est la signature d’une différence précoce : mettre plus de poids sur les premiers temps d’événement — où les courbes sont les plus éloignées et où le plus de patients sont à risque — aiguise le signal.Remarquez que les comptages Observed et Expected dans le tableau rho = 1 sont fractionnaires et plus petits que dans le tableau standard : ce sont des comptages d’événements pondérés, pas des décès bruts. C’est attendu — seuls le χ² et la p-value sont comparables entre les deux tests.
FH(p, q) avec survMiscsurvdiff() ne règle que l’emphase précoce. Pour la famille complète à deux paramètres — y compris l’emphase tardive pour les effets retardés — utilisez survMisc::comp(). Elle prend un objet ten (construit à partir d’un ajustement survfit()) et des vecteurs de valeurs p et q, puis exécute d’un coup chaque poids Fleming-Harrington :
Q Var Z pNorm
1 -20.4183 40.4280 -3.2113 6
n -3148.0000 795286.3234 -3.5300 4
sqrtN -248.2336 4952.6740 -3.5273 5
S1 -14.6872 16.9922 -3.5630 3
S2 -14.5848 16.7542 -3.5632 2
FH_p=1_q=0 -14.8065 17.2608 -3.5639 1
FH_p=0_q=1 -5.6118 9.1175 -1.8585 7
maxAbsZ Var Q pSupBr
1 2.2095e+01 4.0428e+01 3.4750 6
n 3.1750e+03 7.9529e+05 3.5603 5
sqrtN 2.5507e+02 4.9527e+03 3.6244 1
S1 1.4917e+01 1.6992e+01 3.6188 3
S2 1.4802e+01 1.6754e+01 3.6163 4
FH_p=1_q=0 1.5039e+01 1.7261e+01 3.6198 2
FH_p=0_q=1 7.0563e+00 9.1175e+00 2.3369 7
comp() imprime un tableau compact de plusieurs familles de poids ; la colonne pNorm de l’impression est un rang (1 = le plus significatif), pas la p-value — les statistiques réelles vivent dans l’objet ajusté. Extrayez les trois qui nous intéressent dans un résumé propre :
Q Var Z pNorm
1 -20.4183 40.4280 -3.2113 6
n -3148.0000 795286.3234 -3.5300 4
sqrtN -248.2336 4952.6740 -3.5273 5
S1 -14.6872 16.9922 -3.5630 3
S2 -14.5848 16.7542 -3.5632 2
FH_p=1_q=0 -14.8065 17.2608 -3.5639 1
FH_p=0_q=1 -5.6118 9.1175 -1.8585 7
maxAbsZ Var Q pSupBr
1 2.2095e+01 4.0428e+01 3.4750 6
n 3.1750e+03 7.9529e+05 3.5603 5
sqrtN 2.5507e+02 4.9527e+03 3.6244 1
S1 1.4917e+01 1.6992e+01 3.6188 3
S2 1.4802e+01 1.6754e+01 3.6163 4
FH_p=1_q=0 1.5039e+01 1.7261e+01 3.6198 2
FH_p=0_q=1 7.0563e+00 9.1175e+00 2.3369 7
Test ChiSq p_value
1 FH(0,0) standard 10.31 0.001320
2 FH(1,0) early emphasis 12.70 0.000365
3 FH(0,1) late emphasis 3.45 0.063100
Lisez la famille en langage clair :
FH(0, 0) standard — χ² = 10.3, p = 0.0013. La référence à poids égal (elle correspond à survdiff(rho = 0)).FH(1, 0) emphase précoce — χ² = 12.7, p = 0.0004. Le test le plus puissant ici, correspondant au résultat de Peto-Peto — parce que la différence selon le sexe est précoce.FH(0, 1) emphase tardive — χ² = 3.5, p = 0.063. Le test le plus faible : il pondère les temps d’événement tardifs, où les courbes ont presque convergé et où peu de patients restent — il manque donc presque une différence qui est réellement présente.Cette dernière ligne, c’est toute la leçon en un seul nombre. Un test à emphase tardive appliqué à un effet précoce (ou vice versa) peut transformer un résultat clairement significatif en un résultat non significatif. Le poids doit correspondre à l’endroit où se trouve la différence — et vous devez décider quel poids avant de voir les données.
FH(0, 0) / survdiff(rho = 0). Un test pondéré ne fait que coûter de la puissance ici.FH(0, 1) via comp(..., p = 0, q = 1).FH(1, 0) / survdiff(rho = 1) (Peto-Peto).Chaque poids que vous essayez est un test de plus. Exécuter FH(0,0), FH(1,0), FH(0,1), FH(1,1), … et rapporter la plus petite p-value gonfle le taux d’erreur de type I bien au-dessus de 5 % — vous « trouverez » des effets significatifs dans du bruit pur. La correction est procédurale, pas statistique :
La seule chose que vous ne devez jamais faire est de balayer tous les poids et rapporter le meilleur.
La survie a été comparée entre les patients hommes et femmes sur les données du cancer du poumon NCCTG (n = 228, 165 décès). Parce que les courbes de Kaplan-Meier se séparaient tôt dans le suivi, un test Fleming-Harrington à emphase précoce préspécifié,
FH(1, 0)(Peto-Peto,survdiffrho = 1), a été la comparaison primaire : la survie différait significativement entre les sexes (χ²(1) = 12.7, p = 0.0004). Le test log-rank standard concordait (χ²(1) = 10.3, p = 0.0013) ; un test à emphase tardiveFH(0, 1)était plus faible (χ²(1) = 3.5, p = 0.063), cohérent avec une différence précoce. Les femmes ont survécu plus longtemps (médiane 426 contre 270 jours).
À chaque temps d’événement distinct \(t_i\), avec \(d_i\) événements parmi \(n_i\) patients à risque, soit \(O_{1i}\) et \(E_{1i}\) les événements observés et attendus dans le groupe 1, et \(V_i\) la variance — exactement les ingrédients du log-rank. La statistique pondérée attache un poids \(w_i\) à chaque terme :
\[ Z_w = \frac{\sum_i w_i \,(O_{1i} - E_{1i})}{\sqrt{\sum_i w_i^2 \, V_i}} \]
et \(Z_w^2\) suit une distribution de khi-deux à 1 degré de liberté. Mettre tous les \(w_i = 1\) retrouve le test log-rank standard. Le poids de Fleming-Harrington est \(w_i = \hat S(t_i)^{\,p}\,[1 - \hat S(t_i)]^{\,q}\), où \(\hat S\) est l’estimation de Kaplan-Meier groupée juste avant \(t_i\) : avec \(p > 0\) le poids est grand tant que la survie est élevée (précoce), et avec \(q > 0\) il croît à mesure que la survie baisse (tardif). Parce que le poids est fixé par \((p, q)\) avant de voir l’appartenance au groupe, un choix préspécifié est un test valide ; choisir \((p, q)\) pour minimiser la \(p\)-value observée ne l’est pas.
Exécutez vous-même les tests pondérés — changez la variable de groupe, ou réglez les poids FH(p, q). Le bac à sable démarre au premier Run.
Demandez à Prova « mes courbes de survie se séparent tard — choisissez et exécutez en R un test log-rank pondéré qui met l’accent sur les différences tardives, comparez-le au test log-rank standard, et dites-moi lequel préspécifier » — elle répond avec du code survival + survMisc que vous pouvez exécuter sur vos propres données. The runtime is the judge. Demandez à Prova →
Vous avez exécuté tous les poids et rapporté la plus petite p-value. Cela gonfle le taux d’erreur de type I bien au-dessus de 5 % — le mauvais usage le plus courant des tests pondérés. Préspécifiez un poids à partir de la biologie avant la levée de l’aveugle et traitez les autres comme des analyses de sensibilité ; si le motif est vraiment inconnu, utilisez un test de combinaison à multiplicité contrôlée (MaxCombo), pas une recherche de poids.
Vos courbes se croisent et même le test pondéré semble faible. Un poids unique met l’accent sur une direction de différence ; quand les courbes se croisent, les différences précoces et tardives s’opposent et tout test à poids unique peut encore peiner. Énoncez la question clinique (est-ce la survie précoce ou tardive qui importe ?) et envisagez la durée de survie moyenne restreinte comme résumé complémentaire sans poids.
Les comptages Observed/Expected dans survdiff(rho = 1) semblent faux (fractionnaires, trop petits). Ce sont des comptages d’événements pondérés, pas des décès bruts — seuls la statistique χ² et la p-value sont comparables au test standard. N’essayez pas de réconcilier les comptages pondérés avec le nombre réel de décès.
Utilisez un test log-rank pondéré quand l’hypothèse des risques proportionnels échoue — les courbes de survie se croisent, l’effet du traitement est retardé (immunothérapie), ou il est précoce puis s’estompe. Dans ces cas, le test log-rank standard donne un poids égal à chaque temps et perd en puissance. Si les risques sont proportionnels (les courbes restent à peu près parallèles et ne se croisent pas), le test log-rank standard est le choix le plus puissant et un test pondéré ne fait que vous coûter de la puissance — alors vérifiez les courbes et exécutez cox.zph() d’abord.
survdiff() expose un paramètre unique, rho. rho = 0 est le test log-rank standard ; rho = 1 est le test de Peto-Peto, qui pondère par l’estimation de survie \(\hat S(t)\) — emphase précoce (équivalent au Fleming-Harrington FH(1, 0)). La famille Fleming-Harrington a deux paramètres, p et q, avec le poids \(\hat S(t)^p [1 - \hat S(t)]^q\) — p pilote l’emphase précoce, q pilote l’emphase tardive. Pour l’emphase tardive (un effet retardé) il vous faut survMisc::comp(..., p = 0, q = 1) ; survdiff() seul ne peut pas le faire.
Un poids à emphase tardive — Fleming-Harrington FH(0, 1) (comp(ten(fit), p = 0, q = 1)). Les effets retardés ne montrent aucune séparation précoce, puis un bénéfice croissant, donc la différence vit dans les temps d’événement plus tardifs ; les pondérer à la hausse retrouve la puissance que le test standard perd. Préspécifiez ce poids à partir du mécanisme avant la levée de l’aveugle, et rapportez le test log-rank standard comme analyse de sensibilité.
Non. Chaque poids est un test distinct, donc balayer plusieurs et rapporter la plus petite p-value gonfle le taux d’erreur de type I — vous trouverez des effets « significatifs » dans le bruit. Préspécifiez un poids (à partir de la biologie ou de données antérieures) comme primaire et traitez les autres comme des analyses de sensibilité. Si vous ne pouvez vraiment pas prédire le timing de l’effet, utilisez un test de combinaison MaxCombo, qui prend le maximum sur un petit ensemble préspécifié de poids avec un ajustement de multiplicité approprié.
Le test log-rank standard correspond à un modèle de Cox avec un hazard ratio constant. Quand les risques sont non proportionnels, ni un hazard ratio unique ni le test log-rank standard ne résument bien l’effet. Un test log-rank pondéré donne une p-value plus puissante pour « les courbes diffèrent-elles ? », mais toujours aucune taille d’effet. Pour décrire un effet variant dans le temps, ajustez un modèle de Cox avec des coefficients variant dans le temps ou rapportez la durée de survie moyenne restreinte ; voir Tester l’hypothèse des risques proportionnels pour diagnostiquer la violation en premier lieu.
ph.ecog). Remplissez le blanc pour exécuter un test de Peto-Peto à emphase précoce, et comparez sa p-value au test log-rank standard. La pondération précoce renforce-t-elle ou affaiblit-elle les preuves ?Pour un test à emphase précoce (Peto-Peto), réglez rho = 1 — rho = 0 est le test standard. Comparez les lignes Chisq et p des deux appels survdiff(). Pour la question 2, un effet retardé vit dans les temps d’événement tardifs, donc il vous faut une emphase tardive.
survdiff(Surv(time, status) ~ ph.ecog, data = lung, rho = 1)
#> An early-weighted (Peto-Peto) test of survival across ECOG groups.
#> Compare its Chisq / p to the rho = 0 standard test: because worse
#> performance scores separate early, the early weighting strengthens
#> the evidence (a larger Chisq, a smaller p) here.Pour la question 2 : l’effet est retardé — aucune différence précoce, puis un bénéfice tardif — donc la différence vit dans les temps d’événement tardifs. Préspécifiez un test à emphase tardive, Fleming-Harrington FH(0, 1) (comp(ten(fit), p = 0, q = 1)), justifié par le mécanisme de l’immunothérapie. Un test log-rank standard serait dilué par la non-différence précoce, et un test à emphase précoce pointerait exactement dans le mauvais sens.
Vous attendez un bénéfice de traitement retardé (les courbes ne se séparent qu’après plusieurs mois). Vous exécutez survdiff(Surv(time, status) ~ arm, data = trial, rho = 1) comme test primaire. Est-ce le bon choix ?
Non. rho = 1 est le test de Peto-Peto / à emphase précoce — il pondère les temps d’événement précoces, exactement là où un effet retardé ne montre aucune différence, donc il perdrait de la puissance. Pour un effet retardé il vous faut un test à emphase tardive, Fleming-Harrington FH(0, 1) via survMisc::comp(ten(fit), p = 0, q = 1). La direction de rho est l’opposé de ce que le nom pourrait suggérer — rho = 1 met l’accent sur le précoce, pas le tardif.
Quand les risques proportionnels font défaut — effets retardés, effets précoces puis s’estompant, courbes qui se croisent — le test log-rank standard perd en puissance parce qu’il pondère chaque temps d’événement de façon égale. Un test log-rank pondéré restaure cette puissance en mettant l’accent sur la partie du suivi où vit la différence : survdiff(..., rho = 1) pour un test rapide à emphase précoce (Peto-Peto), et survMisc::comp() pour la famille complète Fleming-Harrington FH(p, q) — FH(1, 0) précoce, FH(0, 1) tardif. Sur les données pulmonaires, la différence selon le sexe était précoce, donc le test à emphase précoce était le plus fort (χ² = 12.7, p = 0.0004) et le test à emphase tardive l’a presque manqué (p = 0.063) — un rappel que le poids doit correspondre à l’effet, et que vous devez le préspécifier plutôt que de pêcher à travers les poids. Diagnostiquez d’abord la non-proportionnalité avec la vérification des risques proportionnels ; choisissez un poids à partir de la biologie ; rapportez les autres comme analyses de sensibilité.
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.
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
✓ Vous êtes Pro — continuez. The runtime is the judge.
Prêt à passer à la vitesse supérieure ?
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.
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.
@online{2026,
author = {},
title = {Tests log-rank pondérés en R : Fleming-Harrington},
date = {2026-06-25},
url = {https://www.datanovia.com/learn/biostatistics/survival-analysis/weighted-log-rank},
langid = {fr}
}