This question is a follow up to the other one asked by someone else (Right censored survival analysis with interval data in R) and this one by me Left censoring with time-varying covariates

I have participants assessed at specific time-points (0,5,10,15...) for their health status and if they have had certain disease by that time (event = time of first heart failure). For example, participant 1 did not experience the heart failure between 0 and 5, but did between 5 and 10, BMI was 23.3 and then 25.7. Looking at the literature, standard is to assign event time to t2 (or to the mid-point between t1 and t2) and use Cox model e.g. coxph(Surv(t1, t_censored, event) ~ bmi + age + gender).

id  time_0 time_1      age event  bmi   gender  t_event_mid  t_censored  t_interval_0 t_interval_1
1       0    5.0      43.5    0  23.3       1       NaN             5.0           5.0        NaN
1       5   10.0      58.5    1  25.7       1       7.5             7.5           5.0       10.0
2       0    5.0      49.8    0  27.8       0       NaN             5.0           5.0        NaN
2     5.0   10.0      54.8    0  26.5       0       NaN            10.0          10.0        NaN
coxph(Surv(time_0, t_censored, event) ~ bmi + age +  gender, data= df)
ic_sp(Surv(t_interval_0, t_interval_1, type = "interval2") ~ bmi + age +  gender, data=df)

In my case intervals are quite long so I would rather use interval censoring, however the question is about the covariates and how those are accounted for, especially those that change in time (weight/BMI):

  1. In coxph() partial maximum likelihood would consider Person 1 in the risk set between 0 and 5 as someone with BMI = 23.3, who did not have an event; between 5 and 10 as someone who did at t=7.5. That is, it will only enter into the model once at each point of time.

  2. However, in Interval censoring (IcenReg or survreg with Surv(t_interval_0, t_interval_1, type = "interval2")), I fear that the model would mess up as I do not supply information on where an interval starts for right-censored observations and only when censoring event happened. E.g. person 2 who did not have HF at both intervals will supply the model information I(t_event>5|bmi=27.8) and I(t_event>10|bmi=26.5), and the idea that this is the same person gets lost (or I miss something here). In a way the question is about the difference in (by description of the packages this should be same, but those give diff estimates)

ic_sp(Surv(t_interval_0, t_interval_1, type = "interval2") ~ bmi + age +  gender, data=df)
ic_sp(Surv(t0, t1, event) ~ bmi + age +  gender, data=df) #similar

ic_par(Surv(time_0, time_1, event)~ age+bmi, data = df_int, dist = "loglogistic") 
ic_par(Surv(t_interval_0 , t_interval_1 , type="interval2")~ age + bmi, data = df_int, dist = "loglogistic") #quite different


1 Answer 1


Looking at the literature, standard is to assign event time to t2 (or to the mid-point between t1 and t2) and use Cox model ...

That might be a "standard" in the literature, but it doesn't make it correct.

I'm not completely clear on what your t_censored, t_interval_0 and t_interval_1 are supposed to represent. It's not clear that you need anything beyond your initial sets of time_0 and time_1 values for each participant to do this analysis. All time values for each interval, whether including an event or not, should be expressed relative to your chosen reference for time = 0, which I take to be the beginning of your study. Time-varying covariate values would be taken as the values at the start of each interval. Although I don't have much direct experience with this type of analysis, I understand that icenReg or survreg should be able to handle data with that time coding provided that you specify the nature of censoring or event occurrence as the software expects.

If your observation times are as fixed among participants as you show here, then you might be better off with a discrete-time model with a complementary log-log link function. That type of model is compatible with a proportional hazards interpretation, actually called a "grouped proportional hazards model." Tools like icenReg are useful when the participants differ in start- and end-points for their time intervals, but a discrete-time model would seem simpler for the type of data you show. That naturally handles time-varying covariates, right censoring (as those individuals simply disappear from the analysis after their last right censoring), and avoids the multiple tied event times that would be an issue with a standard Cox model that (erroneously) uses the interval midpoint or endpoint as the event time.

  • $\begingroup$ My concern is that in the survival package Surv(t0, t1, event) creates objects like "(0,5+] (5,10] (0,5+] (5,10+] " and coxph() treats the end of the interval as the time of event (not as interval). It understands there is interval censoring if type="interval"/ "interval2", and times presented as [t_censored, NA) for right-censored and [t_0, t_1) for interval, hence my t_interval_0/1,(as in <rdocumentation.org/packages/survival/versions/2.11-4/topics/…> and @CliffAB suggested in the mentioned post). $\endgroup$
    – DianaS
    Jul 7, 2021 at 9:46
  • $\begingroup$ So it seems "interval2" object is the one to use, however then Surv(t_interval_0 , t_interval_1 , type="interval2") looks like "5+ 10 5+" and it loses starting times, so I am not sure if time-varying covariates are accounted for correctly. ic_par give different results with two objects, ic_sp similar but not exactly same, so IcenReg also distinguishes these two types, but I did not find how exactly. $\endgroup$
    – DianaS
    Jul 7, 2021 at 9:51
  • 1
    $\begingroup$ @DianaS the Surv() function accepts type = "interval2" but the coxph() function can't process it properly (although survreg() can). Use the actual times since time = 0 for each time entry in each row of data, as indicated in the Surv() manual page, andSurv() should keep the times aligned with the correct covariate values without "los[ing] starting times." I don't have much experience with icenReg; CliffAB is the package author and might be able to help with that. For your particular application, a discrete-time model might be easier to use and explain to others. $\endgroup$
    – EdM
    Jul 7, 2021 at 12:29
  • $\begingroup$ Indeed, found that IcenReg should have "interval2" type of Surv object. jstatsoft.org/article/view/v081i12, "The syntax for this is very similar to fitting the Kaplan Meier curves with survival::survfit, but the response must either be a ‘Surv’ object with type = "interval2" or of the form cbind(l, r), where l, r are the left and right side of the observation interval for each subject. This syntax is also used for ic_sp and ic_par. " So the only question is if covariates handled correctly as this type only gives the end of the interval for right-censored data and not the start $\endgroup$
    – DianaS
    Jul 9, 2021 at 17:14

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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