Table de survie en R : la méthode actuarielle pas à pas

Construisez une table de survie actuarielle (de cohorte) à la main à partir de données de suivi groupées — sujets à risque, décès, retraits, l’ajustement retraits/2 et la survie cumulée — et voyez en quoi elle diffère de Kaplan-Meier, et concorde avec elle

Apprenez la méthode actuarielle de la table de survie en R : estimez la survie quand les données de suivi arrivent en intervalles de temps groupés plutôt qu’en temps d’événement exacts. Construisez la table à la main en R base — sujets à risque, décès, retraits, la taille d’échantillon effective (n moins la moitié des retraits), la probabilité conditionnelle de décès et de survie par intervalle, et la survie cumulée — lisez-la en langage clair, et superposez-la à la courbe de Kaplan-Meier pour confirmer que les deux méthodes concordent quand les intervalles sont fins. Illustré sur les données de cancer du poumon NCCTG.

Date de publication

26 juin 2026

Modifié

7 juillet 2026

AstucePoints clés
  • Une table de survie (la méthode actuarielle ou de cohorte) estime la survie quand les données de suivi arrivent en intervalles de temps groupés — vous savez combien de sujets sont morts et combien ont abandonné dans chaque intervalle, mais pas les temps d’événement exacts dont Kaplan-Meier a besoin.
  • Chaque intervalle fournit une probabilité conditionnelle de survie \(p_j = 1 - q_j\), où \(q_j = d_j / (n_j - w_j/2)\) : les décès divisés par le nombre effectif de sujets à risque — l’effectif au début de l’intervalle moins la moitié des retraits (l’ajustement actuariel, car les patients censurés ne sont à risque que pendant une partie de l’intervalle). Multiplier les \(p_j\) sur l’ensemble des intervalles donne la survie cumulée.
  • Table de survie vs Kaplan-Meier : utilisez une table de survie pour des données groupées / enregistrées par intervalle (bilans annuels, grands registres) ; utilisez Kaplan-Meier quand vous disposez des temps d’événement exacts. Ce sont la même idée à deux résolutions — et elles concordent étroitement quand les intervalles sont fins.
  • Vous pouvez construire toute la table en R base (seq() pour les bornes, une boucle comptant à risque / décès / retraits par intervalle) — aucun package spécial nécessaire.
  • Le seul nombre à retenir est l’ajustement retraits/2 : oubliez-le et votre survie est biaisée.

Introduction

Imaginez un registre à long terme où les patients viennent pour un bilan annuel. À chaque visite vous notez qui est encore en vie, qui est décédé depuis la dernière visite, et qui a abandonné — mais vous ne connaissez pas le jour exact où chaque décès est survenu, seulement l’année où il est tombé. Ou imaginez une grande cohorte où les données arrivent déjà regroupées en intervalles. Dans les deux cas, les temps de survie sont groupés, pas exacts.

Kaplan-Meier a besoin d’un temps d’événement exact pour placer chaque marche dans la courbe, il ne s’applique donc pas directement ici. La méthode qui le fait est la table de survie — la méthode actuarielle (ou de cohorte), le plus ancien estimateur en analyse de survie. Elle découpe le temps en intervalles et estime la survie un intervalle à la fois, en posant une seule question par intervalle : parmi ceux encore à risque au début de l’intervalle, quelle fraction y a survécu ?

Cette leçon construit une table de survie actuarielle à la main en R base pour que vous voyiez exactement d’où vient chaque nombre, la lit en langage clair, et la superpose à la courbe de Kaplan-Meier pour prouver que les deux méthodes racontent la même histoire. Nous travaillons sur les données de cancer du poumon NCCTG pour que vous puissiez reproduire chaque figure — en regroupant ses temps exacts en intervalles pour simuler la situation groupée pour laquelle une table de survie est construite.

Si la censure, la fonction de survie et l’objet Surv() vous sont nouveaux, commencez par qu’est-ce que l’analyse de survie ? ; pour l’estimateur en temps exact que cette méthode approche, voir l’estimation de Kaplan-Meier.

Les données : suivi groupé

Nous utilisons lung, le jeu de données du North Central Cancer Treatment Group fourni avec le package survival — la survie de 228 patients atteints d’un cancer du poumon avancé. Son time est en jours et status est codé 1 = censuré, 2 = décédé. Une table de survie travaille sur des données groupées, nous regroupons donc les temps de survie en intervalles de 90 jours (à peu près des bilans trimestriels). Regardez d’abord les colonnes et les bornes :

library(survival)

# 90-day intervals from 0 to 1080 days (≈ quarterly follow-up)
breaks <- seq(0, 1080, by = 90)
breaks
 [1]    0   90  180  270  360  450  540  630  720  810  900  990 1080
# status: 1 = censored (alive at last visit), 2 = dead. Recode to a 0/1 event flag.
event <- as.integer(lung$status == 2)
c(n_patients = nrow(lung), n_deaths = sum(event), n_censored = sum(event == 0))
n_patients   n_deaths n_censored 
       228        165         63 

Soit 228 patients, 165 décès, 63 censurés — et douze intervalles de 90 jours à parcourir.

La mécanique de la table de survie

Pour chaque intervalle \([t_j, t_{j+1})\) la méthode actuarielle a besoin de quatre effectifs et en dérive trois probabilités :

Symbole Signification
\(n_j\) nombre de sujets à risque au début de l’intervalle (tous ceux dont le suivi atteint \(t_j\))
\(d_j\) décès pendant l’intervalle
\(w_j\) retraits — patients censurés (perdus de vue / encore en vie à la dernière visite) pendant l’intervalle
\(n_j' = n_j - w_j/2\) nombre effectif de sujets à risque — l’ajustement actuariel
\(q_j = d_j / n_j'\) probabilité conditionnelle de décès dans l’intervalle
\(p_j = 1 - q_j\) probabilité conditionnelle de survivre à l’intervalle
\(S(t_{j+1}) = \prod_{k \le j} p_k\) survie cumulée jusqu’à la fin de l’intervalle

La seule idée qui distingue une table de survie d’un taux de décès naïf est l’ajustement retraits/2. Un patient censuré au milieu d’un intervalle n’était à risque que pendant une partie de celui-ci, pas en totalité. La méthode actuarielle suppose que les retraits sont répartis uniformément sur l’intervalle, donc chacun contribue en moyenne pour la moitié de l’exposition de l’intervalle. Nous retranchons donc la moitié des retraits du dénominateur : \(n_j' = n_j - w_j/2\). Sautez cette étape et vous surcomptez le dénominateur, sous-estimez le taux de décès, et biaisez la survie vers le haut.

Parcours d’un intervalle

Prenez le deuxième intervalle, 90–180 jours, avec les chiffres de lung (calculés ci-dessous) : \(n_j = 201\) à risque, \(d_j = 35\) décès, \(w_j = 6\) retraits. L’arithmétique est toute la méthode en miniature :

  • Effectif à risque : \(n_j' = 201 - 6/2 = 198\).
  • Probabilité conditionnelle de décès : \(q_j = 35 / 198 = 0.177\).
  • Probabilité conditionnelle de survie : \(p_j = 1 - 0.177 = 0.823\).
  • Survie cumulée à 180 jours : multipliez par la survie de l’intervalle précédent, \(S(180) = 0.882 \times 0.823 = 0.726\).

Voilà la recette ; nous l’exécutons maintenant sur les douze intervalles.

Construire la table de survie en R base

Aucun package spécial n’est nécessaire — seq() a fait les bornes, et une simple boucle compte les trois nombres par intervalle, puis une arithmétique vectorisée donne les probabilités. Tout est en R base, donc le bloc s’exécute copié-collé dans n’importe quel ordre :

library(survival)

breaks <- seq(0, 1080, by = 90)
time   <- lung$time
event  <- as.integer(lung$status == 2)   # 1 = death, 0 = censored

# One row per interval
lt <- data.frame(start = head(breaks, -1), end = breaks[-1])

# Count at-risk, deaths, withdrawals in each interval
lt$n_risk     <- sapply(lt$start, function(s) sum(time >= s))
lt$deaths     <- mapply(function(s, e) sum(time >= s & time < e & event == 1), lt$start, lt$end)
lt$withdrawn  <- mapply(function(s, e) sum(time >= s & time < e & event == 0), lt$start, lt$end)

# Actuarial adjustment + conditional and cumulative survival
lt$eff_n <- lt$n_risk - lt$withdrawn / 2           # effective number at risk
lt$q     <- lt$deaths / lt$eff_n                   # conditional prob of death
lt$p     <- 1 - lt$q                               # conditional prob of survival
lt$surv  <- cumprod(lt$p)                          # cumulative survival

# Tidy display
round(lt, 3)
   start  end n_risk deaths withdrawn eff_n     q     p  surv
1      0   90    228     27         0 228.0 0.118 0.882 0.882
2     90  180    201     35         6 198.0 0.177 0.823 0.726
3    180  270    160     30        22 149.0 0.201 0.799 0.580
4    270  360    108     25        13 101.5 0.246 0.754 0.437
5    360  450     70     15         7  66.5 0.226 0.774 0.338
6    450  540     48     11         4  46.0 0.239 0.761 0.257
7    540  630     33      7         4  31.0 0.226 0.774 0.199
8    630  720     22      8         0  22.0 0.364 0.636 0.127
9    720  810     14      5         2  13.0 0.385 0.615 0.078
10   810  900      7      2         2   6.0 0.333 0.667 0.052
11   900  990      3      0         1   2.5 0.000 1.000 0.052
12   990 1080      2      0         2   1.0 0.000 1.000 0.052

Lecture de la table :

  • n_risk part de 228 et baisse à chaque intervalle à mesure que des patients meurent ou se retirent — c’est la cohorte encore suivie quand l’intervalle s’ouvre.
  • deaths / withdrawn sont les événements et les patients censurés (perdus de vue / encore en vie) dans cet intervalle.
  • eff_n est n_risk − withdrawn/2 — le dénominateur actuariel. Dans l’intervalle 1 il n’y a aucun retrait donc eff_n = n_risk ; à partir de l’intervalle 2, l’ajustement entre en jeu.
  • q monte d’environ 0.12 à 0.39 — le risque de décès par intervalle grimpe à mesure que la cohorte s’amincit.
  • surv est le chiffre clé : la survie cumulée chute de 0.88 à 90 jours à environ 0.13 à 720 jours. Lisez-le comme « on estime que 44 % des patients survivent au-delà de 360 jours » (surv = 0.437 à la fin de l’intervalle 270–360).
  • Les derniers intervalles affichent q = 0 et une survie plate — il ne reste qu’une poignée de patients, donc une queue sans décès laisse l’estimation inchangée. Interprétez la queue de toute table de survie avec la même prudence qu’une queue de KM : peu de patients, estimation instable.

La table de survie estime la fonction de survie \(S(t)\) comme un produit de probabilités de survie propres à chaque intervalle — la même idée de limite de produit que Kaplan-Meier, mais sur des intervalles fixes au lieu de temps d’événement exacts :

\[ S(t_{j+1}) = \prod_{k=1}^{j} p_k = \prod_{k=1}^{j} \left( 1 - \frac{d_k}{n_k'} \right), \qquad n_k' = n_k - \frac{w_k}{2} \]

\(n_k\) est le nombre de sujets à risque au début de l’intervalle \(k\), \(d_k\) les décès, et \(w_k\) les retraits (censurés). Le nombre effectif de sujets à risque \(n_k'\) encode l’hypothèse actuarielle selon laquelle les retraits surviennent uniformément dans l’intervalle, de sorte que chaque patient censuré contribue en moyenne pour la moitié de l’exposition de l’intervalle. À mesure que la largeur de l’intervalle se réduit vers zéro — au plus un événement par intervalle — \(n_k'\) se rapproche de l’ensemble de sujets à risque exact et la table de survie converge vers l’estimateur de Kaplan-Meier. Kaplan-Meier est simplement le cas limite de la table de survie quand vous connaissez les temps d’événement exacts.

Table de survie vs Kaplan-Meier : concordent-elles ?

La table de survie et Kaplan-Meier sont la même idée à deux résolutions : la table de survie regroupe le temps en intervalles ; Kaplan-Meier place une marche à chaque temps d’événement exact. Elles devraient donc concorder étroitement — et plus les intervalles sont fins, plus elles sont proches. Superposez la survie de la table de survie (un point à la fin de chaque intervalle) à la courbe de Kaplan-Meier pour le voir :

library(survival)

# Kaplan-Meier on the exact times
km <- survfit(Surv(time, status) ~ 1, data = lung)

# Life-table survival from the table built above (recomputed self-contained)
breaks <- seq(0, 1080, by = 90)
time   <- lung$time
event  <- as.integer(lung$status == 2)
starts <- head(breaks, -1); ends <- breaks[-1]
n_risk    <- sapply(starts, function(s) sum(time >= s))
deaths    <- mapply(function(s, e) sum(time >= s & time < e & event == 1), starts, ends)
withdrawn <- mapply(function(s, e) sum(time >= s & time < e & event == 0), starts, ends)
eff_n <- n_risk - withdrawn / 2
lt_surv <- cumprod(1 - deaths / eff_n)

# Plot the KM curve, then the life-table survival as points at interval ends
plot(km, conf.int = FALSE, mark.time = TRUE,
     xlab = "Time (days)", ylab = "Survival probability",
     xlim = c(0, 760), col = "grey20", lwd = 2)
points(ends[ends <= 760], lt_surv[ends <= 760],
       pch = 19, col = "#e8731b", cex = 1.3)
legend("topright", bty = "n",
       legend = c("Kaplan-Meier (exact times)", "Life table (90-day intervals)"),
       col = c("grey20", "#e8731b"), lwd = c(2, NA), pch = c(NA, 19))

A step-function survival plot on the lung-cancer data. The continuous black Kaplan-Meier curve descends in many small steps from 1.0 at time 0 to about 0.13 by 720 days. Orange points mark the actuarial life-table survival at the end of each 90-day interval; every point sits almost exactly on the Kaplan-Meier curve, showing the two estimates agree.

Les points orange de la table de survie se situent presque exactement sur la courbe de Kaplan-Meier. Quantifiez la concordance à quelques temps repères :

library(survival)

breaks <- seq(0, 1080, by = 90)
time   <- lung$time
event  <- as.integer(lung$status == 2)
starts <- head(breaks, -1); ends <- breaks[-1]
n_risk    <- sapply(starts, function(s) sum(time >= s))
deaths    <- mapply(function(s, e) sum(time >= s & time < e & event == 1), starts, ends)
withdrawn <- mapply(function(s, e) sum(time >= s & time < e & event == 0), starts, ends)
lt_surv <- cumprod(1 - deaths / (n_risk - withdrawn / 2))

km <- survfit(Surv(time, status) ~ 1, data = lung)
landmarks <- c(180, 360, 540)

data.frame(
  time       = landmarks,
  life_table = round(lt_surv[match(landmarks, ends)], 3),
  kaplan_meier = round(summary(km, times = landmarks)$surv, 3)
)
  time life_table kaplan_meier
1  180      0.726        0.722
2  360      0.437        0.434
3  540      0.257        0.255

À 180, 360 et 540 jours, les deux estimations diffèrent d’au plus ~0.005 — bien à l’intérieur de toute tolérance pratique. Réduisez les intervalles (disons 30 jours) et elles convergent encore davantage ; élargissez-les et la table de survie perd en résolution et s’écarte de KM (voir Problèmes courants). À retenir : quand les temps exacts sont disponibles, KM et une table de survie à grain fin donnent la même réponse — utilisez donc KM. La table de survie justifie son intérêt précisément quand les temps exacts ne sont pas disponibles.

NoteQuelle méthode mes données appellent-elles ?
  • Temps d’événement exacts (le jour où chaque événement s’est produit) → Kaplan-Meier. C’est la référence pour le suivi d’essai clinique.
  • Données groupées / enregistrées par intervalle (événements connus seulement par intervalle — bilans annuels, registres regroupés) → la table de survie (cette leçon). C’est l’estimateur naturel quand la résolution des données est l’intervalle, pas le jour.
  • Les deux estiment la même fonction de survie ; la table de survie est la sœur à résolution plus grossière de KM.

Essayez en direct

Construisez vous-même la table de survie — changez la largeur d’intervalle (by =) et regardez les estimations de survie et la concordance avec Kaplan-Meier évoluer. Le bac à sable démarre au premier Run.

🟢 Avec un agent IA

Demandez à Prova « J’ai des données de suivi groupées avec décès et retraits par intervalle — construis une table de survie actuarielle en R, avec l’ajustement retraits/2 et la survie cumulée, et vérifie-la par rapport à une courbe de Kaplan-Meier » — elle répond avec du code R base que vous pouvez exécuter sur vos propres intervalles. The runtime is the judge. Demander à Prova →

Problèmes courants

Vous avez oublié l’ajustement retraits/2. Utiliser q = deaths / n_risk (l’effectif brut au début de l’intervalle) au lieu de q = deaths / (n_risk - withdrawn/2) surcompte le dénominateur, sous-estime le taux de décès, et biaise la survie vers le haut. L’ajustement est la caractéristique déterminante de la méthode actuarielle — ne le laissez jamais tomber. (Il n’importe que lorsqu’il y a des retraits à l’intérieur d’un intervalle ; sans aucun, les deux formules coïncident.)

Intervalles trop larges — vous perdez en résolution. Des intervalles très larges regroupent de nombreux décès en une seule marche, donc la courbe devient anguleuse et s’écarte de la vraie survie (Kaplan-Meier), et l’hypothèse actuarielle de « retraits uniformes » devient plus fragile. Trop étroits et la plupart des intervalles sont vides, ajoutant du bruit. Adaptez l’intervalle à la résolution réelle des données (le calendrier des bilans, le regroupement) — et visez une poignée d’événements par intervalle.

Mélanger données groupées et exactes. Si vous disposez réellement de temps d’événement exacts, ne les regroupez pas dans une table de survie — vous jetez de la résolution pour rien. Utilisez directement Kaplan-Meier. La table de survie est faite pour quand les données arrivent groupées, pas pour grossir des données que vous avez déjà à pleine résolution.

Questions fréquentes

Une table de survie (méthode actuarielle) estime la survie sur des intervalles de temps fixes — elle n’a besoin que des décès et des retraits par intervalle, pas des temps d’événement exacts. Kaplan-Meier place une marche à chaque temps d’événement exact. Elles estiment la même fonction de survie et concordent étroitement ; la table de survie est la sœur à résolution plus grossière que vous utilisez quand les données arrivent groupées (bilans annuels, registres regroupés) et que les temps exacts sont indisponibles.

La méthode actuarielle est l’estimateur de la table de survie. Pour chaque intervalle elle calcule la probabilité conditionnelle de décès \(q_j = d_j / (n_j - w_j/2)\) — les décès divisés par le nombre effectif de sujets à risque, où la moitié des retraits est retranchée car les patients censurés n’étaient à risque que pendant une partie de l’intervalle — puis multiplie les probabilités de survie par intervalle \(p_j = 1 - q_j\) pour obtenir la survie cumulée. Le nom vient de ses origines dans la science actuarielle (assurance).

Parce qu’un patient censuré au milieu d’un intervalle n’était à risque que pendant une partie de celui-ci, pas tout l’intervalle. La méthode actuarielle suppose que les retraits sont répartis uniformément sur l’intervalle, donc en moyenne chacun contribue pour la moitié de l’exposition de l’intervalle. Retrancher withdrawn/2 donne le nombre effectif de sujets à risque ; le sauter gonfle le dénominateur et biaise la survie vers le haut.

Utilisez une table de survie quand vos données sont groupées ou enregistrées par intervalle — vous savez combien de sujets sont morts et ont abandonné dans chaque intervalle mais pas les temps d’événement exacts (par ex. bilans périodiques, grands registres rapportés par intervalle). Utilisez Kaplan-Meier chaque fois que vous disposez des temps d’événement exacts, ce qui est le cas habituel en essai clinique. Elles concordent quand les intervalles sont fins, donc KM est préféré chaque fois que les temps exacts existent.

Adaptez l’intervalle à la résolution de vos données — le calendrier des bilans ou le regroupement que les données ont déjà. Visez une poignée d’événements par intervalle : trop large et la courbe perd en résolution et s’écarte de la vraie survie ; trop étroit et la plupart des intervalles sont vides, ajoutant du bruit. En cas de doute, essayez quelques largeurs et vérifiez que les estimations de survie sont stables.

Testez vos connaissances

  1. Construisez-la. Dans la cellule interactive ci-dessous, un intervalle compte 100 à risque, 20 décès et 10 retraits. Remplissez les blancs pour calculer le nombre effectif de sujets à risque et la probabilité conditionnelle de survie \(p\) pour cet intervalle.
  2. Interprétez. Si la survie cumulée à l’entrée de cet intervalle était de 0.80, quelle est la survie cumulée à la fin de celui-ci ?

Le nombre effectif de sujets à risque retranche la moitié des retraits : n_risk - withdrawn/2. La survie conditionnelle est p = 1 - deaths/eff_n. Pour la survie cumulée à la fin de l’intervalle, multipliez la survie cumulée entrante par le p de cet intervalle.

eff_n <- 100 - 10/2          # = 95
q     <- 20 / 95             # = 0.211
p     <- 1 - q               # = 0.789
# Cumulative survival at end of interval:
0.80 * p                     # = 0.80 × 0.789 = 0.631

Le nombre effectif de sujets à risque est 95 (pas 100 — la moitié des 10 retraits est retirée). La probabilité conditionnelle de survivre à l’intervalle est de 0.789, donc la survie cumulée tombe de 0.80 à environ 0.63 à la fin de l’intervalle. Si vous aviez oublié l’ajustement des retraits (q = 20/100 = 0.20, p = 0.80), vous auriez surestimé la survie de fin d’intervalle à 0.64 — le biais que la correction actuarielle supprime.

AstuceVérification rapide

Vous disposez d’un grand registre où la survie n’est enregistrée qu’aux visites annuelles — vous savez combien de patients sont morts chaque année mais pas les dates exactes. Quel estimateur utiliser, et pourquoi ?

Une table de survie (méthode actuarielle). Les données sont groupées en intervalles annuels, donc vous n’avez pas les temps d’événement exacts que Kaplan-Meier requiert — mais vous avez les décès et les retraits par intervalle, ce qui est exactement ce dont la table de survie a besoin. Kaplan-Meier ne serait approprié que si vous connaissiez le jour exact de chaque décès.

Conclusion

Vous savez désormais réaliser une analyse par table de survie en R : regrouper les données de suivi en intervalles, compter le nombre de sujets à risque, les décès et les retraits par intervalle, appliquer l’ajustement actuariel retraits/2 pour obtenir le nombre effectif de sujets à risque, et multiplier les probabilités de survie par intervalle en une estimation de survie cumulée — le tout en R base, sans package spécial. La table de survie est l’estimateur naturel quand les données arrivent groupées plutôt qu’en temps d’événement exacts ; superposée à la courbe de Kaplan-Meier, elle se situe presque exactement dessus, confirmant que les deux sont la même idée à deux résolutions. Quand vous avez des temps d’événement exacts, tournez-vous vers Kaplan-Meier ; quand vos données arrivent en intervalles, la table de survie est le bon outil.

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 = {Table de survie en R : la méthode actuarielle pas à pas},
  date = {2026-06-26},
  url = {https://www.datanovia.com/learn/biostatistics/survival-analysis/life-tables},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“Table de survie en R : la méthode actuarielle pas à pas.” 2026. June 26. https://www.datanovia.com/learn/biostatistics/survival-analysis/life-tables.