I have a longitudinal data with 8 follow-ups. My aim is to see the effect of a disease on ability decline at old age. In my study, I have sibling pairs, one with disease (1) and one without disease (0). And, in this study disease has happened before ability decline. I want to use age as time in my model. Is it correct to say: time = age at ability decline-age at disease and status is 1 as ability decline and 0 if decline does not happened. then I have left-truncation, which is age at inclusion. How can I deal with left-truncation in my model in R? here is what I have done.

coxph(Surv(time, status) ~ disease + cluster(siblingid), 
    data = dat)
  • $\begingroup$ Can those without disease also have an "ability decline"? $\endgroup$
    – EdM
    May 15, 2022 at 18:39
  • $\begingroup$ @EdM yes, they can have. $\endgroup$
    – user358238
    May 15, 2022 at 19:18
  • $\begingroup$ @EdM thank you for your answer. I have added a comment below. could you please help for defining startTime and stopTime? considering that I have 5 follow-up, some may include into the study at time 2 of follow-up and some at time 3 of follow-up. For the sibling without disease I use the same age as her sibling who got the disease. $\endgroup$
    – user358238
    May 19, 2022 at 7:18

1 Answer 1


The standard counting-process setup used to handle time-varying covariate values works here in principle, as that also represents left-truncated starting times with events or right censoring at the end of the time period. That is, with the construction Surv(startTime,stopTime,status), the startTime is considered left truncated and status represents either an event or censoring at stopTime.

I'm not sure that's a good idea in your case, however.

First, when you use birth as time = 0 and have left-truncated survival times, you can get very weird results. Unlike a more typical survival model with everyone at risk at time = 0, only those with the earliest entry dates are at risk at the earliest event times. It's even possible to have survival curves drop to 0 if those early-entry cases have events before others enter the risk set at later ages. See Section 4.6 of Klein and Moeschberger. They suggest:

Rather than estimating the unconditional survival function, we estimate the conditional probability of surviving beyond age t, given survival to age a.

An alternative that I would tend to prefer would be to use age at inclusion as a covariate (modeled flexibly with a regression spline) and using time since inclusion as your time to event or right censoring. If inclusion was based on a clinical diagnosis of the disease near the time of inclusion, that would make sense. For example, that's how age is typically handled in cancer survival studies. You'll have to apply your understanding of the subject matter to decide if that makes sense for you.

Second, if you only have 5 follow-up times then a Cox model assuming continuous time probably isn't a wise choice. If the evaluation of the "ability decline" event is only made at follow-up times, then your event times are themselves interval censored: you only have lower and upper limits for the actual elapsed time from time = 0 to the event.

If the 5 follow-up intervals are the same for all individuals (e.g., every 6 months), you might use a discrete-time survival model, which is essentially a set of binary regressions. With your paired data that might be done via a set of conditional logistic regressions (which end up being solved with Cox survival routines for stratified data via the clogit() function), but I haven't thought that through carefully.

Otherwise you need to use a model that handles interval-censored survival data. The standard R survreg() function can handle interval censoring in a parametric survival model. The R icenReg package provides additional ways to handle interval censoring, although I'm not sure how it handles things like your clusters. The package vignette explains interval censoring pretty clearly and shows examples; the package author also visits this site.

Third, consider whether an all-or-none "ability decline" event designation is the best way to proceed. "Ability decline" is typically a process graded over time. Modeling a quantitative measure of "ability" over time could be much more powerful and informative.

  • $\begingroup$ @user358238 if you really want to use age as the time reference instead of the study-entry date, then you would set time 1 to be the age at study entry (interpreted as left truncation) and time 2 to be the age at the event or the right censoring. I'm not sure whether that will work with your cluster() term, however, as I haven't tried anything like that. Again, I think that your model will be easier to interpret if you use the cancer diagnosis data as the time = 0 reference, express event/censoring times relative to that diagnosis date, and use age as a covariate. $\endgroup$
    – EdM
    May 19, 2022 at 15:38
  • $\begingroup$ If you found this answer helpful, then please consider upvoting and/or accepting it. $\endgroup$ May 21, 2022 at 15:05

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.