Risques concurrents en R : incidence cumulée et Fine-Gray

Quand un patient peut échouer par plus d’une cause, le Kaplan-Meier naïf surestime le risque — estimez la fonction d’incidence cumulée avec tidycmprsk, testez-la avec le test de Gray, et modélisez-la avec une régression spécifique à la cause et Fine-Gray

Réalisez une analyse de risques concurrents en R avec les packages survival et tidycmprsk. Comprenez pourquoi 1 - Kaplan-Meier surestime l’incidence cumulée d’un événement quand un événement concurrent (comme le décès) peut survenir en premier, estimez la fonction d’incidence cumulée (CIF) avec cuminc et tracez-la avec ggcuminc de ggsurvfit, comparez les groupes avec le test de Gray, et choisissez entre un modèle de Cox spécifique à la cause et un modèle de risque de sous-répartition Fine-Gray — sur le jeu de données mgus2 du package survival.

Date de publication

26 juin 2026

Modifié

7 juillet 2026

AstucePoints clés
  • Les risques concurrents apparaissent quand un patient peut échouer par plus d’une cause et qu’un événement empêche d’observer l’autre — le plus souvent, un décès avant l’événement d’intérêt (par exemple la progression de la maladie). Un événement concurrent n’est pas une censure ordinaire : un patient censuré pourrait encore connaître l’événement, un patient décédé ne le pourra jamais.
  • Traiter un événement concurrent comme une censure et lire 1 − Kaplan-Meier comme l’incidence surestime le risque. Sur les données mgus2, la courbe naïve situe l’incidence de progression à 20 ans à ~21 %, alors que la fonction d’incidence cumulée (CIF) correcte la situe à ~10 % — l’écart est le biais.
  • Le bon résumé est la fonction d’incidence cumulée : estimez-la avec tidycmprsk::cuminc(Surv(time, event) ~ group), tracez-la avec ggsurvfit::ggcuminc(), et comparez les groupes avec le test de Gray (affiché par cuminc()).
  • Deux modèles de régression répondent à deux questions différentes : le modèle de Cox spécifique à la cause (censurer le concurrent) sert à l’étiologie (« cette covariable influence-t-elle le taux d’événement ? ») ; le modèle de sous-répartition Fine-Gray crr() sert à la prédiction (« cette covariable modifie-t-elle l’incidence cumulée ? »). Ils peuvent diverger — et c’est informatif, pas un bug.
  • La variable d’événement doit être un facteur dont le premier niveau est le code de censure — réussissez le codage et toute l’analyse en découle.

Introduction

Imaginez un essai en oncologie dans une population âgée. Vous voulez le temps jusqu’à la progression de la maladie, mais de nombreux patients meurent d’autre chose avant — une crise cardiaque, une infection, un second cancer. Un patient qui meurt ne peut jamais progresser : le décès l’a retiré de la population qui pouvait encore connaître l’événement qui vous intéresse.

C’est un risque concurrent, et il met en échec la boîte à outils standard de la survie. L’ estimateur de Kaplan-Meier et le modèle de Cox supposent qu’un patient qui sort de votre champ de vue est censuré — qu’il pourrait encore connaître l’événement si vous continuiez à le suivre. C’est vrai pour un patient qui a simplement atteint la fin de l’étude. C’est faux pour un patient décédé : il est parti pour de bon. Censurez les décès et faites comme s’ils pouvaient encore progresser, et vous surestimez combien de patients vont progresser.

Cette leçon traite les risques concurrents correctement avec survival et tidycmprsk, en utilisant le jeu de données mgus2 — un problème de risques concurrents classique où des patients atteints de gammapathie monoclonale peuvent soit progresser vers une hémopathie plasmocytaire, soit mourir avant.

NoteÉvénement concurrent ou censure — la distinction à bien comprendre

Un patient quitte l’ensemble à risque pour l’une de deux raisons :

  • Censure — nous avons arrêté d’observer (fin de l’étude, perdu de vue). Il pourrait encore connaître l’ événement. L’analyse de survie standard gère ce cas.
  • Événement concurrent — un autre événement est survenu qui rend l’événement d’intérêt impossible (décès avant la progression). Il ne pourra jamais le connaître désormais.

Traitez un événement concurrent comme une censure et vous supposez l’impossible — qu’un patient décédé pourrait encore progresser. Cette seule erreur est ce qui gonfle le risque.

Les données : progression ou décès dans mgus2

Nous utilisons mgus2, fourni avec le package survival : 1384 patients atteints de gammapathie monoclonale de signification indéterminée (MGUS), suivis pendant des décennies. Deux choses peuvent arriver :

  • Progression vers une hémopathie plasmocytaire (PCM) — l’événement d’intérêt — enregistrée par pstat (1 = a progressé) au temps ptime (mois).
  • Décès — l’événement concurrent — enregistré par death (1 = décédé) au temps futime (mois).
library(survival)

head(mgus2[, c("id", "age", "sex", "ptime", "pstat", "futime", "death")])
  id age sex ptime pstat futime death
1  1  88   F    30     0     30     1
2  2  78   F    25     0     25     1
3  3  94   M    46     0     46     1
4  4  68   M    92     0     92     1
5  5  90   F     8     0      8     1
6  6  90   M     4     0      4     1

Construire la variable d’événement unique de risques concurrents

Les risques concurrents nécessitent un temps et une variable d’événement avec un code pour chaque issue. La règle : si un patient a progressé, utilisez le temps de progression et codez-le comme l’événement ; sinon, utilisez le temps de suivi et codez-le comme décès ou censure. tidycmprsk exige que l’événement soit un factor dont le premier niveau est le code de censure — tout ce qui suit en dépend.

library(survival)

mg <- mgus2
# One event time: progression time if progressed, else follow-up time
mg$etime <- ifelse(mg$pstat == 1, mg$ptime, mg$futime)

# One event code: 0 = censored, 1 = progression (PCM), 2 = death
ecode <- with(mg, ifelse(pstat == 1, 1, ifelse(death == 1, 2, 0)))

# Factor with the CENSOR level FIRST (tidycmprsk requirement)
mg$event <- factor(ecode, levels = c(0, 1, 2),
                   labels = c("censor", "pcm", "death"))

table(mg$event)

censor    pcm  death 
   409    115    860 

Ainsi, 115 patients ont progressé, 860 sont décédés avant (l’événement concurrent), et 409 ont été censurés. Avec des décès dépassant les progressions d’environ 7 contre 1, le risque concurrent est énorme — exactement la situation où l’ignorer tourne très mal.

Pourquoi le Kaplan-Meier naïf est faux

Voici l’erreur en une seule figure. Pour obtenir l’« incidence de progression » de manière naïve, vous traiteriez le décès comme une censure et liriez 1 − KM. Tracez cela face à la fonction d’incidence cumulée correcte pour le même événement — l’écart est la surestimation.

library(survival)
library(tidycmprsk)
library(ggsurvfit)

mg <- mgus2
mg$etime <- ifelse(mg$pstat == 1, mg$ptime, mg$futime)
ecode <- with(mg, ifelse(pstat == 1, 1, ifelse(death == 1, 2, 0)))
mg$event <- factor(ecode, levels = c(0, 1, 2), labels = c("censor", "pcm", "death"))

# NAIVE: treat death as censoring, take 1 - KM for progression
mg$pcm_only <- as.numeric(mg$event == "pcm")
km   <- survfit(Surv(etime, pcm_only) ~ 1, data = mg)
naive <- data.frame(time = km$time, est = 1 - km$surv, method = "Naive (1 - Kaplan-Meier)")

# CORRECT: cumulative incidence function for progression
ci   <- cuminc(Surv(etime, event) ~ 1, data = mg)
cif  <- tidy(ci)
cif  <- cif[cif$outcome == "pcm", ]
cif  <- data.frame(time = cif$time, est = cif$estimate, method = "Cumulative incidence (correct)")

both <- rbind(naive, cif)

ggplot(both, aes(time, est, colour = method)) +
  geom_step(linewidth = 0.9) +
  scale_colour_manual(values = c("Cumulative incidence (correct)" = "#3a86d4",
                                 "Naive (1 - Kaplan-Meier)" = "#d1495b")) +
  scale_y_continuous(labels = scales::percent) +
  labs(x = "Months since MGUS diagnosis", y = "Probability of progression",
       colour = NULL,
       title = "Progression to plasma-cell malignancy",
       subtitle = "Naive 1 - KM (red) overstates the incidence; the CIF (blue) is correct") +
  theme_minimal() +
  theme(legend.position = "bottom")

Two cumulative incidence curves for progression to plasma-cell malignancy over 24 years on the mgus2 data. The naive 1 minus Kaplan-Meier curve climbs steadily to about 21 percent, while the correct cumulative incidence function curve stays much lower, levelling near 10 percent. The widening gap between them is the bias from treating the competing risk of death as censoring.

Les deux courbes répondent à la même question — « quelle fraction des patients a progressé au temps t ? » — et donnent des réponses très différentes :

Temps (mois) 1 − KM naïf Incidence cumulée (CIF)
60 4.2% 3.4%
120 9.5% 6.4%
240 21.0% 10.0%

À 20 ans, la méthode naïve indique que 21 % ont progressé ; la vérité est ~10 %. La courbe naïve continue de grimper parce qu’elle crédite chaque patient qui est décédé de la possibilité de quand même progresser — des patients qui ne le peuvent pas. La CIF ne compte que les progressions qui surviennent réellement parmi ceux encore en vie et à risque. Plus il y a de décès concurrents, plus l’écart est large.

La fonction d’incidence cumulée

La fonction d’incidence cumulée (CIF) d’un événement est la probabilité d’avoir connu cet événement spécifique au temps t, en tenant compte du fait que les événements concurrents retirent des patients du risque. C’est le résumé correct et cliniquement interprétable. Estimez-la avec tidycmprsk::cuminc() — un seul modèle vous donne la CIF pour chaque type d’événement à la fois :

library(survival)
library(tidycmprsk)

mg <- mgus2
mg$etime <- ifelse(mg$pstat == 1, mg$ptime, mg$futime)
ecode <- with(mg, ifelse(pstat == 1, 1, ifelse(death == 1, 2, 0)))
mg$event <- factor(ecode, levels = c(0, 1, 2), labels = c("censor", "pcm", "death"))

ci <- cuminc(Surv(etime, event) ~ 1, data = mg)
ci
time   n.risk   estimate   std.error   95% CI          
100    547      0.473      0.014       0.446, 0.500    
200    124      0.683      0.015       0.654, 0.711    
300    16       0.763      0.018       0.726, 0.795    
400    1        0.784      0.022       0.738, 0.823    
time   n.risk   estimate   std.error   95% CI          
100    547      0.055      0.006       0.043, 0.068    
200    124      0.092      0.009       0.076, 0.110    
300    16       0.109      0.012       0.088, 0.133    
400    1        0.161      0.033       0.103, 0.231    

Lisez les deux blocs : la CIF pour la progression (pcm) et la CIF pour le décès. À tout horizon, les deux s’additionnent pour donner la fraction totale ayant connu un événement. Extrayez l’estimation à un temps choisi avec tidy() :

library(survival)
library(tidycmprsk)

mg <- mgus2
mg$etime <- ifelse(mg$pstat == 1, mg$ptime, mg$futime)
ecode <- with(mg, ifelse(pstat == 1, 1, ifelse(death == 1, 2, 0)))
mg$event <- factor(ecode, levels = c(0, 1, 2), labels = c("censor", "pcm", "death"))

ci <- cuminc(Surv(etime, event) ~ 1, data = mg)
tidy(ci, times = c(60, 120, 240))[, c("outcome", "time", "estimate", "conf.low", "conf.high")]
# A tibble: 6 × 5
  outcome  time estimate conf.low conf.high
  <chr>   <dbl>    <dbl>    <dbl>     <dbl>
1 death      60   0.320    0.296     0.345 
2 death     120   0.532    0.504     0.559 
3 death     240   0.724    0.692     0.753 
4 pcm        60   0.0341   0.0254    0.0447
5 pcm       120   0.0637   0.0513    0.0779
6 pcm       240   0.0998   0.0817    0.120 

À 120 mois, l’incidence cumulée de progression est de 6.4 % (IC à 95 % 5.1–7.8 %) et celle de décès de 53.2 % — une population où le décès domine.

Comparer les groupes avec le test de Gray

Pour comparer l’incidence cumulée entre groupes, placez la variable de regroupement à droite de la formule et lisez le test de Gray que cuminc() affiche — c’est l’analogue, pour les risques concurrents, du test log-rank, exécuté séparément pour chaque type d’événement :

library(survival)
library(tidycmprsk)

mg <- mgus2
mg$etime <- ifelse(mg$pstat == 1, mg$ptime, mg$futime)
ecode <- with(mg, ifelse(pstat == 1, 1, ifelse(death == 1, 2, 0)))
mg$event <- factor(ecode, levels = c(0, 1, 2), labels = c("censor", "pcm", "death"))

ci_sex <- cuminc(Surv(etime, event) ~ sex, data = mg)
ci_sex
strata   time   n.risk   estimate   std.error   95% CI          
F        100    284      0.417      0.020       0.377, 0.456    
F        200    66       0.654      0.022       0.609, 0.696    
F        300    11       0.722      0.026       0.667, 0.769    
F        400    0        0.760      0.034       0.686, 0.820    
M        100    263      0.521      0.019       0.483, 0.557    
M        200    58       0.708      0.019       0.668, 0.744    
M        300    5        0.799      0.024       0.747, 0.842    
M        400    1        0.799      0.024       0.747, 0.842    
strata   time   n.risk   estimate   std.error   95% CI          
F        100    284      0.062      0.010       0.045, 0.083    
F        200    66       0.095      0.013       0.072, 0.122    
F        300    11       0.115      0.017       0.084, 0.152    
F        400    0        0.199      0.050       0.111, 0.305    
M        100    263      0.049      0.008       0.035, 0.066    
M        200    58       0.089      0.012       0.067, 0.115    
M        300    5        0.104      0.016       0.076, 0.139    
M        400    1        0.104      0.016       0.076, 0.139    
outcome   statistic   df     p.value    
pcm       1.19        1.00   0.27       
death     11.7        1.00   <0.001     

Lisez le bloc des tests :

  • Progression (pcm) : test de Gray p = 0.27. Aucune différence convaincante entre hommes et femmes dans l’ incidence cumulée de progression.
  • Décès : test de Gray p < 0.001. Les hommes ont une incidence cumulée de décès plus élevée — les courbes se séparent nettement.

Donc le sexe compte pour le risque concurrent de décès, pas pour la progression elle-même — une distinction que l’analyse naïve aurait brouillée.

Tracer la CIF — ggcuminc() (la figure emblématique des risques concurrents)

Tracez un objet cuminc() directement avec ggsurvfit::ggcuminc() — la courbe de risques concurrents prête à publier, avec bandes de confiance, table des effectifs à risque et le p de Gray placé sur le panneau :

library(survival)
library(tidycmprsk)
library(ggsurvfit)

mg <- mgus2
mg$etime <- ifelse(mg$pstat == 1, mg$ptime, mg$futime)
ecode <- with(mg, ifelse(pstat == 1, 1, ifelse(death == 1, 2, 0)))
mg$event <- factor(ecode, levels = c(0, 1, 2), labels = c("censor", "pcm", "death"))

ci_sex <- cuminc(Surv(etime, event) ~ sex, data = mg)

ggcuminc(ci_sex, outcome = "pcm") +
  add_confidence_interval() +
  add_risktable() +
  add_pvalue("annotation", location = "annotation", x = 200, y = 0.18) +
  scale_ggsurvfit() +
  scale_colour_manual(values = c("#3a86d4", "#d1495b")) +
  scale_fill_manual(values = c("#3a86d4", "#d1495b")) +
  labs(x = "Months since MGUS diagnosis", y = "Cumulative incidence of progression")

A ggcuminc cumulative incidence plot of progression to plasma-cell malignancy by sex on the mgus2 data. The female and male step curves rise gently and stay close together, each with a shaded 95 percent confidence band, with a Gray's test p-value of 0.27 annotated on the panel and a risk table beneath, indicating no clear sex difference in the cumulative incidence of progression.

outcome = "pcm" choisit l’événement à tracer (vous remplaceriez par "death" pour tracer le risque concurrent). Les deux courbes restent proches l’une de l’autre — le pendant visuel du p = 0.27 de Gray.

Deux risques, deux questions : spécifique à la cause ou Fine-Gray

Pour une modélisation ajustée sur covariables, vous avez deux modèles de régression, et ils répondent à des questions différentes. Bien comprendre ce point est au cœur des risques concurrents.

ImportantQuel modèle ? Étiologie ou prédiction
  • Risque spécifique à la cause — ajustez un modèle de Cox sur l’événement d’intérêt, en traitant les événements concurrents comme une censure. Il répond : « Parmi les patients encore en vie et sans événement, cette covariable modifie-t-elle le taux auquel l’événement survient ? » Utilisez-le pour l’étiologie / le mécanisme — ce facteur influence-t-il biologiquement l’événement ?
  • Risque de sous-répartition (Fine-Gray) — ajustez crr(), qui maintient les patients ayant connu un événement concurrent dans l’ensemble à risque. Il répond : « Cette covariable modifie-t-elle l’incidence cumulée de l’ événement ? » Utilisez-le pour la prédiction / le risque — quelle est la probabilité réelle de l’événement pour un patient, sachant qu’il pourrait mourir avant ?

Ils peuvent pointer dans des directions différentes, et c’est informatif. Un rapport courant présente les deux.

Modèle de Cox spécifique à la cause

Ajustez un modèle de Cox sur la progression, en censurant le décès — c’est le risque spécifique à la cause :

library(survival)

mg <- mgus2
mg$etime <- ifelse(mg$pstat == 1, mg$ptime, mg$futime)
ecode <- with(mg, ifelse(pstat == 1, 1, ifelse(death == 1, 2, 0)))
mg$event <- factor(ecode, levels = c(0, 1, 2), labels = c("censor", "pcm", "death"))

# Cause-specific: 1 = progression event, everything else (death + censor) = censored
mg$pcm_cs <- as.numeric(mg$event == "pcm")
cs_cox <- coxph(Surv(etime, pcm_cs) ~ sex + age, data = mg)
summary(cs_cox)$conf.int
     exp(coef) exp(-coef) lower .95 upper .95
sexM 0.9751755  1.0254564 0.6740140  1.410902
age  1.0131239  0.9870461 0.9968568  1.029657

age : HR spécifique à la cause ≈ 1.01 par année (p = 0.11) — parmi les patients encore en vie et sans événement, l’âge ne modifie pas significativement le taux de progression.

Modèle de sous-répartition Fine-Gray

Maintenant le modèle Fine-Gray avec crr() — mêmes covariables, mais il modélise l’incidence cumulée directement, en maintenant les patients décédés dans l’ensemble à risque :

library(survival)
library(tidycmprsk)

mg <- mgus2
mg$etime <- ifelse(mg$pstat == 1, mg$ptime, mg$futime)
ecode <- with(mg, ifelse(pstat == 1, 1, ifelse(death == 1, 2, 0)))
mg$event <- factor(ecode, levels = c(0, 1, 2), labels = c("censor", "pcm", "death"))

fg <- crr(Surv(etime, event) ~ sex + age, data = mg, failcode = "pcm")
fg

Variable   Coef     SE      HR     95% CI       p-value    
sexM       -0.260   0.186   0.77   0.54, 1.11   0.16       
age        -0.017   0.006   0.98   0.97, 0.99   0.003      

failcode = "pcm" nomme l’événement d’intérêt ; les autres niveaux sont traités automatiquement comme l’événement concurrent / la censure. Lisez les rapports de risque de sous-répartition (subHR) :

  • sex (homme) : subHR = 0.77, IC à 95 % 0.54–1.11, p = 0.16. Aucun effet convaincant du sexe sur l’ incidence cumulée de progression — cohérent avec le test de Gray.
  • age : subHR = 0.98 par année, IC à 95 % 0.97–0.99, p = 0.003. Chaque année supplémentaire d’âge est associée à une incidence cumulée plus faible de progression — un effet significatif.

Pourquoi les deux modèles divergent sur l’âge — et ce que cela signifie

Regardez ce qui vient de se passer avec l’âge :

Modèle Effet de l’âge p Interprétation
Cox spécifique à la cause HR ≈ 1.01 (aucun effet) 0.11 L’âge ne modifie pas le taux de progression
Sous-répartition Fine-Gray subHR ≈ 0.98 (inférieur à 1) 0.003 Les patients plus âgés ont une incidence cumulée plus faible de progression

Ce n’est pas une contradiction — c’est tout l’intérêt des risques concurrents. Les patients plus âgés progressent à peu près au même taux tant qu’ils sont en vie (spécifique à la cause), mais ils sont bien plus susceptibles de mourir avant (le risque concurrent), donc moins d’entre eux atteignent jamais la progression : leur incidence cumulée est plus faible (Fine-Gray). Le risque concurrent de décès, capté par Fine-Gray et invisible pour le modèle spécifique à la cause, fait tout le travail.

Règle pratique : rapportez le modèle spécifique à la cause quand vous demandez « ce facteur influence-t-il la biologie de l’événement ? », et le modèle Fine-Gray quand vous demandez « quel est le risque réel d’événement pour un patient au cours du temps ? » Pour une discussion clinique sur le risque avec un patient, Fine-Gray est généralement celui que vous voulez.

Rapport

Chez 1384 patients atteints de MGUS (mgus2), 115 ont progressé vers une hémopathie plasmocytaire et 860 sont décédés avant. En tenant compte du risque concurrent de décès, l’incidence cumulée de progression était de 6.4 % (IC à 95 % 5.1–7.8 %) à 10 ans et de 10.0 % à 20 ans — nettement en dessous de l’estimation naïve 1 − Kaplan-Meier de 21 % à 20 ans, qui traite incorrectement les décès comme censurés. Le test de Gray n’a montré aucune différence dans l’ incidence cumulée de progression selon le sexe (p = 0.27), mais une incidence de décès plus élevée chez les hommes (p < 0.001). Dans un modèle de sous-répartition Fine-Gray, un âge plus avancé était associé à une incidence cumulée plus faible de progression (subHR = 0.98 par année, IC à 95 % 0.97–0.99, p = 0.003), du fait de la mortalité concurrente plus élevée aux âges avancés ; le risque spécifique à la cause de progression n’a pas changé avec l’âge (HR = 1.01, p = 0.11).

Pour le type d’événement \(k\), le risque spécifique à la cause \(h_k(t)\) est le taux instantané d’événement \(k\) parmi ceux encore sans événement et en vie. La fonction d’incidence cumulée pour l’événement \(k\) se construit à partir de son risque pondéré par la survie globale \(S(t)\) — la probabilité d’être encore à risque tout court :

\[ F_k(t) = \int_0^t S(u^-)\, h_k(u)\, du \]

Le terme clé est \(S(u^-)\), la probabilité de n’avoir eu aucun événement d’aucune sorte juste avant \(u\). Il tire la CIF en dessous de \(1 - \exp\!\big(-\int h_k\big)\) — la quantité qu’estime \(1 - \mathrm{KM}\) — parce que \(S\) diminue à mesure que surviennent des événements concurrents, pas seulement les événements de type \(k\). Sans risques concurrents, \(S\) ne dépend que de \(h_k\) et les deux coïncident ; avec des risques concurrents, \(S\) chute plus vite et la CIF reste plus basse. Le risque de sous-répartition Fine-Gray \(\bar h_k(t)\) est au contraire défini pour rendre \(F_k(t) = 1 - \exp\!\big(-\int \bar h_k\big)\), raison pour laquelle un modèle Fine-Gray se rapporte directement à l’incidence cumulée.

Quelle méthode et quand ?

AstuceGuide de décision pour les risques concurrents
  • Un seul type d’événement, ou des événements concurrents rares (<10 % des patients) → les Kaplan-Meier et Cox standard conviennent.
  • Un événement concurrent peut survenir en premier et est fréquent → utilisez la fonction d’incidence cumulée (cuminc + ggcuminc), jamais 1 − KM, et comparez les groupes avec le test de Gray.
  • Ajuster sur covariables, en s’interrogeant sur le taux d’événement / le mécanismeCox spécifique à la cause (censurer le concurrent).
  • Ajuster sur covariables, en s’interrogeant sur le risque cumulé / pour la prédictionFine-Gray crr() (risque de sous-répartition).
  • Événements récurrents, ou un composite « temps jusqu’au premier de n’importe quel événement » → ce ne sont pas des risques concurrents ; utilisez des méthodes standard ou multi-états.

Essayez en direct

Estimez vous-même la fonction d’incidence cumulée sur mgus2 — changez la variable de regroupement, ou tracez outcome = "death" à la place. Le bac à sable démarre au premier Run.

🟢 Avec un agent IA

Demandez à Prova « j’ai un jeu de données de survie où les patients peuvent progresser ou mourir avant — fais une analyse de risques concurrents : fonction d’incidence cumulée, test de Gray et un modèle Fine-Gray » — elle répond avec du code survival + tidycmprsk que vous pouvez exécuter sur vos propres données, avec le facteur d’événement codé correctement. The runtime is the judge. Demander à Prova →

Problèmes courants

Vous avez traité l’événement concurrent comme une censure (l’erreur classique). Lancer survfit(Surv(time, progressed) ~ 1) et lire 1 − KM comme l’incidence de progression traite chaque décès comme « pourrait encore progresser ». Avec une mortalité concurrente substantielle, cela surestime l’incidence — 21 % contre 10 % sur mgus2. Construisez le facteur d’événement multi-niveaux et utilisez plutôt cuminc().

Vous avez lu 1 − KM comme l’incidence cumulée. Même après avoir ajusté le bon modèle, ne retombez pas dans le raisonnement KM : le complément de la courbe de survie n’est pas l’incidence cumulée en présence de risques concurrents. La CIF de cuminc() est la seule estimation correcte de la « fraction ayant connu cet événement au temps t ».

Vous avez confondu les rapports de risque spécifique à la cause et Fine-Gray. Ils répondent à des questions différentes et peuvent diverger (voir l’âge ci-dessus). Un HR spécifique à la cause porte sur le taux de l’événement parmi ceux encore à risque (étiologie) ; un HR de sous-répartition porte sur l’incidence cumulée (prédiction). Précisez lequel vous avez ajusté, et n’interprétez pas un subHR Fine-Gray comme s’il s’agissait d’un rapport de taux spécifique à la cause.

cuminc() renvoie une erreur sur la variable d’événement. tidycmprsk a besoin que l’événement soit un facteur dont le premier niveau est le code de censure (ici "censor"). Un événement numérique, ou un facteur dont l’ordre des niveaux est incorrect, échoue ou renvoie n’importe quoi — définissez levels = c("censor", ...) explicitement.

Questions fréquentes

Un patient censuré est un patient que vous avez cessé d’observer (fin de l’étude, perdu de vue) qui pourrait encore connaître l’événement d’intérêt si on le suivait plus longtemps — l’analyse de survie standard gère ce cas. Un risque concurrent est un autre événement (généralement le décès) qui rend l’événement d’intérêt impossible : un patient qui meurt avant de progresser ne pourra jamais progresser. Traiter un événement concurrent comme une censure suppose l’ impossible et surestime l’incidence de l’événement d’intérêt.

Parce que l’estimateur de Kaplan-Meier suppose que toute personne retirée de l’ensemble à risque a simplement été censurée et pourrait encore connaître l’événement. Quand des événements concurrents (décès) sont censurés de cette façon, KM crédite ces patients d’une chance future de l’événement qu’ils ne peuvent jamais connaître, donc 1 − KM grimpe trop haut. La fonction d’incidence cumulée ne compte que les événements qui surviennent réellement parmi les patients encore en vie et à risque, donnant l’estimation correcte, plus basse — sur mgus2, 10 % contre les 21 % naïfs à 20 ans.

Utilisez le modèle de Cox spécifique à la cause (censurer l’événement concurrent) quand vous voulez l’étiologiecette covariable modifie-t-elle le taux auquel l’événement survient parmi ceux encore à risque ? Utilisez le modèle de sous-répartition Fine-Gray (crr()) quand vous voulez la prédiction / le risque cumulécette covariable modifie-t-elle la probabilité réelle de l’événement pour un patient au cours du temps, sachant qu’il pourrait mourir avant ? Ils répondent à des questions différentes et peuvent diverger ; de nombreuses analyses rapportent les deux, Fine-Gray étant préféré pour la communication clinique du risque.

tidycmprsk est le choix moderne : cuminc() pour la fonction d’incidence cumulée et le test de Gray, crr() pour le modèle de sous-répartition Fine-Gray, avec une sortie tidy. Associez-le à ggsurvfit pour des tracés ggcuminc() prêts à publier (bandes de confiance, tables des effectifs à risque, p-values sur le graphique). Le package de base survival fournit les données et le moteur Surv() / coxph() pour le modèle spécifique à la cause.

Faites-en un facteur dont le premier niveau est le code de censure. Construisez une variable de temps d’événement (le temps de progression si progression, sinon le temps de suivi) et un code d’événement (par exemple 0 = censuré, 1 = événement d’intérêt, 2 = événement concurrent), puis factor(code, levels = c(0,1,2), labels = c("censor","pcm","death")). L’ordre « censure en premier » est obligatoire — cuminc() et crr() en dépendent.

Testez vos connaissances

  1. Exécutez-le. Dans la cellule live ci-dessous, estimez l’incidence cumulée par sexe et relevez la CIF de progression à 120 mois pour chaque sexe. Remplissez le blanc avec l’événement d’intérêt.
  2. Interprétez. Une analyse naïve 1 − KM rapporte une incidence de progression à 5 ans de 18 %, mais la fonction d’incidence cumulée rapporte 11 %. Expliquez en une phrase pourquoi elles diffèrent et laquelle est correcte.

L’événement d’intérêt est la progression, codée "pcm" dans le facteur. tidy(ci, times = 120) renvoie une ligne par strate × issue ; filtrez sur outcome == "pcm" pour lire la CIF de progression de chaque sexe.

ci <- cuminc(Surv(etime, event) ~ sex, data = mg)
tidy(ci, times = 120)[tidy(ci, times = 120)$outcome == "pcm", ]
#> Female CIF ~ 0.074, Male CIF ~ 0.055 at 120 months — close together,
#> matching Gray's test p = 0.27 (no convincing sex difference in progression).

Pour la question 2 : l’estimation 1 − KM (18 %) surestime l’incidence parce qu’elle traite les patients décédés avant de progresser comme s’ils pouvaient encore progresser ; la fonction d’incidence cumulée (11 %) est correcte parce qu’elle tient compte du risque concurrent de décès qui retire ces patients du risque.

AstuceVérification rapide

Un modèle Fine-Gray donne un rapport de risque de sous-répartition de 0.80 (IC à 95 % 0.68–0.94) pour un traitement. Qu’est-ce que cela signifie cliniquement ?

Le traitement est associé à une incidence cumulée 20 % plus faible de l’événement d’intérêt au cours du temps ((1 − 0.80) × 100), en tenant compte du risque concurrent. Comme l’IC à 95 % (0.68–0.94) se situe entièrement en dessous de 1, la réduction est statistiquement convaincante. Notez qu’il s’agit d’une affirmation sur le risque cumulé, non sur le taux d’événement parmi ceux encore à risque — ce serait le risque spécifique à la cause.

Conclusion

Les risques concurrents surgissent dès qu’un patient peut échouer par plus d’une cause et qu’un événement en bloque un autre — le plus souvent un décès avant l’événement d’intérêt. La solution est disciplinée : construisez un facteur d’événement unique (niveau de censure en premier), résumez le risque avec la fonction d’incidence cumulée (cuminc + ggcuminc), jamais 1 − Kaplan-Meier, et comparez les groupes avec le test de Gray. Pour l’ajustement sur covariables, choisissez selon la question : le modèle de Cox spécifique à la cause pour le taux d’événement (étiologie), le modèle Fine-Gray pour l’incidence cumulée (prédiction) — et rappelez-vous qu’ils peuvent diverger, comme l’âge sur mgus2. Réussissez le codage de l’événement et le reste suit.

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é — copiez n’importe quel bloc, ou cliquez sur Try ▸ / Run, pour le reproduire vous-même.

Réutilisation

Citation

BibTeX
@online{2026,
  author = {},
  title = {Risques concurrents en R : incidence cumulée et Fine-Gray},
  date = {2026-06-26},
  url = {https://www.datanovia.com/learn/biostatistics/survival-analysis/competing-risks},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“Risques concurrents en R : incidence cumulée et Fine-Gray.” 2026. June 26. https://www.datanovia.com/learn/biostatistics/survival-analysis/competing-risks.