Covariables dépendantes du temps (modèle de Cox, R)

Inclure une covariable qui change pendant le suivi — construire des données en processus de comptage (start, stop, event) avec tmerge, ajuster le modèle, et éviter le biais du temps immortel qui ruine l’analyse naïve

Modélisez avec un modèle de Cox en R des covariables dont la valeur change pendant le suivi. Construisez le format de données en processus de comptage (start, stop, event) avec tmerge, ajustez coxph(Surv(start, stop, event) ~ …), interprétez le hazard ratio dépendant du temps, et voyez comment l’analyse naïve fondée uniquement sur l’état initial crée un biais du temps immortel sur les données de greffe cardiaque de Stanford — et quand préférer une analyse landmark plus simple.

Date de publication

26 juin 2026

Modifié

7 juillet 2026

AstucePoints clés
  • Une covariable dépendante du temps est un prédicteur dont la valeur change pendant le suivi — un traitement reçu plus tard, un biomarqueur qui dérive, un statut qui bascule. Un modèle de Cox de base ne peut pas la capturer.
  • L’erreur fatale est le biais du temps immortel : traiter un statut futur (p. ex. « déjà greffé ») comme s’il était connu dès l’état initial. Un patient doit survivre assez longtemps pour atteindre ce statut, ce qui fabrique un faux avantage de survie. Sur les données de greffe cardiaque, le modèle naïf rapporte une réduction du risque de 82 % (HR ≈ 0.18) qui s’évanouit (HR ≈ 1.0) dès qu’on procède correctement.
  • Procédez correctement avec le format en processus de comptage : découpez chaque patient en intervalles (start, stop, event) pour que la covariable prenne sa valeur correcte pendant chaque intervalle. Construisez-le avec tmerge().
  • Ajustez-le avec coxph(Surv(start, stop, event) ~ ...) — la formule et l’interprétation sont par ailleurs identiques à un modèle de Cox ordinaire.
  • Quand la construction en processus de comptage est laborieuse, l’analyse landmark est l’alternative robuste plus simple : choisissez un temps landmark, classez chacun selon son statut à ce moment-là, et n’analysez que les survivants.
  • Une covariable dépendante du temps (une valeur qui change) n’est pas la même chose qu’un coefficient dépendant du temps (une valeur fixe dont l’effet change — une violation de PH).

Introduction

Recevoir une greffe cardiaque améliore-t-il la survie ? L’analyse évidente — répartir les patients entre « greffés » et « non greffés », puis comparer — donne une réponse spectaculaire : la greffe réduit drastiquement le risque de décès. Elle est aussi fausse. Un patient ne peut être compté comme « greffé » que s’il a vécu assez longtemps pour recevoir l’organe ; quiconque est mort en attendant est forcé dans le groupe « non greffé ». Le groupe greffé reçoit une période de survie garantie — le temps immortel — qui n’a rien à voir avec l’opération. La comparaison est truquée avant même de commencer.

C’est le problème central des covariables dépendantes du temps : des prédicteurs dont la valeur change pendant le suivi. Le statut de greffe (0 puis 1), un biomarqueur qui s’élève, un traitement enclenché en cours de route — aucun de ceux-ci n’est un nombre fixe à l’état initial, et prétendre le contraire produit un biais du temps immortel, l’une des erreurs les plus courantes et les plus dommageables de l’analyse de survie.

La solution consiste à laisser la covariable changer à l’intérieur du modèle. Vous restructurez chaque patient en courts intervalles de temps, donnez à la covariable sa valeur correcte dans chacun, et ajustez un modèle de Cox là-dessus. Cette leçon montre toute la recette en R avec survival (le constructeur tmerge() et coxph()) et survminer (le forest plot), à l’aide des classiques données de greffe cardiaque de Stanford pour voir le résultat biaisé s’effondrer en résultat honnête. Vous apprendrez à :

  • reconnaître une covariable dépendante du temps et le biais du temps immortel qui accompagne sa mauvaise gestion ;
  • construire le format de données en processus de comptage (start, stop, event) — à la main et avec tmerge() ;
  • ajuster et interpréter coxph(Surv(start, stop, event) ~ ...) ;
  • quantifier le biais en comparant le modèle naïf et le modèle correct ;
  • et choisir l’analyse landmark quand c’est le meilleur outil.
NoteLes deux choses qu’on appelle « dépendant du temps »

Ne les confondez pas — elles appellent des solutions différentes :

  • Une covariable dépendante du temps (cette leçon) : la valeur change au cours du temps (greffe 0 → 1). Vous la corrigez avec le format en processus de comptage.
  • Un coefficient dépendant du temps : la valeur est fixe, mais son effet (le hazard ratio) change au cours du temps — une violation de l’hypothèse des risques proportionnels. Vous le corrigez avec tt(), une interaction avec le temps, ou la stratification.

Le piège : le biais du temps immortel, rendu visible

Commencez par la mauvaise analyse, car la voir échouer est le moyen le plus rapide de comprendre la solution. Le jeu de données jasa (étude de greffe cardiaque de Stanford) est livré avec le package survival avec une ligne par patient : un temps de suivi (futime), un indicateur de décès (fustat), et un drapeau transplant marquant si le patient a été un jour greffé.

Ajustez un modèle de Cox traitant « déjà greffé » comme une covariable fixe à l’état initial — exactement l’analyse que l’instinct vous dicte de lancer :

library(survival)

# WRONG: `transplant` here = "ever transplanted", a FUTURE status used as a baseline value
bad.cox <- coxph(Surv(futime, fustat) ~ transplant + age + surgery, data = jasa)
summary(bad.cox)$conf.int
           exp(coef) exp(-coef) lower .95 upper .95
transplant 0.1795839   5.568429 0.1040357 0.3099933
age        1.0606546   0.942814 1.0298264 1.0924057
surgery    0.6576938   1.520464 0.3177452 1.3613459

Lisez la ligne transplant : HR ≈ 0.18, un IC à 95 % d’environ 0.10–0.31, p < 0.0001. Pris au pied de la lettre, la greffe réduit le hazard de décès de 82 % — un médicament miracle. C’est un artefact. Chaque patient du groupe greffé a survécu jusqu’à son opération ; ce temps d’attente est immortel, et le modèle le crédite à la greffe.

AvertissementPourquoi c’est biaisé, en une phrase

Pour être étiqueté « greffé », un patient devait rester en vie jusqu’à la greffe — donc l’étiquette elle-même sélectionne la survie, et le hazard ratio mesure cette sélection, pas le traitement.

La solution : le format en processus de comptage

Le modèle honnête laisse transplant valoir 0 avant l’opération et 1 après — pour le même patient. Vous faites cela en découpant chaque patient en intervalles de temps et en donnant à la covariable sa valeur correcte dans chacun. C’est le format de données en processus de comptage (ou (start, stop, event)).

Le jeu de données heart est la même étude de Stanford déjà dans ce format. Regardez trois patients :

library(survival)

# Patients 2 (never transplanted), 3 and 4 (transplanted partway through)
heart[heart$id %in% c(2, 3, 4), c("id", "start", "stop", "event", "transplant", "age", "surgery")]
  id start stop event transplant       age surgery
2  2     0    6     1          0  3.835729       0
3  3     0    1     0          0  6.297057       0
4  3     1   16     1          1  6.297057       0
5  4     0   36     0          0 -7.737166       0
6  4    36   39     1          1 -7.737166       0

Lisez les lignes :

  • Le patient 2 a un intervalle (0, 6], transplant = 0 tout du long — jamais greffé, mort au jour 6.
  • Le patient 4 a deux intervalles : (0, 36] avec transplant = 0 (toujours en attente), puis (36, 39] avec transplant = 1 (après l’opération), avec l’événement sur le second. La covariable change de valeur au jour 36 — exactement ce qu’une seule ligne à l’état initial ne peut exprimer.

Chaque intervalle est une ligne distincte, mais event vaut 1 uniquement sur l’intervalle où l’événement s’est réellement produit (chaque intervalle antérieur est event = 0, un fragment censuré qui contribue tout de même son temps-personne). C’est toute l’astuce : le patient est « à risque avec transplant = 0 » pour la première portion et « à risque avec transplant = 1 » pour la seconde.

Construisez-le vous-même avec tmerge()

Vous recevez rarement des données déjà découpées. Le tmerge() du package survival construit le format en processus de comptage à partir d’une table à l’état initial plus les temps auxquels les choses changent. Partez d’un état initial par patient (jasa), calculez le temps de suivi et le temps de greffe de chaque patient, puis fusionnez :

library(survival)

# One row per patient: id, follow-up time, transplant time (the day status flips), death
jasa$subject <- seq_len(nrow(jasa))
tdata <- with(jasa, data.frame(
  subject = subject,
  futime  = pmax(0.5, fu.date - accept.dt),                                 # follow-up days
  txtime  = ifelse(is.na(tx.date), (fu.date - accept.dt) - 1,               # never transplanted
                                   (tx.date - accept.dt)),                  # day of transplant
  fustat  = fustat
))

# tmerge: lay down the death event, then add `trt` as a time-dependent covariate (tdc)
sdata <- tmerge(jasa, tdata, id = subject,
                death = event(futime, fustat),
                trt   = tdc(txtime))

# the resulting counting-process rows
head(sdata[, c("subject", "tstart", "tstop", "death", "trt")], 8)
  subject tstart tstop death trt
1       1      0    48     0   0
2       1     48    49     1   1
3       2      0     4     0   0
4       2      4     5     1   1
5       3      0    15     1   1
6       4      0    35     0   0
7       4     35    38     1   1
8       5      0    16     0   0

Deux fonctions auxiliaires font le travail : event(time, status) marque où l’événement se situe, et tdc(time)covariable dépendante du temps — fait basculer trt de 0 à 1 à txtime. tmerge() renvoie une ligne par intervalle, avec les bornes tstart/tstop et la covariable portant sa valeur correcte dans chacun. Un patient greffé au jour 36 obtient un intervalle trt = 0 jusqu’au jour 36 et un intervalle trt = 1 après — la même structure que celle vue dans heart, construite de zéro.

AstuceLire le résultat de tmerge

tmerge() imprime un attribut tcount résumant comment chaque ajout s’est placé (combien de changements sont tombés dans le suivi, avant lui, etc.). Vérifiez-le : des changements qui tombent après le suivi d’un patient, ou qui s’empilent le même jour, sont généralement le signe que les temps fournis en entrée sont erronés.

Ajuster le modèle de Cox dépendant du temps

Avec les données sous forme (start, stop, event), l’ajustement est le même appel coxph() qu’un modèle de Cox ordinaire — seule la réponse Surv() gagne un temps de départ. Utilisez heart (il porte aussi age et surgery) :

library(survival)

# RIGHT: transplant is 0 before the operation, 1 after — within the same patient
tv.cox <- coxph(Surv(start, stop, event) ~ transplant + age + surgery, data = heart)
summary(tv.cox)
Call:
coxph(formula = Surv(start, stop, event) ~ transplant + age + 
    surgery, data = heart)

  n= 172, number of events= 75 

                coef exp(coef) se(coef)      z Pr(>|z|)  
transplant1  0.01610   1.01623  0.30859  0.052   0.9584  
age          0.03054   1.03101  0.01389  2.198   0.0279 *
surgery     -0.77333   0.46147  0.35967 -2.150   0.0315 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

            exp(coef) exp(-coef) lower .95 upper .95
transplant1    1.0162     0.9840     0.555    1.8606
age            1.0310     0.9699     1.003    1.0595
surgery        0.4615     2.1670     0.228    0.9339

Concordance= 0.6  (se = 0.036 )
Likelihood ratio test= 10.72  on 3 df,   p=0.01
Wald test            = 9.68  on 3 df,   p=0.02
Score (logrank) test = 10  on 3 df,   p=0.02

Interprétez la sortie :

  • transplant : HR ≈ 1.02, IC à 95 % 0.55–1.86, p = 0.96. Une fois le statut de greffe traité correctement, il n’y a aucun bénéfice de survie détectable — le HR est posé sur 1 et l’IC est large des deux côtés. La miraculeuse réduction de 82 % était entièrement du biais du temps immortel.
  • age : HR ≈ 1.03 par année, p = 0.03. Les patients plus âgés ont un hazard modestement plus élevé (l’âge ici est centré sur 48, donc le HR est par année supplémentaire).
  • surgery : HR ≈ 0.46, p = 0.03. Un pontage antérieur est associé à un hazard plus bas.
  • n = 172 lignes pour 103 patients, 75 événements — les lignes sont des intervalles, pas des personnes ; coxph() traite correctement les multiples intervalles d’un patient comme le temps-personne d’un même sujet.

Le biais, quantifié

Mettez les deux hazard ratios de transplant côte à côte — ce contraste est la leçon :

library(survival)
library(survminer)

bad.cox <- coxph(Surv(futime, fustat) ~ transplant + age + surgery, data = jasa)
tv.cox  <- coxph(Surv(start, stop, event) ~ transplant + age + surgery, data = heart)

# Pull the transplant HR + 95% CI from each model into a small data frame
hr_row <- function(model, term, label) {
  ci <- summary(model)$conf.int[term, c("exp(coef)", "lower .95", "upper .95")]
  data.frame(model = label, hr = ci[1], lo = ci[2], hi = ci[3])
}
df <- rbind(
  hr_row(bad.cox, "transplant",  "Naive baseline-only\n(immortal-time bias)"),
  hr_row(tv.cox,  "transplant1", "Correct time-varying")
)

ggplot(df, aes(x = hr, y = model)) +
  geom_vline(xintercept = 1, linetype = "dashed", colour = "grey50") +
  geom_errorbar(aes(xmin = lo, xmax = hi), width = 0.15, orientation = "y", colour = "#3a86d4") +
  geom_point(size = 3, colour = "#3a86d4") +
  scale_x_log10(breaks = c(0.1, 0.2, 0.5, 1, 2)) +
  labs(x = "Hazard ratio for transplant (log scale)", y = NULL) +
  theme_minimal(base_size = 12)

A forest plot comparing the transplant hazard ratio from two models on the Stanford heart-transplant data. The naive baseline-only model sits far left of the reference line at 1 (hazard ratio about 0.18, a spuriously strong protective effect from immortal-time bias), while the correct time-varying model sits right on the line at hazard ratio about 1.0 (no effect). The contrast shows the bias the time-varying analysis removes.

Le point naïf est posé loin à gauche de 1 (HR ≈ 0.18, un fort effet « protecteur ») ; le point correct dépendant du temps est posé sur la ligne (HR ≈ 1.0, aucun effet). Mêmes données, mêmes patients — la seule différence est de savoir si transplant a été autorisé à changer de valeur au bon moment. Cet écart, c’est le biais.

Rapport

Le statut de greffe a été modélisé comme une covariable dépendante du temps au moyen de la formulation en processus de comptage (coxph(Surv(start, stop, event) ~ ...)) sur les données de greffe cardiaque de Stanford (103 patients, 75 décès). Après avoir correctement tenu compte du temps de la greffe, la greffe n’était pas associée à la survie (HR = 1.02, IC à 95 % 0.55–1.86, p = 0.96). Une analyse naïve traitant la greffe comme une caractéristique fixe à l’état initial suggérait à tort un bénéfice important (HR = 0.18, IC à 95 % 0.10–0.31), un artefact du biais du temps immortel.

Analyse landmark — l’alternative robuste plus simple

Construire des données en processus de comptage est délicat, et quand la question est vraiment « étant donné le statut d’un patient à un point fixe, que se passe-t-il ensuite ? », l’analyse landmark est plus nette et plus difficile à rater. La recette :

  1. Choisissez un temps landmark (p. ex. jour 30) — choisi pour des raisons cliniques/biologiques, pas à partir des données.
  2. Écartez toute personne morte ou censurée avant lui — l’analyse démarre le chronomètre au landmark.
  3. Classez les survivants selon leur valeur de covariable au landmark.
  4. Ajustez un modèle de Cox ordinaire à partir du landmark.

Comme chaque sujet était en vie au landmark et est classé selon son statut en cours à ce moment-là, il n’y a aucun temps immortel pour biaiser la comparaison. La voici sur heart, avec un landmark au jour 30 :

library(survival)

# Build a per-patient table: status at day 30, and survival measured FROM day 30
landmark <- 30

per_patient <- do.call(rbind, lapply(split(heart, heart$id), function(d) {
  d <- d[order(d$stop), ]
  total_stop  <- max(d$stop)                                   # last follow-up time
  died        <- d$event[which.max(d$stop)]                    # 1 if died at the end
  tx_by_30    <- as.integer(any(d$transplant == 1 & d$start < landmark))
  data.frame(id = d$id[1], stop = total_stop, event = died,
             tx30 = tx_by_30, age = d$age[1], surgery = d$surgery[1])
}))

# Keep only patients alive past the landmark; survival time is measured FROM the landmark
lm_data <- per_patient[per_patient$stop > landmark, ]
lm_data$time_from_lm <- lm_data$stop - landmark

lm.cox <- coxph(Surv(time_from_lm, event) ~ tx30 + age + surgery, data = lm_data)
summary(lm.cox)$conf.int
        exp(coef) exp(-coef) lower .95 upper .95
tx30    0.9587380  1.0430378 0.5497392 1.6720267
age     1.0378955  0.9634881 1.0036068 1.0733557
surgery 0.4405816  2.2697269 0.1961135 0.9897949

Le modèle landmark pose une question bien posée — parmi les patients en vie au jour 30, le fait d’avoir été greffé d’ici là prédit-il la survie ultérieure ? — et, comme le modèle dépendant du temps, ne trouve aucun bénéfice clair pour tx30. Le compromis : l’analyse landmark écarte les événements précoces et l’information avant le landmark, et la réponse peut dépendre du landmark choisi (rapportez une analyse de sensibilité à quelques temps). Utilisez-la quand il existe un point de décision naturel ; utilisez le modèle en processus de comptage quand vous voulez chaque événement et une covariable qui se met à jour en continu.

AstuceLequel devrais-je utiliser ?
  • Processus de comptage / tmerge → la covariable se met à jour de façon répétée (un biomarqueur mesuré à de nombreuses visites), vous voulez une efficacité maximale (chaque événement compte), et vous pouvez construire les intervalles de façon fiable.
  • Analyse landmark → il existe un point de décision naturel, vous voulez une réponse simple et difficile à biaiser, et vous pouvez vous permettre d’écarter les événements pré-landmark.

Une note sur les coefficients dépendants du temps

Une covariable dépendante du temps est une valeur qui change. Un problème différent — une covariable fixe dont l’effet change au cours du temps — est un coefficient dépendant du temps, c.-à-d. une violation de l’hypothèse des risques proportionnels. Vous le diagnostiquez avec cox.zph() et le corrigez avec tt(), une interaction temps × covariable, ou la stratification. C’est un workflow distinct couvert dans Tester l’hypothèse des risques proportionnels. Gardez les deux bien distincts : la valeur change → processus de comptage (cette leçon) ; l’effet changett() / remèdes non-PH.

Essayez en direct

Construisez le modèle dépendant du temps et comparez-le au modèle biaisé. Essayez un autre temps landmark, ou ajoutez year (le temps écoulé depuis le début de l’étude) au modèle. Le bac à sable démarre au premier Run.

🟢 Avec un agent IA

Demandez à Prova « ma covariable change pendant le suivi — aide-moi à construire des données en processus de comptage (start, stop, event) avec tmerge et à ajuster un modèle de Cox dépendant du temps, et vérifie que je ne crée pas de biais du temps immortel » — elle répond avec du code survival que vous pouvez exécuter sur vos propres données. The runtime is the judge. Demander à Prova →

Problèmes courants

Vous avez oublié Surv(start, stop, event) et utilisé Surv(time, event). Avec des données en processus de comptage, la réponse a besoin de trois arguments — un start, un stop et l’événement. N’en passer que deux ramène chaque intervalle à « temps depuis zéro », double-compte silencieusement le temps-personne, et donne des estimations fausses. Le signe révélateur : votre n égale le nombre d’intervalles, pas le nombre que vous visiez, et les erreurs standard paraissent trop petites.

L’événement est codé sur le mauvais intervalle. Seul l’intervalle où l’événement s’est réellement produit peut porter event = 1 ; chaque intervalle antérieur de ce patient est event = 0. Si vous recopiez le statut final du patient sur toutes ses lignes, vous enregistrez plusieurs « événements » pour un seul décès. Laissez le event() de tmerge le placer pour vous, ou fixez-le explicitement sur le dernier intervalle seulement.

Intervalles qui se chevauchent ou de longueur nulle après tmerge. Les intervalles doivent être non chevauchants et avoir stop > start. Deux changements le même jour, ou un temps de greffe égal au temps de décès, produisent un intervalle de longueur nulle que coxph() écarte ou sur lequel il échoue. Vérifiez l’attribut tcount, écartez les temps ex æquo d’une fraction de jour, et assurez-vous que chaque tstop dépasse son tstart.

Questions fréquentes

Le biais du temps immortel survient quand une portion de suivi durant laquelle l’événement ne peut pas se produire est mal attribuée à un groupe de traitement. Le cas classique : classer les patients selon un statut qu’ils ne peuvent atteindre qu’en survivant (p. ex. « a reçu une greffe », « a répondu au traitement à 12 semaines »). Ces patients devaient rester en vie pour être étiquetés, donc l’étiquette sélectionne la survie et fabrique un faux bénéfice. Corrigez-le en modélisant le statut comme une covariable dépendante du temps (format en processus de comptage) ou avec une analyse landmark — jamais en traitant un statut futur comme une valeur à l’état initial.

Restructurez les données dans le format en processus de comptage — une ligne par intervalle (start, stop, event), avec la covariable prenant sa valeur correcte dans chaque intervalle — puis ajustez coxph(Surv(start, stop, event) ~ covariables, data). Construisez les intervalles avec tmerge() du package survival : event() place le résultat, et tdc() ajoute une covariable dépendante du temps qui bascule de valeur à un temps donné. La formule du modèle et l’interprétation du hazard ratio sont par ailleurs identiques à un modèle de Cox ordinaire.

C’est un format long où chaque sujet est découpé en un ou plusieurs intervalles de temps, chacun une ligne avec un temps de start, un temps de stop, et un indicateur d’event (1 uniquement sur l’intervalle contenant l’événement). Les covariables peuvent prendre une valeur différente sur chaque intervalle, donc un statut qui change en cours de suivi (greffe 0 → 1) est représenté exactement. Vous l’ajustez avec Surv(start, stop, event). Le jeu de données heart du package survival est un exemple travaillé ; tmerge() construit le format à partir des données à l’état initial plus les temps de changement.

Une covariable dépendante du temps a une valeur qui change au cours du temps (un biomarqueur, un traitement enclenché plus tard) — vous la gérez avec le format en processus de comptage et tmerge(). Un coefficient dépendant du temps est une covariable fixe dont l’effet (le hazard ratio) change au cours du temps — une violation de l’hypothèse des risques proportionnels — que vous gérez avec tt(), une interaction avec le temps, ou la stratification (voir tester l’hypothèse de PH). Des problèmes différents, des solutions différentes ; ne les confondez pas.

Utilisez une analyse landmark quand il existe un point de décision naturel et que vous voulez une réponse simple et difficile à biaiser : choisissez un temps landmark, ne gardez que les patients en vie à ce moment, classez-les selon leur statut au moment de ce temps, et ajustez un modèle de Cox ordinaire à partir du landmark. Elle évite le temps immortel par construction mais écarte les événements pré-landmark et dépend du landmark choisi. Préférez le modèle en processus de comptage / dépendant du temps quand la covariable se met à jour de façon répétée ou que vous voulez que chaque événement contribue.

Testez vos connaissances

  1. Exécutez-le. Dans la cellule live ci-dessous, ajustez le modèle de Cox dépendant du temps sur heart, mais laissez de côté surgery (gardez transplant et age). Remplissez le blanc. Le hazard ratio de transplant reste-t-il proche de 1 ?
  2. Interprétez. Un collègue rapporte que « les patients qui sont passés au nouveau médicament pendant l’essai ont vécu bien plus longtemps (HR = 0.4) » — et il a classé le changement depuis l’entrée dans l’étude. Nommez le biais et la solution.

Remplissez le blanc avec transplant. La réponse est toujours Surv(start, stop, event) pour des données en processus de comptage. Regardez le exp(coef) de la ligne transplant1 et sa p-value — un HR proche de 1 avec une p-value non significative signifie aucun effet détectable.

tv.cox <- coxph(Surv(start, stop, event) ~ transplant + age, data = heart)
summary(tv.cox)
#> transplant1 HR is still ~1 (p large) — no transplant benefit once status is time-varying.
#> Dropping `surgery` barely moves it: the transplant null is robust, not an artefact of adjustment.

Pour la question 2 : c’est un biais du temps immortel — les patients devaient survivre assez longtemps pour changer de médicament, donc le groupe des « changeurs » est sélectionné pour la survie, ce qui fausse le HR = 0.4. La solution est de modéliser le changement comme une covariable dépendante du temps (format en processus de comptage avec tmerge()), pour que chaque patient contribue du temps-personne drug = old avant le changement et drug = new après — ou d’utiliser une analyse landmark à un temps fixe.

AstuceVérification rapide

Une étude classe les patients en « répondeurs » vs « non-répondeurs » d’après une réponse mesurée à 8 semaines, puis compare la survie depuis l’entrée dans l’étude. Pourquoi l’avantage de survie des répondeurs est-il probablement surestimé ?

Biais du temps immortel. Pour être un « répondeur », un patient devait survivre jusqu’à l’évaluation à 8 semaines — quiconque est mort plus tôt est automatiquement un non-répondeur. Le groupe des répondeurs est donc garanti au moins 8 semaines sans événement qui n’ont rien à voir avec le fait de répondre, ce qui gonfle sa survie apparente. Corrigez-le en traitant la réponse comme une covariable dépendante du temps (elle ne devient 1 qu’à la semaine 8) ou avec une analyse landmark à la semaine 8 en n’utilisant que les survivants.

Conclusion

Vous savez désormais gérer une covariable qui change pendant le suivi sans tomber dans le piège qui en attrape tant en analyse de survie. L’intuition clé est qu’un statut futur — greffe, réponse, changement de médicament — ne peut pas être une valeur à l’état initial : prétendre le contraire crée un biais du temps immortel et un hazard ratio qui est pur artefact (le « bénéfice de 82 % » des données de greffe cardiaque qui s’est évaporé en rien). L’analyse honnête place la covariable dans le format en processus de comptage (start, stop, event) — construit à la main ou, en pratique, avec tmerge() — et ajuste le même coxph() que vous connaissez déjà. Quand cette construction est laborieuse ou que la question a un point de décision naturel, l’analyse landmark donne une réponse plus simple et résistante au biais. Gardez claire la distinction avec un coefficient dépendant du temps (une violation de PH), et vous disposez de toute la panoplie pour des données de survie qui refusent de rester immobiles.

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 = {Covariables dépendantes du temps (modèle de Cox, R)},
  date = {2026-06-26},
  url = {https://www.datanovia.com/learn/biostatistics/survival-analysis/time-varying-covariates},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“Covariables dépendantes du temps (modèle de Cox, R).” 2026. June 26. https://www.datanovia.com/learn/biostatistics/survival-analysis/time-varying-covariates.