# Time-varying covariates

A standard Cox model assumes each covariate is measured once and stays constant throughout follow-up. In many studies that assumption is wrong. A patient's bilirubin rises over months, a worker's cumulative exposure increases with each shift, a trial subject crosses over to the active arm mid-study. Treating a changing value as fixed introduces bias in the estimated hazard ratio. Time-varying covariates (TVC) solve this by letting the covariate take a different value in each interval of follow-up.

The counting-process form of the Cox model handles time-varying covariates naturally. Instead of one row per subject you create one row per *interval*: each row records when the subject entered the risk set (`tstart`), when they exited (`tstop`), the event indicator for that interval, and the covariate values that were constant during it. The [split_episodes()](../reference/split_episodes.md#greenwood.split_episodes) function builds this dataset from the raw repeated-measurement data, and [Surv.counting()](../reference/Surv.md#greenwood.Surv.counting) wraps it into the response object.


# The data

The `pbcseq` dataset contains repeated lab measurements for subjects in the Mayo Clinic PBC trial. It is a companion to the cross-sectional `pbc` dataset: while `pbc` gives each subject a single row with final outcome, `pbcseq` records the values of bilirubin, albumin, prothrombin time, and several other markers at each clinical visit.


``` python
import greenwood as gw

# Load both datasets as Polars DataFrames
pbc    = gw.load_dataset("pbc",    backend="polars")
pbcseq = gw.load_dataset("pbcseq", backend="polars")

pbcseq.select(["id", "day", "bili", "albumin", "protime"])
```


<style>
@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,400;0,600;1,400&family=IBM+Plex+Sans:wght@400;600&display=swap');
#gd-tbl-d88d82c4 .gt_table {
  display: table;
  border-collapse: collapse;
  table-layout: fixed;
  line-height: normal;
  margin-left: auto;
  margin-right: auto;
  color: #333333;
  font-size: 14px;
  font-weight: normal;
  font-style: normal;
  background-color: #FFFFFF;
  width: auto;
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #A8A8A8;
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #A8A8A8;
}
#gd-tbl-d88d82c4 .gt_heading {
  background-color: #FFFFFF;
  text-align: left;
  border-bottom-color: #FFFFFF;
  border-left-style: none;
  border-right-style: none;
}
#gd-tbl-d88d82c4 .gt_title {
  color: #333333;
  font-size: 125%;
  font-weight: initial;
  padding-top: 4px;
  padding-bottom: 4px;
  padding-left: 5px;
  padding-right: 5px;
  border-bottom-color: #FFFFFF;
  border-bottom-width: 0;
}
#gd-tbl-d88d82c4 .gt_subtitle {
  color: #333333;
  font-size: 85%;
  font-weight: initial;
  padding-top: 3px;
  padding-bottom: 5px;
  padding-left: 5px;
  padding-right: 5px;
  border-top-color: #FFFFFF;
  border-top-width: 0;
}
#gd-tbl-d88d82c4 .gt_bottom_border {
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #D3D3D3;
}
#gd-tbl-d88d82c4 .gt_col_headings {
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #D3D3D3;
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #D3D3D3;
  border-left-style: none;
  border-right-style: none;
}
#gd-tbl-d88d82c4 .gt_col_heading {
  color: #333333;
  background-color: #FFFFFF;
  font-size: 100%;
  font-weight: normal;
  text-transform: inherit;
  border-left-style: solid;
  border-left-width: 1px;
  border-left-color: #F2F2F2;
  border-right-style: solid;
  border-right-width: 1px;
  border-right-color: #F2F2F2;
  vertical-align: bottom;
  padding-top: 5px;
  padding-bottom: 5px;
  padding-left: 5px;
  padding-right: 5px;
  overflow-x: hidden;
}
#gd-tbl-d88d82c4 .gt_table_body {
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #D3D3D3;
}
#gd-tbl-d88d82c4 .gt_row {
  padding-top: 4px;
  padding-bottom: 4px;
  padding-left: 5px;
  padding-right: 5px;
  margin: 10px;
  border-top-style: solid;
  border-top-width: 1px;
  border-top-color: #E9E9E9;
  border-left-style: solid;
  border-left-width: 1px;
  border-left-color: #E9E9E9;
  border-right-style: solid;
  border-right-width: 1px;
  border-right-color: #E9E9E9;
  vertical-align: middle;
  overflow-x: hidden;
}
#gd-tbl-d88d82c4 .gt_left { text-align: left; }
#gd-tbl-d88d82c4 .gt_center { text-align: center; }
#gd-tbl-d88d82c4 .gt_right { text-align: right; font-variant-numeric: tabular-nums; }
#gd-tbl-d88d82c4 .gt_font_normal { font-weight: normal; }
#gd-tbl-d88d82c4 .gt_font_bold { font-weight: bold; }
#gd-tbl-d88d82c4 .gt_font_italic { font-style: italic; }
#gd-tbl-d88d82c4 .gt_striped { background-color: rgba(128,128,128,0.05); }
#gd-tbl-d88d82c4 .gt_from_md > :first-child { margin-top: 0; }
#gd-tbl-d88d82c4 .gt_from_md > :last-child { margin-bottom: 0; }
/* Data cell font */
#gd-tbl-d88d82c4 .gt_table_body .gt_row {
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 12px;
  color: #333333;
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  height: 14px;
}
/* Column label font */
#gd-tbl-d88d82c4 .gt_col_heading {
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 12px;
  color: #333333;
}
/* Row number styling */
#gd-tbl-d88d82c4 .gd-tbl-rownum {
  color: gray;
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 10px;
  border-right: 2px solid rgba(102, 153, 204, 0.5) !important;
  text-align: right;
  padding-right: 6px;
  white-space: nowrap;
}
/* Head/tail divider */
#gd-tbl-d88d82c4 tr.gd-tbl-divider td,
#gd-tbl-d88d82c4 tr.gd-tbl-divider th {
  border-bottom: 2px solid rgba(102, 153, 204, 0.5);
}
/* Missing values */
#gd-tbl-d88d82c4 .gd-tbl-missing {
  color: #B22222 !important;
  background-color: rgba(255, 193, 193, 0.35);
}
/* Column label sub-elements */
#gd-tbl-d88d82c4 .gd-tbl-colname {
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  padding-bottom: 0;
  margin-bottom: 0;
}
#gd-tbl-d88d82c4 .gd-tbl-dtype {
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  padding-top: 0;
  margin-top: 0;
  color: #666666;
}
/* Header badge styling */
#gd-tbl-d88d82c4 .gd-tbl-badge {
  display: inline-block;
  padding: 2px 10px;
  font-family: 'IBM Plex Sans', -apple-system, BlinkMacSystemFont, sans-serif;
  font-size: 10px;
  font-weight: bold;
  text-transform: uppercase;
  position: inherit;
}
#gd-tbl-d88d82c4 .gd-tbl-badge-rows-label {
  background-color: #eecbff;
  color: #333333;
  border: 1px solid #eecbff;
  margin-left: 5px;
}
#gd-tbl-d88d82c4 .gd-tbl-badge-rows-value {
  background-color: transparent;
  color: #333333;
  border: 1px solid #eecbff;
  margin-left: -4px;
  margin-right: 3px;
}
#gd-tbl-d88d82c4 .gd-tbl-badge-cols-label {
  background-color: #BDE7B4;
  color: #333333;
  border: 1px solid #BDE7B4;
}
#gd-tbl-d88d82c4 .gd-tbl-badge-cols-value {
  background-color: transparent;
  color: #333333;
  border: 1px solid #BDE7B4;
  margin-left: -4px;
}
/* Dark mode */
body.quarto-dark #gd-tbl-d88d82c4 .gt_table,
html.quarto-dark #gd-tbl-d88d82c4 .gt_table,
:root[data-bs-theme="dark"] #gd-tbl-d88d82c4 .gt_table {
  background-color: #1a1a2e;
  color: #e0e0e0;
  border-top-color: #555;
  border-bottom-color: #555;
}
body.quarto-dark #gd-tbl-d88d82c4 .gt_heading,
html.quarto-dark #gd-tbl-d88d82c4 .gt_heading,
:root[data-bs-theme="dark"] #gd-tbl-d88d82c4 .gt_heading {
  background-color: #1a1a2e;
  border-bottom-color: #1a1a2e;
}
body.quarto-dark #gd-tbl-d88d82c4 .gt_title,
html.quarto-dark #gd-tbl-d88d82c4 .gt_title,
:root[data-bs-theme="dark"] #gd-tbl-d88d82c4 .gt_title {
  color: #e0e0e0;
}
body.quarto-dark #gd-tbl-d88d82c4 .gt_subtitle,
html.quarto-dark #gd-tbl-d88d82c4 .gt_subtitle,
:root[data-bs-theme="dark"] #gd-tbl-d88d82c4 .gt_subtitle {
  color: #b0b0b0;
}
body.quarto-dark #gd-tbl-d88d82c4 .gt_col_headings,
html.quarto-dark #gd-tbl-d88d82c4 .gt_col_headings,
:root[data-bs-theme="dark"] #gd-tbl-d88d82c4 .gt_col_headings {
  border-top-color: #444;
  border-bottom-color: #444;
}
body.quarto-dark #gd-tbl-d88d82c4 .gt_col_heading,
html.quarto-dark #gd-tbl-d88d82c4 .gt_col_heading,
:root[data-bs-theme="dark"] #gd-tbl-d88d82c4 .gt_col_heading {
  color: #b0b0b0;
  background-color: #1a1a2e;
  border-left-color: #333;
  border-right-color: #333;
}
body.quarto-dark #gd-tbl-d88d82c4 .gt_table_body,
html.quarto-dark #gd-tbl-d88d82c4 .gt_table_body,
:root[data-bs-theme="dark"] #gd-tbl-d88d82c4 .gt_table_body {
  border-top-color: #444;
}
body.quarto-dark #gd-tbl-d88d82c4 .gt_table_body .gt_row,
html.quarto-dark #gd-tbl-d88d82c4 .gt_table_body .gt_row,
:root[data-bs-theme="dark"] #gd-tbl-d88d82c4 .gt_table_body .gt_row {
  color: #d0d0d0;
  border-top-color: #4b4b4b;
  border-bottom-color: #4b4b4b;
  border-left-color: #333;
  border-right-color: #333;
}
body.quarto-dark #gd-tbl-d88d82c4 .gd-tbl-rownum,
html.quarto-dark #gd-tbl-d88d82c4 .gd-tbl-rownum,
:root[data-bs-theme="dark"] #gd-tbl-d88d82c4 .gd-tbl-rownum {
  color: #888;
  border-right-color: rgba(102, 153, 204, 0.4) !important;
}
body.quarto-dark #gd-tbl-d88d82c4 .gd-tbl-missing,
html.quarto-dark #gd-tbl-d88d82c4 .gd-tbl-missing,
:root[data-bs-theme="dark"] #gd-tbl-d88d82c4 .gd-tbl-missing {
  color: #ff6b6b !important;
  background-color: rgba(60, 17, 24, 0.2);
}
body.quarto-dark #gd-tbl-d88d82c4 .gd-tbl-dtype,
html.quarto-dark #gd-tbl-d88d82c4 .gd-tbl-dtype,
:root[data-bs-theme="dark"] #gd-tbl-d88d82c4 .gd-tbl-dtype {
  color: #888;
}
body.quarto-dark #gd-tbl-d88d82c4 .gt_bottom_border,
html.quarto-dark #gd-tbl-d88d82c4 .gt_bottom_border,
:root[data-bs-theme="dark"] #gd-tbl-d88d82c4 .gt_bottom_border {
  border-bottom-color: #555;
}
body.quarto-dark #gd-tbl-d88d82c4 .gd-tbl-badge-rows-label,
html.quarto-dark #gd-tbl-d88d82c4 .gd-tbl-badge-rows-label,
:root[data-bs-theme="dark"] #gd-tbl-d88d82c4 .gd-tbl-badge-rows-label {
  background-color: #3d2a4d;
  border-color: #3d2a4d;
  color: #e0c0ff;
}
body.quarto-dark #gd-tbl-d88d82c4 .gd-tbl-badge-rows-value,
html.quarto-dark #gd-tbl-d88d82c4 .gd-tbl-badge-rows-value,
:root[data-bs-theme="dark"] #gd-tbl-d88d82c4 .gd-tbl-badge-rows-value {
  border-color: #3d2a4d;
  color: #d0b0e0;
}
body.quarto-dark #gd-tbl-d88d82c4 .gd-tbl-badge-cols-label,
html.quarto-dark #gd-tbl-d88d82c4 .gd-tbl-badge-cols-label,
:root[data-bs-theme="dark"] #gd-tbl-d88d82c4 .gd-tbl-badge-cols-label {
  background-color: #2a4d2a;
  border-color: #2a4d2a;
  color: #b0e0b0;
}
body.quarto-dark #gd-tbl-d88d82c4 .gd-tbl-badge-cols-value,
html.quarto-dark #gd-tbl-d88d82c4 .gd-tbl-badge-cols-value,
:root[data-bs-theme="dark"] #gd-tbl-d88d82c4 .gd-tbl-badge-cols-value {
  border-color: #2a4d2a;
  color: #a0d0a0;
}
</style>

<table class="gt_table" data-quarto-disable-processing="true" data-quarto-bootstrap="false">
<thead>
<tr class="gt_heading">
<th colspan="6" class="gt_heading gt_title gt_font_normal"><div style="padding-top: 0; padding-bottom: 7px;">
<span class="gd-tbl-badge" style="background-color: #0075FF; color: #FFFFFF; border: 1px solid #0075FF; margin-right: 8px;">Polars</span>Rows1,945Columns5
</div></th>
</tr>
<tr class="gt_col_headings">
<th class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"></th>
<th id="id" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

id

<em>i64</em>

</div></th>
<th id="day" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

day

<em>i64</em>

</div></th>
<th id="bili" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

bili

<em>f64</em>

</div></th>
<th id="albumin" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

albumin

<em>f64</em>

</div></th>
<th id="protime" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

protime

<em>f64</em>

</div></th>
</tr>
</thead>
<tbody class="gt_table_body">
<tr>
<td class="gt_row gt_right gd-tbl-rownum">0</td>
<td class="gt_row gt_right" style="max-width: 83px">1</td>
<td class="gt_row gt_right" style="max-width: 83px">0</td>
<td class="gt_row gt_right" style="max-width: 83px">14.5</td>
<td class="gt_row gt_right" style="max-width: 104px">2.6</td>
<td class="gt_row gt_right" style="max-width: 104px">12.2</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">1</td>
<td class="gt_row gt_right" style="max-width: 83px">1</td>
<td class="gt_row gt_right" style="max-width: 83px">192</td>
<td class="gt_row gt_right" style="max-width: 83px">21.3</td>
<td class="gt_row gt_right" style="max-width: 104px">2.94</td>
<td class="gt_row gt_right" style="max-width: 104px">11.2</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">2</td>
<td class="gt_row gt_right" style="max-width: 83px">2</td>
<td class="gt_row gt_right" style="max-width: 83px">0</td>
<td class="gt_row gt_right" style="max-width: 83px">1.1</td>
<td class="gt_row gt_right" style="max-width: 104px">4.14</td>
<td class="gt_row gt_right" style="max-width: 104px">10.6</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">3</td>
<td class="gt_row gt_right" style="max-width: 83px">2</td>
<td class="gt_row gt_right" style="max-width: 83px">182</td>
<td class="gt_row gt_right" style="max-width: 83px">0.8</td>
<td class="gt_row gt_right" style="max-width: 104px">3.6</td>
<td class="gt_row gt_right" style="max-width: 104px">11</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">4</td>
<td class="gt_row gt_right" style="max-width: 83px">2</td>
<td class="gt_row gt_right" style="max-width: 83px">365</td>
<td class="gt_row gt_right" style="max-width: 83px">1</td>
<td class="gt_row gt_right" style="max-width: 104px">3.55</td>
<td class="gt_row gt_right" style="max-width: 104px">11.6</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">5</td>
<td class="gt_row gt_right" style="max-width: 83px">2</td>
<td class="gt_row gt_right" style="max-width: 83px">768</td>
<td class="gt_row gt_right" style="max-width: 83px">1.9</td>
<td class="gt_row gt_right" style="max-width: 104px">3.92</td>
<td class="gt_row gt_right" style="max-width: 104px">10.6</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">6</td>
<td class="gt_row gt_right" style="max-width: 83px">2</td>
<td class="gt_row gt_right" style="max-width: 83px">1790</td>
<td class="gt_row gt_right" style="max-width: 83px">2.6</td>
<td class="gt_row gt_right" style="max-width: 104px">3.32</td>
<td class="gt_row gt_right" style="max-width: 104px">11.3</td>
</tr>
<tr class="gd-tbl-divider">
<td class="gt_row gt_right gd-tbl-rownum">7</td>
<td class="gt_row gt_right" style="max-width: 83px">2</td>
<td class="gt_row gt_right" style="max-width: 83px">2151</td>
<td class="gt_row gt_right" style="max-width: 83px">3.6</td>
<td class="gt_row gt_right" style="max-width: 104px">2.92</td>
<td class="gt_row gt_right" style="max-width: 104px">11.5</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">1942</td>
<td class="gt_row gt_right" style="max-width: 83px">312</td>
<td class="gt_row gt_right" style="max-width: 83px">390</td>
<td class="gt_row gt_right" style="max-width: 83px">7.4</td>
<td class="gt_row gt_right" style="max-width: 104px">3.56</td>
<td class="gt_row gt_right" style="max-width: 104px">11.7</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">1943</td>
<td class="gt_row gt_right" style="max-width: 83px">312</td>
<td class="gt_row gt_right" style="max-width: 83px">775</td>
<td class="gt_row gt_right" style="max-width: 83px">16.3</td>
<td class="gt_row gt_right" style="max-width: 104px">3.34</td>
<td class="gt_row gt_right" style="max-width: 104px">13</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">1944</td>
<td class="gt_row gt_right" style="max-width: 83px">312</td>
<td class="gt_row gt_right" style="max-width: 83px">1075</td>
<td class="gt_row gt_right" style="max-width: 83px">23.4</td>
<td class="gt_row gt_right" style="max-width: 104px">3.42</td>
<td class="gt_row gt_right" style="max-width: 104px">13.4</td>
</tr>
</tbody>
</table>


Each subject appears once per visit. `day` is the time of that visit (in days from enrollment), and the other columns hold the lab values measured that day. `futime` and `status` record the final outcome and are the same for every row belonging to the same subject.


# Building the counting-process dataset

[split_episodes()](../reference/split_episodes.md#greenwood.split_episodes) takes the per-subject baseline table and the repeated-measurements table and merges them into the counting-process long format. The `id` column links the two. `visit_time` names the column in `visits` that carries measurement times.


``` python
import pandas as pd

# Build a per-subject baseline: one row per subject with follow-up time and outcome.
# pbcseq repeats futime/status for every visit, so drop_duplicates gives one row per id.
pbcseq_pd = gw.load_dataset("pbcseq", backend="pandas")
base = (
    pbcseq_pd.drop_duplicates("id")[["id", "futime", "status"]]
             .rename(columns={"futime": "time"})
)

# Split into counting-process intervals, carrying bilirubin, albumin, and protime forward.
long = gw.split_episodes(
    base,
    pbcseq_pd[["id", "day", "bili", "albumin", "protime"]],
    id="id",
    time="time",
    event="status",
    visit_time="day",
    format="pandas",
)

long
```


<style>
@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,400;0,600;1,400&family=IBM+Plex+Sans:wght@400;600&display=swap');
#gd-tbl-aeb11ed0 .gt_table {
  display: table;
  border-collapse: collapse;
  table-layout: fixed;
  line-height: normal;
  margin-left: auto;
  margin-right: auto;
  color: #333333;
  font-size: 14px;
  font-weight: normal;
  font-style: normal;
  background-color: #FFFFFF;
  width: auto;
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #A8A8A8;
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #A8A8A8;
}
#gd-tbl-aeb11ed0 .gt_heading {
  background-color: #FFFFFF;
  text-align: left;
  border-bottom-color: #FFFFFF;
  border-left-style: none;
  border-right-style: none;
}
#gd-tbl-aeb11ed0 .gt_title {
  color: #333333;
  font-size: 125%;
  font-weight: initial;
  padding-top: 4px;
  padding-bottom: 4px;
  padding-left: 5px;
  padding-right: 5px;
  border-bottom-color: #FFFFFF;
  border-bottom-width: 0;
}
#gd-tbl-aeb11ed0 .gt_subtitle {
  color: #333333;
  font-size: 85%;
  font-weight: initial;
  padding-top: 3px;
  padding-bottom: 5px;
  padding-left: 5px;
  padding-right: 5px;
  border-top-color: #FFFFFF;
  border-top-width: 0;
}
#gd-tbl-aeb11ed0 .gt_bottom_border {
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #D3D3D3;
}
#gd-tbl-aeb11ed0 .gt_col_headings {
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #D3D3D3;
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #D3D3D3;
  border-left-style: none;
  border-right-style: none;
}
#gd-tbl-aeb11ed0 .gt_col_heading {
  color: #333333;
  background-color: #FFFFFF;
  font-size: 100%;
  font-weight: normal;
  text-transform: inherit;
  border-left-style: solid;
  border-left-width: 1px;
  border-left-color: #F2F2F2;
  border-right-style: solid;
  border-right-width: 1px;
  border-right-color: #F2F2F2;
  vertical-align: bottom;
  padding-top: 5px;
  padding-bottom: 5px;
  padding-left: 5px;
  padding-right: 5px;
  overflow-x: hidden;
}
#gd-tbl-aeb11ed0 .gt_table_body {
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #D3D3D3;
}
#gd-tbl-aeb11ed0 .gt_row {
  padding-top: 4px;
  padding-bottom: 4px;
  padding-left: 5px;
  padding-right: 5px;
  margin: 10px;
  border-top-style: solid;
  border-top-width: 1px;
  border-top-color: #E9E9E9;
  border-left-style: solid;
  border-left-width: 1px;
  border-left-color: #E9E9E9;
  border-right-style: solid;
  border-right-width: 1px;
  border-right-color: #E9E9E9;
  vertical-align: middle;
  overflow-x: hidden;
}
#gd-tbl-aeb11ed0 .gt_left { text-align: left; }
#gd-tbl-aeb11ed0 .gt_center { text-align: center; }
#gd-tbl-aeb11ed0 .gt_right { text-align: right; font-variant-numeric: tabular-nums; }
#gd-tbl-aeb11ed0 .gt_font_normal { font-weight: normal; }
#gd-tbl-aeb11ed0 .gt_font_bold { font-weight: bold; }
#gd-tbl-aeb11ed0 .gt_font_italic { font-style: italic; }
#gd-tbl-aeb11ed0 .gt_striped { background-color: rgba(128,128,128,0.05); }
#gd-tbl-aeb11ed0 .gt_from_md > :first-child { margin-top: 0; }
#gd-tbl-aeb11ed0 .gt_from_md > :last-child { margin-bottom: 0; }
/* Data cell font */
#gd-tbl-aeb11ed0 .gt_table_body .gt_row {
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 12px;
  color: #333333;
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  height: 14px;
}
/* Column label font */
#gd-tbl-aeb11ed0 .gt_col_heading {
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 12px;
  color: #333333;
}
/* Row number styling */
#gd-tbl-aeb11ed0 .gd-tbl-rownum {
  color: gray;
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 10px;
  border-right: 2px solid rgba(102, 153, 204, 0.5) !important;
  text-align: right;
  padding-right: 6px;
  white-space: nowrap;
}
/* Head/tail divider */
#gd-tbl-aeb11ed0 tr.gd-tbl-divider td,
#gd-tbl-aeb11ed0 tr.gd-tbl-divider th {
  border-bottom: 2px solid rgba(102, 153, 204, 0.5);
}
/* Missing values */
#gd-tbl-aeb11ed0 .gd-tbl-missing {
  color: #B22222 !important;
  background-color: rgba(255, 193, 193, 0.35);
}
/* Column label sub-elements */
#gd-tbl-aeb11ed0 .gd-tbl-colname {
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  padding-bottom: 0;
  margin-bottom: 0;
}
#gd-tbl-aeb11ed0 .gd-tbl-dtype {
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  padding-top: 0;
  margin-top: 0;
  color: #666666;
}
/* Header badge styling */
#gd-tbl-aeb11ed0 .gd-tbl-badge {
  display: inline-block;
  padding: 2px 10px;
  font-family: 'IBM Plex Sans', -apple-system, BlinkMacSystemFont, sans-serif;
  font-size: 10px;
  font-weight: bold;
  text-transform: uppercase;
  position: inherit;
}
#gd-tbl-aeb11ed0 .gd-tbl-badge-rows-label {
  background-color: #eecbff;
  color: #333333;
  border: 1px solid #eecbff;
  margin-left: 5px;
}
#gd-tbl-aeb11ed0 .gd-tbl-badge-rows-value {
  background-color: transparent;
  color: #333333;
  border: 1px solid #eecbff;
  margin-left: -4px;
  margin-right: 3px;
}
#gd-tbl-aeb11ed0 .gd-tbl-badge-cols-label {
  background-color: #BDE7B4;
  color: #333333;
  border: 1px solid #BDE7B4;
}
#gd-tbl-aeb11ed0 .gd-tbl-badge-cols-value {
  background-color: transparent;
  color: #333333;
  border: 1px solid #BDE7B4;
  margin-left: -4px;
}
/* Dark mode */
body.quarto-dark #gd-tbl-aeb11ed0 .gt_table,
html.quarto-dark #gd-tbl-aeb11ed0 .gt_table,
:root[data-bs-theme="dark"] #gd-tbl-aeb11ed0 .gt_table {
  background-color: #1a1a2e;
  color: #e0e0e0;
  border-top-color: #555;
  border-bottom-color: #555;
}
body.quarto-dark #gd-tbl-aeb11ed0 .gt_heading,
html.quarto-dark #gd-tbl-aeb11ed0 .gt_heading,
:root[data-bs-theme="dark"] #gd-tbl-aeb11ed0 .gt_heading {
  background-color: #1a1a2e;
  border-bottom-color: #1a1a2e;
}
body.quarto-dark #gd-tbl-aeb11ed0 .gt_title,
html.quarto-dark #gd-tbl-aeb11ed0 .gt_title,
:root[data-bs-theme="dark"] #gd-tbl-aeb11ed0 .gt_title {
  color: #e0e0e0;
}
body.quarto-dark #gd-tbl-aeb11ed0 .gt_subtitle,
html.quarto-dark #gd-tbl-aeb11ed0 .gt_subtitle,
:root[data-bs-theme="dark"] #gd-tbl-aeb11ed0 .gt_subtitle {
  color: #b0b0b0;
}
body.quarto-dark #gd-tbl-aeb11ed0 .gt_col_headings,
html.quarto-dark #gd-tbl-aeb11ed0 .gt_col_headings,
:root[data-bs-theme="dark"] #gd-tbl-aeb11ed0 .gt_col_headings {
  border-top-color: #444;
  border-bottom-color: #444;
}
body.quarto-dark #gd-tbl-aeb11ed0 .gt_col_heading,
html.quarto-dark #gd-tbl-aeb11ed0 .gt_col_heading,
:root[data-bs-theme="dark"] #gd-tbl-aeb11ed0 .gt_col_heading {
  color: #b0b0b0;
  background-color: #1a1a2e;
  border-left-color: #333;
  border-right-color: #333;
}
body.quarto-dark #gd-tbl-aeb11ed0 .gt_table_body,
html.quarto-dark #gd-tbl-aeb11ed0 .gt_table_body,
:root[data-bs-theme="dark"] #gd-tbl-aeb11ed0 .gt_table_body {
  border-top-color: #444;
}
body.quarto-dark #gd-tbl-aeb11ed0 .gt_table_body .gt_row,
html.quarto-dark #gd-tbl-aeb11ed0 .gt_table_body .gt_row,
:root[data-bs-theme="dark"] #gd-tbl-aeb11ed0 .gt_table_body .gt_row {
  color: #d0d0d0;
  border-top-color: #4b4b4b;
  border-bottom-color: #4b4b4b;
  border-left-color: #333;
  border-right-color: #333;
}
body.quarto-dark #gd-tbl-aeb11ed0 .gd-tbl-rownum,
html.quarto-dark #gd-tbl-aeb11ed0 .gd-tbl-rownum,
:root[data-bs-theme="dark"] #gd-tbl-aeb11ed0 .gd-tbl-rownum {
  color: #888;
  border-right-color: rgba(102, 153, 204, 0.4) !important;
}
body.quarto-dark #gd-tbl-aeb11ed0 .gd-tbl-missing,
html.quarto-dark #gd-tbl-aeb11ed0 .gd-tbl-missing,
:root[data-bs-theme="dark"] #gd-tbl-aeb11ed0 .gd-tbl-missing {
  color: #ff6b6b !important;
  background-color: rgba(60, 17, 24, 0.2);
}
body.quarto-dark #gd-tbl-aeb11ed0 .gd-tbl-dtype,
html.quarto-dark #gd-tbl-aeb11ed0 .gd-tbl-dtype,
:root[data-bs-theme="dark"] #gd-tbl-aeb11ed0 .gd-tbl-dtype {
  color: #888;
}
body.quarto-dark #gd-tbl-aeb11ed0 .gt_bottom_border,
html.quarto-dark #gd-tbl-aeb11ed0 .gt_bottom_border,
:root[data-bs-theme="dark"] #gd-tbl-aeb11ed0 .gt_bottom_border {
  border-bottom-color: #555;
}
body.quarto-dark #gd-tbl-aeb11ed0 .gd-tbl-badge-rows-label,
html.quarto-dark #gd-tbl-aeb11ed0 .gd-tbl-badge-rows-label,
:root[data-bs-theme="dark"] #gd-tbl-aeb11ed0 .gd-tbl-badge-rows-label {
  background-color: #3d2a4d;
  border-color: #3d2a4d;
  color: #e0c0ff;
}
body.quarto-dark #gd-tbl-aeb11ed0 .gd-tbl-badge-rows-value,
html.quarto-dark #gd-tbl-aeb11ed0 .gd-tbl-badge-rows-value,
:root[data-bs-theme="dark"] #gd-tbl-aeb11ed0 .gd-tbl-badge-rows-value {
  border-color: #3d2a4d;
  color: #d0b0e0;
}
body.quarto-dark #gd-tbl-aeb11ed0 .gd-tbl-badge-cols-label,
html.quarto-dark #gd-tbl-aeb11ed0 .gd-tbl-badge-cols-label,
:root[data-bs-theme="dark"] #gd-tbl-aeb11ed0 .gd-tbl-badge-cols-label {
  background-color: #2a4d2a;
  border-color: #2a4d2a;
  color: #b0e0b0;
}
body.quarto-dark #gd-tbl-aeb11ed0 .gd-tbl-badge-cols-value,
html.quarto-dark #gd-tbl-aeb11ed0 .gd-tbl-badge-cols-value,
:root[data-bs-theme="dark"] #gd-tbl-aeb11ed0 .gd-tbl-badge-cols-value {
  border-color: #2a4d2a;
  color: #a0d0a0;
}
</style>

<table class="gt_table" data-quarto-disable-processing="true" data-quarto-bootstrap="false">
<thead>
<tr class="gt_heading">
<th colspan="8" class="gt_heading gt_title gt_font_normal"><div style="padding-top: 0; padding-bottom: 7px;">
<span class="gd-tbl-badge" style="background-color: #150458; color: #FFFFFF; border: 1px solid #150458; margin-right: 8px;">Pandas</span>Rows1,945Columns7
</div></th>
</tr>
<tr class="gt_col_headings">
<th class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"></th>
<th id="id" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

id

<em>i64</em>

</div></th>
<th id="tstart" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

tstart

<em>f64</em>

</div></th>
<th id="tstop" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

tstop

<em>f64</em>

</div></th>
<th id="status" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

status

<em>i64</em>

</div></th>
<th id="bili" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

bili

<em>f64</em>

</div></th>
<th id="albumin" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

albumin

<em>f64</em>

</div></th>
<th id="protime" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

protime

<em>f64</em>

</div></th>
</tr>
</thead>
<tbody class="gt_table_body">
<tr>
<td class="gt_row gt_right gd-tbl-rownum">0</td>
<td class="gt_row gt_right" style="max-width: 55px">1</td>
<td class="gt_row gt_right" style="max-width: 68px">0</td>
<td class="gt_row gt_right" style="max-width: 60px">192</td>
<td class="gt_row gt_right" style="max-width: 68px">0</td>
<td class="gt_row gt_right" style="max-width: 55px">14.5</td>
<td class="gt_row gt_right" style="max-width: 76px">2.6</td>
<td class="gt_row gt_right" style="max-width: 76px">12.2</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">1</td>
<td class="gt_row gt_right" style="max-width: 55px">1</td>
<td class="gt_row gt_right" style="max-width: 68px">192</td>
<td class="gt_row gt_right" style="max-width: 60px">400</td>
<td class="gt_row gt_right" style="max-width: 68px">2</td>
<td class="gt_row gt_right" style="max-width: 55px">21.3</td>
<td class="gt_row gt_right" style="max-width: 76px">2.94</td>
<td class="gt_row gt_right" style="max-width: 76px">11.2</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">2</td>
<td class="gt_row gt_right" style="max-width: 55px">2</td>
<td class="gt_row gt_right" style="max-width: 68px">0</td>
<td class="gt_row gt_right" style="max-width: 60px">182</td>
<td class="gt_row gt_right" style="max-width: 68px">0</td>
<td class="gt_row gt_right" style="max-width: 55px">1.1</td>
<td class="gt_row gt_right" style="max-width: 76px">4.14</td>
<td class="gt_row gt_right" style="max-width: 76px">10.6</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">3</td>
<td class="gt_row gt_right" style="max-width: 55px">2</td>
<td class="gt_row gt_right" style="max-width: 68px">182</td>
<td class="gt_row gt_right" style="max-width: 60px">365</td>
<td class="gt_row gt_right" style="max-width: 68px">0</td>
<td class="gt_row gt_right" style="max-width: 55px">0.8</td>
<td class="gt_row gt_right" style="max-width: 76px">3.6</td>
<td class="gt_row gt_right" style="max-width: 76px">11</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">4</td>
<td class="gt_row gt_right" style="max-width: 55px">2</td>
<td class="gt_row gt_right" style="max-width: 68px">365</td>
<td class="gt_row gt_right" style="max-width: 60px">768</td>
<td class="gt_row gt_right" style="max-width: 68px">0</td>
<td class="gt_row gt_right" style="max-width: 55px">1</td>
<td class="gt_row gt_right" style="max-width: 76px">3.55</td>
<td class="gt_row gt_right" style="max-width: 76px">11.6</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">5</td>
<td class="gt_row gt_right" style="max-width: 55px">2</td>
<td class="gt_row gt_right" style="max-width: 68px">768</td>
<td class="gt_row gt_right" style="max-width: 60px">1790</td>
<td class="gt_row gt_right" style="max-width: 68px">0</td>
<td class="gt_row gt_right" style="max-width: 55px">1.9</td>
<td class="gt_row gt_right" style="max-width: 76px">3.92</td>
<td class="gt_row gt_right" style="max-width: 76px">10.6</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">6</td>
<td class="gt_row gt_right" style="max-width: 55px">2</td>
<td class="gt_row gt_right" style="max-width: 68px">1790</td>
<td class="gt_row gt_right" style="max-width: 60px">2151</td>
<td class="gt_row gt_right" style="max-width: 68px">0</td>
<td class="gt_row gt_right" style="max-width: 55px">2.6</td>
<td class="gt_row gt_right" style="max-width: 76px">3.32</td>
<td class="gt_row gt_right" style="max-width: 76px">11.3</td>
</tr>
<tr class="gd-tbl-divider">
<td class="gt_row gt_right gd-tbl-rownum">7</td>
<td class="gt_row gt_right" style="max-width: 55px">2</td>
<td class="gt_row gt_right" style="max-width: 68px">2151</td>
<td class="gt_row gt_right" style="max-width: 60px">2515</td>
<td class="gt_row gt_right" style="max-width: 68px">0</td>
<td class="gt_row gt_right" style="max-width: 55px">3.6</td>
<td class="gt_row gt_right" style="max-width: 76px">2.92</td>
<td class="gt_row gt_right" style="max-width: 76px">11.5</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">1942</td>
<td class="gt_row gt_right" style="max-width: 55px">312</td>
<td class="gt_row gt_right" style="max-width: 68px">390</td>
<td class="gt_row gt_right" style="max-width: 60px">775</td>
<td class="gt_row gt_right" style="max-width: 68px">0</td>
<td class="gt_row gt_right" style="max-width: 55px">7.4</td>
<td class="gt_row gt_right" style="max-width: 76px">3.56</td>
<td class="gt_row gt_right" style="max-width: 76px">11.7</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">1943</td>
<td class="gt_row gt_right" style="max-width: 55px">312</td>
<td class="gt_row gt_right" style="max-width: 68px">775</td>
<td class="gt_row gt_right" style="max-width: 60px">1075</td>
<td class="gt_row gt_right" style="max-width: 68px">0</td>
<td class="gt_row gt_right" style="max-width: 55px">16.3</td>
<td class="gt_row gt_right" style="max-width: 76px">3.34</td>
<td class="gt_row gt_right" style="max-width: 76px">13</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">1944</td>
<td class="gt_row gt_right" style="max-width: 55px">312</td>
<td class="gt_row gt_right" style="max-width: 68px">1075</td>
<td class="gt_row gt_right" style="max-width: 60px">1457</td>
<td class="gt_row gt_right" style="max-width: 68px">0</td>
<td class="gt_row gt_right" style="max-width: 55px">23.4</td>
<td class="gt_row gt_right" style="max-width: 76px">3.42</td>
<td class="gt_row gt_right" style="max-width: 76px">13.4</td>
</tr>
</tbody>
</table>


Each row is now one interval for one subject. Subject 1, for example, contributes two rows: the first covers days 0-192 (bilirubin 14.5), and the second covers days 192-400 (bilirubin 21.3). The event column is 0 for the first row and carries the original status code (2 = death) for the last.


``` python
# Subject 1's intervals
long[long["id"] == 1][["id", "tstart", "tstop", "status", "bili", "albumin", "protime"]]
```


<style>
@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,400;0,600;1,400&family=IBM+Plex+Sans:wght@400;600&display=swap');
#gd-tbl-a9f147ec .gt_table {
  display: table;
  border-collapse: collapse;
  table-layout: fixed;
  line-height: normal;
  margin-left: auto;
  margin-right: auto;
  color: #333333;
  font-size: 14px;
  font-weight: normal;
  font-style: normal;
  background-color: #FFFFFF;
  width: auto;
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #A8A8A8;
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #A8A8A8;
}
#gd-tbl-a9f147ec .gt_heading {
  background-color: #FFFFFF;
  text-align: left;
  border-bottom-color: #FFFFFF;
  border-left-style: none;
  border-right-style: none;
}
#gd-tbl-a9f147ec .gt_title {
  color: #333333;
  font-size: 125%;
  font-weight: initial;
  padding-top: 4px;
  padding-bottom: 4px;
  padding-left: 5px;
  padding-right: 5px;
  border-bottom-color: #FFFFFF;
  border-bottom-width: 0;
}
#gd-tbl-a9f147ec .gt_subtitle {
  color: #333333;
  font-size: 85%;
  font-weight: initial;
  padding-top: 3px;
  padding-bottom: 5px;
  padding-left: 5px;
  padding-right: 5px;
  border-top-color: #FFFFFF;
  border-top-width: 0;
}
#gd-tbl-a9f147ec .gt_bottom_border {
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #D3D3D3;
}
#gd-tbl-a9f147ec .gt_col_headings {
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #D3D3D3;
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #D3D3D3;
  border-left-style: none;
  border-right-style: none;
}
#gd-tbl-a9f147ec .gt_col_heading {
  color: #333333;
  background-color: #FFFFFF;
  font-size: 100%;
  font-weight: normal;
  text-transform: inherit;
  border-left-style: solid;
  border-left-width: 1px;
  border-left-color: #F2F2F2;
  border-right-style: solid;
  border-right-width: 1px;
  border-right-color: #F2F2F2;
  vertical-align: bottom;
  padding-top: 5px;
  padding-bottom: 5px;
  padding-left: 5px;
  padding-right: 5px;
  overflow-x: hidden;
}
#gd-tbl-a9f147ec .gt_table_body {
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #D3D3D3;
}
#gd-tbl-a9f147ec .gt_row {
  padding-top: 4px;
  padding-bottom: 4px;
  padding-left: 5px;
  padding-right: 5px;
  margin: 10px;
  border-top-style: solid;
  border-top-width: 1px;
  border-top-color: #E9E9E9;
  border-left-style: solid;
  border-left-width: 1px;
  border-left-color: #E9E9E9;
  border-right-style: solid;
  border-right-width: 1px;
  border-right-color: #E9E9E9;
  vertical-align: middle;
  overflow-x: hidden;
}
#gd-tbl-a9f147ec .gt_left { text-align: left; }
#gd-tbl-a9f147ec .gt_center { text-align: center; }
#gd-tbl-a9f147ec .gt_right { text-align: right; font-variant-numeric: tabular-nums; }
#gd-tbl-a9f147ec .gt_font_normal { font-weight: normal; }
#gd-tbl-a9f147ec .gt_font_bold { font-weight: bold; }
#gd-tbl-a9f147ec .gt_font_italic { font-style: italic; }
#gd-tbl-a9f147ec .gt_striped { background-color: rgba(128,128,128,0.05); }
#gd-tbl-a9f147ec .gt_from_md > :first-child { margin-top: 0; }
#gd-tbl-a9f147ec .gt_from_md > :last-child { margin-bottom: 0; }
/* Data cell font */
#gd-tbl-a9f147ec .gt_table_body .gt_row {
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 12px;
  color: #333333;
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  height: 14px;
}
/* Column label font */
#gd-tbl-a9f147ec .gt_col_heading {
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 12px;
  color: #333333;
}
/* Row number styling */
#gd-tbl-a9f147ec .gd-tbl-rownum {
  color: gray;
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 10px;
  border-right: 2px solid rgba(102, 153, 204, 0.5) !important;
  text-align: right;
  padding-right: 6px;
  white-space: nowrap;
}
/* Head/tail divider */
#gd-tbl-a9f147ec tr.gd-tbl-divider td,
#gd-tbl-a9f147ec tr.gd-tbl-divider th {
  border-bottom: 2px solid rgba(102, 153, 204, 0.5);
}
/* Missing values */
#gd-tbl-a9f147ec .gd-tbl-missing {
  color: #B22222 !important;
  background-color: rgba(255, 193, 193, 0.35);
}
/* Column label sub-elements */
#gd-tbl-a9f147ec .gd-tbl-colname {
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  padding-bottom: 0;
  margin-bottom: 0;
}
#gd-tbl-a9f147ec .gd-tbl-dtype {
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  padding-top: 0;
  margin-top: 0;
  color: #666666;
}
/* Header badge styling */
#gd-tbl-a9f147ec .gd-tbl-badge {
  display: inline-block;
  padding: 2px 10px;
  font-family: 'IBM Plex Sans', -apple-system, BlinkMacSystemFont, sans-serif;
  font-size: 10px;
  font-weight: bold;
  text-transform: uppercase;
  position: inherit;
}
#gd-tbl-a9f147ec .gd-tbl-badge-rows-label {
  background-color: #eecbff;
  color: #333333;
  border: 1px solid #eecbff;
  margin-left: 5px;
}
#gd-tbl-a9f147ec .gd-tbl-badge-rows-value {
  background-color: transparent;
  color: #333333;
  border: 1px solid #eecbff;
  margin-left: -4px;
  margin-right: 3px;
}
#gd-tbl-a9f147ec .gd-tbl-badge-cols-label {
  background-color: #BDE7B4;
  color: #333333;
  border: 1px solid #BDE7B4;
}
#gd-tbl-a9f147ec .gd-tbl-badge-cols-value {
  background-color: transparent;
  color: #333333;
  border: 1px solid #BDE7B4;
  margin-left: -4px;
}
/* Dark mode */
body.quarto-dark #gd-tbl-a9f147ec .gt_table,
html.quarto-dark #gd-tbl-a9f147ec .gt_table,
:root[data-bs-theme="dark"] #gd-tbl-a9f147ec .gt_table {
  background-color: #1a1a2e;
  color: #e0e0e0;
  border-top-color: #555;
  border-bottom-color: #555;
}
body.quarto-dark #gd-tbl-a9f147ec .gt_heading,
html.quarto-dark #gd-tbl-a9f147ec .gt_heading,
:root[data-bs-theme="dark"] #gd-tbl-a9f147ec .gt_heading {
  background-color: #1a1a2e;
  border-bottom-color: #1a1a2e;
}
body.quarto-dark #gd-tbl-a9f147ec .gt_title,
html.quarto-dark #gd-tbl-a9f147ec .gt_title,
:root[data-bs-theme="dark"] #gd-tbl-a9f147ec .gt_title {
  color: #e0e0e0;
}
body.quarto-dark #gd-tbl-a9f147ec .gt_subtitle,
html.quarto-dark #gd-tbl-a9f147ec .gt_subtitle,
:root[data-bs-theme="dark"] #gd-tbl-a9f147ec .gt_subtitle {
  color: #b0b0b0;
}
body.quarto-dark #gd-tbl-a9f147ec .gt_col_headings,
html.quarto-dark #gd-tbl-a9f147ec .gt_col_headings,
:root[data-bs-theme="dark"] #gd-tbl-a9f147ec .gt_col_headings {
  border-top-color: #444;
  border-bottom-color: #444;
}
body.quarto-dark #gd-tbl-a9f147ec .gt_col_heading,
html.quarto-dark #gd-tbl-a9f147ec .gt_col_heading,
:root[data-bs-theme="dark"] #gd-tbl-a9f147ec .gt_col_heading {
  color: #b0b0b0;
  background-color: #1a1a2e;
  border-left-color: #333;
  border-right-color: #333;
}
body.quarto-dark #gd-tbl-a9f147ec .gt_table_body,
html.quarto-dark #gd-tbl-a9f147ec .gt_table_body,
:root[data-bs-theme="dark"] #gd-tbl-a9f147ec .gt_table_body {
  border-top-color: #444;
}
body.quarto-dark #gd-tbl-a9f147ec .gt_table_body .gt_row,
html.quarto-dark #gd-tbl-a9f147ec .gt_table_body .gt_row,
:root[data-bs-theme="dark"] #gd-tbl-a9f147ec .gt_table_body .gt_row {
  color: #d0d0d0;
  border-top-color: #4b4b4b;
  border-bottom-color: #4b4b4b;
  border-left-color: #333;
  border-right-color: #333;
}
body.quarto-dark #gd-tbl-a9f147ec .gd-tbl-rownum,
html.quarto-dark #gd-tbl-a9f147ec .gd-tbl-rownum,
:root[data-bs-theme="dark"] #gd-tbl-a9f147ec .gd-tbl-rownum {
  color: #888;
  border-right-color: rgba(102, 153, 204, 0.4) !important;
}
body.quarto-dark #gd-tbl-a9f147ec .gd-tbl-missing,
html.quarto-dark #gd-tbl-a9f147ec .gd-tbl-missing,
:root[data-bs-theme="dark"] #gd-tbl-a9f147ec .gd-tbl-missing {
  color: #ff6b6b !important;
  background-color: rgba(60, 17, 24, 0.2);
}
body.quarto-dark #gd-tbl-a9f147ec .gd-tbl-dtype,
html.quarto-dark #gd-tbl-a9f147ec .gd-tbl-dtype,
:root[data-bs-theme="dark"] #gd-tbl-a9f147ec .gd-tbl-dtype {
  color: #888;
}
body.quarto-dark #gd-tbl-a9f147ec .gt_bottom_border,
html.quarto-dark #gd-tbl-a9f147ec .gt_bottom_border,
:root[data-bs-theme="dark"] #gd-tbl-a9f147ec .gt_bottom_border {
  border-bottom-color: #555;
}
body.quarto-dark #gd-tbl-a9f147ec .gd-tbl-badge-rows-label,
html.quarto-dark #gd-tbl-a9f147ec .gd-tbl-badge-rows-label,
:root[data-bs-theme="dark"] #gd-tbl-a9f147ec .gd-tbl-badge-rows-label {
  background-color: #3d2a4d;
  border-color: #3d2a4d;
  color: #e0c0ff;
}
body.quarto-dark #gd-tbl-a9f147ec .gd-tbl-badge-rows-value,
html.quarto-dark #gd-tbl-a9f147ec .gd-tbl-badge-rows-value,
:root[data-bs-theme="dark"] #gd-tbl-a9f147ec .gd-tbl-badge-rows-value {
  border-color: #3d2a4d;
  color: #d0b0e0;
}
body.quarto-dark #gd-tbl-a9f147ec .gd-tbl-badge-cols-label,
html.quarto-dark #gd-tbl-a9f147ec .gd-tbl-badge-cols-label,
:root[data-bs-theme="dark"] #gd-tbl-a9f147ec .gd-tbl-badge-cols-label {
  background-color: #2a4d2a;
  border-color: #2a4d2a;
  color: #b0e0b0;
}
body.quarto-dark #gd-tbl-a9f147ec .gd-tbl-badge-cols-value,
html.quarto-dark #gd-tbl-a9f147ec .gd-tbl-badge-cols-value,
:root[data-bs-theme="dark"] #gd-tbl-a9f147ec .gd-tbl-badge-cols-value {
  border-color: #2a4d2a;
  color: #a0d0a0;
}
</style>

<table class="gt_table" data-quarto-disable-processing="true" data-quarto-bootstrap="false">
<thead>
<tr class="gt_heading">
<th colspan="8" class="gt_heading gt_title gt_font_normal"><div style="padding-top: 0; padding-bottom: 7px;">
<span class="gd-tbl-badge" style="background-color: #150458; color: #FFFFFF; border: 1px solid #150458; margin-right: 8px;">Pandas</span>Rows2Columns7
</div></th>
</tr>
<tr class="gt_col_headings">
<th class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"></th>
<th id="id" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

id

<em>i64</em>

</div></th>
<th id="tstart" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

tstart

<em>f64</em>

</div></th>
<th id="tstop" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

tstop

<em>f64</em>

</div></th>
<th id="status" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

status

<em>i64</em>

</div></th>
<th id="bili" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

bili

<em>f64</em>

</div></th>
<th id="albumin" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

albumin

<em>f64</em>

</div></th>
<th id="protime" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

protime

<em>f64</em>

</div></th>
</tr>
</thead>
<tbody class="gt_table_body">
<tr>
<td class="gt_row gt_right gd-tbl-rownum">0</td>
<td class="gt_row gt_right" style="max-width: 56px">1</td>
<td class="gt_row gt_right" style="max-width: 69px">0</td>
<td class="gt_row gt_right" style="max-width: 61px">192</td>
<td class="gt_row gt_right" style="max-width: 69px">0</td>
<td class="gt_row gt_right" style="max-width: 56px">14.5</td>
<td class="gt_row gt_right" style="max-width: 77px">2.6</td>
<td class="gt_row gt_right" style="max-width: 77px">12.2</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">1</td>
<td class="gt_row gt_right" style="max-width: 56px">1</td>
<td class="gt_row gt_right" style="max-width: 69px">192</td>
<td class="gt_row gt_right" style="max-width: 61px">400</td>
<td class="gt_row gt_right" style="max-width: 69px">2</td>
<td class="gt_row gt_right" style="max-width: 56px">21.3</td>
<td class="gt_row gt_right" style="max-width: 77px">2.94</td>
<td class="gt_row gt_right" style="max-width: 77px">11.2</td>
</tr>
</tbody>
</table>


Before fitting we drop the small number of rows with missing covariate values and create a binary event indicator.


``` python
long_clean = long.dropna(subset=["bili", "albumin", "protime"]).copy()
long_clean["event"] = (long_clean["status"] == 2).astype(int)
print(f"{len(long_clean)} intervals, {long_clean['event'].sum()} events, "
      f"{long_clean['id'].nunique()} subjects")
```


    1945 intervals, 140 events, 312 subjects


# Fitting the TVC Cox model

The counting-process [Surv](../reference/Surv.md#greenwood.Surv) object wraps `tstart` and `tstop` alongside the event indicator. Pass the resulting response and covariate columns to [CoxPH](../reference/CoxPH.md#greenwood.CoxPH) exactly as with a right-censored model.


``` python
y = gw.Surv.counting(long_clean["tstart"], long_clean["tstop"], long_clean["event"])
cox_tvc = gw.CoxPH().fit(y, long_clean[["bili", "albumin", "protime"]])
cox_tvc
```


    /var/folders/s8/bj_jsx3d7jqd2btw7bwm6yx80000gp/T/ipykernel_11628/3376967461.py:2: UserWarning: Subjects in counting-process data have different start times, some much larger than 0. This may indicate that start/stop times are calendar time rather than subject-relative time. Each subject's timeline should begin at 0. If you have calendar dates, subtract each subject's entry date from their start/stop times before fitting.
      cox_tvc = gw.CoxPH().fit(y, long_clean[["bili", "albumin", "protime"]])


    CoxPH (Cox proportional hazards model, ties='efron')

               coef  exp(coef)  se(coef)        z          p
    bili     0.1378      1.148   0.01044   13.203  8.467e-40
    albumin  -2.016     0.1331    0.1649  -12.232  2.107e-34
    protime  0.1962      1.217   0.03393    5.783  7.356e-09

    n = 1945, events = 140
    Likelihood ratio test = 440.4 on 3 df, p = 3.852e-95


For comparison, fit the same model using only the baseline lab values from `pbc`.


``` python
pbc_pd = gw.load_dataset("pbc", backend="pandas")
pbc_clean = pbc_pd.dropna(subset=["bili", "albumin", "protime"]).copy()
pbc_clean["event"] = (pbc_clean["status"] == 2).astype(int)

y_static = gw.Surv.right(pbc_clean["time"], event=pbc_clean["event"])
cox_static = gw.CoxPH().fit(y_static, pbc_clean[["bili", "albumin", "protime"]])
cox_static
```


    CoxPH (Cox proportional hazards model, ties='efron')

               coef  exp(coef)  se(coef)       z          p
    bili     0.1202      1.128    0.0126   9.547  1.332e-21
    albumin  -1.226     0.2933     0.198  -6.193  5.902e-10
    protime  0.1864      1.205   0.04962   3.756  0.0001729

    n = 416, events = 160
    Likelihood ratio test = 146.5 on 3 df, p = 1.481e-31


The TVC model gives notably larger hazard ratios for bilirubin (exp(0.14) ≈ 1.15 vs exp(0.09) ≈ 1.09 in the static model). Updating the covariate at each visit lets the model use the most recent measurement, which better reflects the current disease severity and recovers more of the true effect.


# Predicting survival along a covariate trajectory

For a subject whose covariates change over time you cannot describe them with a single static vector. Instead, pass a trajectory DataFrame to [predict()](../reference/AFT.md#greenwood.AFT.predict). Each row of the trajectory defines a constant-covariate interval `(tstart, tstop]`. The covariate values in that interval are used to accumulate hazard up to any requested time point.

Subject 1 of the PBC study had two visits. Their trajectory therefore has two rows.


``` python
tvc_path = pd.DataFrame({
    "tstart":  [0.0,   192.0],
    "tstop":   [192.0, 400.0],
    "bili":    [14.5,  21.3],
    "albumin": [2.60,  2.94],
    "protime": [12.2,  11.2],
})
tvc_path
```


<style>
@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,400;0,600;1,400&family=IBM+Plex+Sans:wght@400;600&display=swap');
#gd-tbl-bfda56f6 .gt_table {
  display: table;
  border-collapse: collapse;
  table-layout: fixed;
  line-height: normal;
  margin-left: auto;
  margin-right: auto;
  color: #333333;
  font-size: 14px;
  font-weight: normal;
  font-style: normal;
  background-color: #FFFFFF;
  width: auto;
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #A8A8A8;
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #A8A8A8;
}
#gd-tbl-bfda56f6 .gt_heading {
  background-color: #FFFFFF;
  text-align: left;
  border-bottom-color: #FFFFFF;
  border-left-style: none;
  border-right-style: none;
}
#gd-tbl-bfda56f6 .gt_title {
  color: #333333;
  font-size: 125%;
  font-weight: initial;
  padding-top: 4px;
  padding-bottom: 4px;
  padding-left: 5px;
  padding-right: 5px;
  border-bottom-color: #FFFFFF;
  border-bottom-width: 0;
}
#gd-tbl-bfda56f6 .gt_subtitle {
  color: #333333;
  font-size: 85%;
  font-weight: initial;
  padding-top: 3px;
  padding-bottom: 5px;
  padding-left: 5px;
  padding-right: 5px;
  border-top-color: #FFFFFF;
  border-top-width: 0;
}
#gd-tbl-bfda56f6 .gt_bottom_border {
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #D3D3D3;
}
#gd-tbl-bfda56f6 .gt_col_headings {
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #D3D3D3;
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #D3D3D3;
  border-left-style: none;
  border-right-style: none;
}
#gd-tbl-bfda56f6 .gt_col_heading {
  color: #333333;
  background-color: #FFFFFF;
  font-size: 100%;
  font-weight: normal;
  text-transform: inherit;
  border-left-style: solid;
  border-left-width: 1px;
  border-left-color: #F2F2F2;
  border-right-style: solid;
  border-right-width: 1px;
  border-right-color: #F2F2F2;
  vertical-align: bottom;
  padding-top: 5px;
  padding-bottom: 5px;
  padding-left: 5px;
  padding-right: 5px;
  overflow-x: hidden;
}
#gd-tbl-bfda56f6 .gt_table_body {
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #D3D3D3;
}
#gd-tbl-bfda56f6 .gt_row {
  padding-top: 4px;
  padding-bottom: 4px;
  padding-left: 5px;
  padding-right: 5px;
  margin: 10px;
  border-top-style: solid;
  border-top-width: 1px;
  border-top-color: #E9E9E9;
  border-left-style: solid;
  border-left-width: 1px;
  border-left-color: #E9E9E9;
  border-right-style: solid;
  border-right-width: 1px;
  border-right-color: #E9E9E9;
  vertical-align: middle;
  overflow-x: hidden;
}
#gd-tbl-bfda56f6 .gt_left { text-align: left; }
#gd-tbl-bfda56f6 .gt_center { text-align: center; }
#gd-tbl-bfda56f6 .gt_right { text-align: right; font-variant-numeric: tabular-nums; }
#gd-tbl-bfda56f6 .gt_font_normal { font-weight: normal; }
#gd-tbl-bfda56f6 .gt_font_bold { font-weight: bold; }
#gd-tbl-bfda56f6 .gt_font_italic { font-style: italic; }
#gd-tbl-bfda56f6 .gt_striped { background-color: rgba(128,128,128,0.05); }
#gd-tbl-bfda56f6 .gt_from_md > :first-child { margin-top: 0; }
#gd-tbl-bfda56f6 .gt_from_md > :last-child { margin-bottom: 0; }
/* Data cell font */
#gd-tbl-bfda56f6 .gt_table_body .gt_row {
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 12px;
  color: #333333;
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  height: 14px;
}
/* Column label font */
#gd-tbl-bfda56f6 .gt_col_heading {
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 12px;
  color: #333333;
}
/* Row number styling */
#gd-tbl-bfda56f6 .gd-tbl-rownum {
  color: gray;
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 10px;
  border-right: 2px solid rgba(102, 153, 204, 0.5) !important;
  text-align: right;
  padding-right: 6px;
  white-space: nowrap;
}
/* Head/tail divider */
#gd-tbl-bfda56f6 tr.gd-tbl-divider td,
#gd-tbl-bfda56f6 tr.gd-tbl-divider th {
  border-bottom: 2px solid rgba(102, 153, 204, 0.5);
}
/* Missing values */
#gd-tbl-bfda56f6 .gd-tbl-missing {
  color: #B22222 !important;
  background-color: rgba(255, 193, 193, 0.35);
}
/* Column label sub-elements */
#gd-tbl-bfda56f6 .gd-tbl-colname {
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  padding-bottom: 0;
  margin-bottom: 0;
}
#gd-tbl-bfda56f6 .gd-tbl-dtype {
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  padding-top: 0;
  margin-top: 0;
  color: #666666;
}
/* Header badge styling */
#gd-tbl-bfda56f6 .gd-tbl-badge {
  display: inline-block;
  padding: 2px 10px;
  font-family: 'IBM Plex Sans', -apple-system, BlinkMacSystemFont, sans-serif;
  font-size: 10px;
  font-weight: bold;
  text-transform: uppercase;
  position: inherit;
}
#gd-tbl-bfda56f6 .gd-tbl-badge-rows-label {
  background-color: #eecbff;
  color: #333333;
  border: 1px solid #eecbff;
  margin-left: 5px;
}
#gd-tbl-bfda56f6 .gd-tbl-badge-rows-value {
  background-color: transparent;
  color: #333333;
  border: 1px solid #eecbff;
  margin-left: -4px;
  margin-right: 3px;
}
#gd-tbl-bfda56f6 .gd-tbl-badge-cols-label {
  background-color: #BDE7B4;
  color: #333333;
  border: 1px solid #BDE7B4;
}
#gd-tbl-bfda56f6 .gd-tbl-badge-cols-value {
  background-color: transparent;
  color: #333333;
  border: 1px solid #BDE7B4;
  margin-left: -4px;
}
/* Dark mode */
body.quarto-dark #gd-tbl-bfda56f6 .gt_table,
html.quarto-dark #gd-tbl-bfda56f6 .gt_table,
:root[data-bs-theme="dark"] #gd-tbl-bfda56f6 .gt_table {
  background-color: #1a1a2e;
  color: #e0e0e0;
  border-top-color: #555;
  border-bottom-color: #555;
}
body.quarto-dark #gd-tbl-bfda56f6 .gt_heading,
html.quarto-dark #gd-tbl-bfda56f6 .gt_heading,
:root[data-bs-theme="dark"] #gd-tbl-bfda56f6 .gt_heading {
  background-color: #1a1a2e;
  border-bottom-color: #1a1a2e;
}
body.quarto-dark #gd-tbl-bfda56f6 .gt_title,
html.quarto-dark #gd-tbl-bfda56f6 .gt_title,
:root[data-bs-theme="dark"] #gd-tbl-bfda56f6 .gt_title {
  color: #e0e0e0;
}
body.quarto-dark #gd-tbl-bfda56f6 .gt_subtitle,
html.quarto-dark #gd-tbl-bfda56f6 .gt_subtitle,
:root[data-bs-theme="dark"] #gd-tbl-bfda56f6 .gt_subtitle {
  color: #b0b0b0;
}
body.quarto-dark #gd-tbl-bfda56f6 .gt_col_headings,
html.quarto-dark #gd-tbl-bfda56f6 .gt_col_headings,
:root[data-bs-theme="dark"] #gd-tbl-bfda56f6 .gt_col_headings {
  border-top-color: #444;
  border-bottom-color: #444;
}
body.quarto-dark #gd-tbl-bfda56f6 .gt_col_heading,
html.quarto-dark #gd-tbl-bfda56f6 .gt_col_heading,
:root[data-bs-theme="dark"] #gd-tbl-bfda56f6 .gt_col_heading {
  color: #b0b0b0;
  background-color: #1a1a2e;
  border-left-color: #333;
  border-right-color: #333;
}
body.quarto-dark #gd-tbl-bfda56f6 .gt_table_body,
html.quarto-dark #gd-tbl-bfda56f6 .gt_table_body,
:root[data-bs-theme="dark"] #gd-tbl-bfda56f6 .gt_table_body {
  border-top-color: #444;
}
body.quarto-dark #gd-tbl-bfda56f6 .gt_table_body .gt_row,
html.quarto-dark #gd-tbl-bfda56f6 .gt_table_body .gt_row,
:root[data-bs-theme="dark"] #gd-tbl-bfda56f6 .gt_table_body .gt_row {
  color: #d0d0d0;
  border-top-color: #4b4b4b;
  border-bottom-color: #4b4b4b;
  border-left-color: #333;
  border-right-color: #333;
}
body.quarto-dark #gd-tbl-bfda56f6 .gd-tbl-rownum,
html.quarto-dark #gd-tbl-bfda56f6 .gd-tbl-rownum,
:root[data-bs-theme="dark"] #gd-tbl-bfda56f6 .gd-tbl-rownum {
  color: #888;
  border-right-color: rgba(102, 153, 204, 0.4) !important;
}
body.quarto-dark #gd-tbl-bfda56f6 .gd-tbl-missing,
html.quarto-dark #gd-tbl-bfda56f6 .gd-tbl-missing,
:root[data-bs-theme="dark"] #gd-tbl-bfda56f6 .gd-tbl-missing {
  color: #ff6b6b !important;
  background-color: rgba(60, 17, 24, 0.2);
}
body.quarto-dark #gd-tbl-bfda56f6 .gd-tbl-dtype,
html.quarto-dark #gd-tbl-bfda56f6 .gd-tbl-dtype,
:root[data-bs-theme="dark"] #gd-tbl-bfda56f6 .gd-tbl-dtype {
  color: #888;
}
body.quarto-dark #gd-tbl-bfda56f6 .gt_bottom_border,
html.quarto-dark #gd-tbl-bfda56f6 .gt_bottom_border,
:root[data-bs-theme="dark"] #gd-tbl-bfda56f6 .gt_bottom_border {
  border-bottom-color: #555;
}
body.quarto-dark #gd-tbl-bfda56f6 .gd-tbl-badge-rows-label,
html.quarto-dark #gd-tbl-bfda56f6 .gd-tbl-badge-rows-label,
:root[data-bs-theme="dark"] #gd-tbl-bfda56f6 .gd-tbl-badge-rows-label {
  background-color: #3d2a4d;
  border-color: #3d2a4d;
  color: #e0c0ff;
}
body.quarto-dark #gd-tbl-bfda56f6 .gd-tbl-badge-rows-value,
html.quarto-dark #gd-tbl-bfda56f6 .gd-tbl-badge-rows-value,
:root[data-bs-theme="dark"] #gd-tbl-bfda56f6 .gd-tbl-badge-rows-value {
  border-color: #3d2a4d;
  color: #d0b0e0;
}
body.quarto-dark #gd-tbl-bfda56f6 .gd-tbl-badge-cols-label,
html.quarto-dark #gd-tbl-bfda56f6 .gd-tbl-badge-cols-label,
:root[data-bs-theme="dark"] #gd-tbl-bfda56f6 .gd-tbl-badge-cols-label {
  background-color: #2a4d2a;
  border-color: #2a4d2a;
  color: #b0e0b0;
}
body.quarto-dark #gd-tbl-bfda56f6 .gd-tbl-badge-cols-value,
html.quarto-dark #gd-tbl-bfda56f6 .gd-tbl-badge-cols-value,
:root[data-bs-theme="dark"] #gd-tbl-bfda56f6 .gd-tbl-badge-cols-value {
  border-color: #2a4d2a;
  color: #a0d0a0;
}
</style>

<table class="gt_table" data-quarto-disable-processing="true" data-quarto-bootstrap="false">
<thead>
<tr class="gt_heading">
<th colspan="6" class="gt_heading gt_title gt_font_normal"><div style="padding-top: 0; padding-bottom: 7px;">
<span class="gd-tbl-badge" style="background-color: #150458; color: #FFFFFF; border: 1px solid #150458; margin-right: 8px;">Pandas</span>Rows2Columns5
</div></th>
</tr>
<tr class="gt_col_headings">
<th class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"></th>
<th id="tstart" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

tstart

<em>f64</em>

</div></th>
<th id="tstop" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

tstop

<em>f64</em>

</div></th>
<th id="bili" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

bili

<em>f64</em>

</div></th>
<th id="albumin" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

albumin

<em>f64</em>

</div></th>
<th id="protime" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

protime

<em>f64</em>

</div></th>
</tr>
</thead>
<tbody class="gt_table_body">
<tr>
<td class="gt_row gt_right gd-tbl-rownum">0</td>
<td class="gt_row gt_right" style="max-width: 94px">0</td>
<td class="gt_row gt_right" style="max-width: 86px">192</td>
<td class="gt_row gt_right" style="max-width: 81px">14.5</td>
<td class="gt_row gt_right" style="max-width: 102px">2.6</td>
<td class="gt_row gt_right" style="max-width: 102px">12.2</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">1</td>
<td class="gt_row gt_right" style="max-width: 94px">192</td>
<td class="gt_row gt_right" style="max-width: 86px">400</td>
<td class="gt_row gt_right" style="max-width: 81px">21.3</td>
<td class="gt_row gt_right" style="max-width: 102px">2.94</td>
<td class="gt_row gt_right" style="max-width: 102px">11.2</td>
</tr>
</tbody>
</table>


``` python
# Predict survival at selected time points along the trajectory
surv_tvc = cox_tvc.predict(
    trajectory=tvc_path,
    times=[0, 50, 100, 192, 300, 400],
    format="pandas",
)
surv_tvc
```


<style>
@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,400;0,600;1,400&family=IBM+Plex+Sans:wght@400;600&display=swap');
#gd-tbl-affa6e1e .gt_table {
  display: table;
  border-collapse: collapse;
  table-layout: fixed;
  line-height: normal;
  margin-left: auto;
  margin-right: auto;
  color: #333333;
  font-size: 14px;
  font-weight: normal;
  font-style: normal;
  background-color: #FFFFFF;
  width: auto;
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #A8A8A8;
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #A8A8A8;
}
#gd-tbl-affa6e1e .gt_heading {
  background-color: #FFFFFF;
  text-align: left;
  border-bottom-color: #FFFFFF;
  border-left-style: none;
  border-right-style: none;
}
#gd-tbl-affa6e1e .gt_title {
  color: #333333;
  font-size: 125%;
  font-weight: initial;
  padding-top: 4px;
  padding-bottom: 4px;
  padding-left: 5px;
  padding-right: 5px;
  border-bottom-color: #FFFFFF;
  border-bottom-width: 0;
}
#gd-tbl-affa6e1e .gt_subtitle {
  color: #333333;
  font-size: 85%;
  font-weight: initial;
  padding-top: 3px;
  padding-bottom: 5px;
  padding-left: 5px;
  padding-right: 5px;
  border-top-color: #FFFFFF;
  border-top-width: 0;
}
#gd-tbl-affa6e1e .gt_bottom_border {
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #D3D3D3;
}
#gd-tbl-affa6e1e .gt_col_headings {
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #D3D3D3;
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #D3D3D3;
  border-left-style: none;
  border-right-style: none;
}
#gd-tbl-affa6e1e .gt_col_heading {
  color: #333333;
  background-color: #FFFFFF;
  font-size: 100%;
  font-weight: normal;
  text-transform: inherit;
  border-left-style: solid;
  border-left-width: 1px;
  border-left-color: #F2F2F2;
  border-right-style: solid;
  border-right-width: 1px;
  border-right-color: #F2F2F2;
  vertical-align: bottom;
  padding-top: 5px;
  padding-bottom: 5px;
  padding-left: 5px;
  padding-right: 5px;
  overflow-x: hidden;
}
#gd-tbl-affa6e1e .gt_table_body {
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #D3D3D3;
}
#gd-tbl-affa6e1e .gt_row {
  padding-top: 4px;
  padding-bottom: 4px;
  padding-left: 5px;
  padding-right: 5px;
  margin: 10px;
  border-top-style: solid;
  border-top-width: 1px;
  border-top-color: #E9E9E9;
  border-left-style: solid;
  border-left-width: 1px;
  border-left-color: #E9E9E9;
  border-right-style: solid;
  border-right-width: 1px;
  border-right-color: #E9E9E9;
  vertical-align: middle;
  overflow-x: hidden;
}
#gd-tbl-affa6e1e .gt_left { text-align: left; }
#gd-tbl-affa6e1e .gt_center { text-align: center; }
#gd-tbl-affa6e1e .gt_right { text-align: right; font-variant-numeric: tabular-nums; }
#gd-tbl-affa6e1e .gt_font_normal { font-weight: normal; }
#gd-tbl-affa6e1e .gt_font_bold { font-weight: bold; }
#gd-tbl-affa6e1e .gt_font_italic { font-style: italic; }
#gd-tbl-affa6e1e .gt_striped { background-color: rgba(128,128,128,0.05); }
#gd-tbl-affa6e1e .gt_from_md > :first-child { margin-top: 0; }
#gd-tbl-affa6e1e .gt_from_md > :last-child { margin-bottom: 0; }
/* Data cell font */
#gd-tbl-affa6e1e .gt_table_body .gt_row {
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 12px;
  color: #333333;
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  height: 14px;
}
/* Column label font */
#gd-tbl-affa6e1e .gt_col_heading {
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 12px;
  color: #333333;
}
/* Row number styling */
#gd-tbl-affa6e1e .gd-tbl-rownum {
  color: gray;
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 10px;
  border-right: 2px solid rgba(102, 153, 204, 0.5) !important;
  text-align: right;
  padding-right: 6px;
  white-space: nowrap;
}
/* Head/tail divider */
#gd-tbl-affa6e1e tr.gd-tbl-divider td,
#gd-tbl-affa6e1e tr.gd-tbl-divider th {
  border-bottom: 2px solid rgba(102, 153, 204, 0.5);
}
/* Missing values */
#gd-tbl-affa6e1e .gd-tbl-missing {
  color: #B22222 !important;
  background-color: rgba(255, 193, 193, 0.35);
}
/* Column label sub-elements */
#gd-tbl-affa6e1e .gd-tbl-colname {
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  padding-bottom: 0;
  margin-bottom: 0;
}
#gd-tbl-affa6e1e .gd-tbl-dtype {
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  padding-top: 0;
  margin-top: 0;
  color: #666666;
}
/* Header badge styling */
#gd-tbl-affa6e1e .gd-tbl-badge {
  display: inline-block;
  padding: 2px 10px;
  font-family: 'IBM Plex Sans', -apple-system, BlinkMacSystemFont, sans-serif;
  font-size: 10px;
  font-weight: bold;
  text-transform: uppercase;
  position: inherit;
}
#gd-tbl-affa6e1e .gd-tbl-badge-rows-label {
  background-color: #eecbff;
  color: #333333;
  border: 1px solid #eecbff;
  margin-left: 5px;
}
#gd-tbl-affa6e1e .gd-tbl-badge-rows-value {
  background-color: transparent;
  color: #333333;
  border: 1px solid #eecbff;
  margin-left: -4px;
  margin-right: 3px;
}
#gd-tbl-affa6e1e .gd-tbl-badge-cols-label {
  background-color: #BDE7B4;
  color: #333333;
  border: 1px solid #BDE7B4;
}
#gd-tbl-affa6e1e .gd-tbl-badge-cols-value {
  background-color: transparent;
  color: #333333;
  border: 1px solid #BDE7B4;
  margin-left: -4px;
}
/* Dark mode */
body.quarto-dark #gd-tbl-affa6e1e .gt_table,
html.quarto-dark #gd-tbl-affa6e1e .gt_table,
:root[data-bs-theme="dark"] #gd-tbl-affa6e1e .gt_table {
  background-color: #1a1a2e;
  color: #e0e0e0;
  border-top-color: #555;
  border-bottom-color: #555;
}
body.quarto-dark #gd-tbl-affa6e1e .gt_heading,
html.quarto-dark #gd-tbl-affa6e1e .gt_heading,
:root[data-bs-theme="dark"] #gd-tbl-affa6e1e .gt_heading {
  background-color: #1a1a2e;
  border-bottom-color: #1a1a2e;
}
body.quarto-dark #gd-tbl-affa6e1e .gt_title,
html.quarto-dark #gd-tbl-affa6e1e .gt_title,
:root[data-bs-theme="dark"] #gd-tbl-affa6e1e .gt_title {
  color: #e0e0e0;
}
body.quarto-dark #gd-tbl-affa6e1e .gt_subtitle,
html.quarto-dark #gd-tbl-affa6e1e .gt_subtitle,
:root[data-bs-theme="dark"] #gd-tbl-affa6e1e .gt_subtitle {
  color: #b0b0b0;
}
body.quarto-dark #gd-tbl-affa6e1e .gt_col_headings,
html.quarto-dark #gd-tbl-affa6e1e .gt_col_headings,
:root[data-bs-theme="dark"] #gd-tbl-affa6e1e .gt_col_headings {
  border-top-color: #444;
  border-bottom-color: #444;
}
body.quarto-dark #gd-tbl-affa6e1e .gt_col_heading,
html.quarto-dark #gd-tbl-affa6e1e .gt_col_heading,
:root[data-bs-theme="dark"] #gd-tbl-affa6e1e .gt_col_heading {
  color: #b0b0b0;
  background-color: #1a1a2e;
  border-left-color: #333;
  border-right-color: #333;
}
body.quarto-dark #gd-tbl-affa6e1e .gt_table_body,
html.quarto-dark #gd-tbl-affa6e1e .gt_table_body,
:root[data-bs-theme="dark"] #gd-tbl-affa6e1e .gt_table_body {
  border-top-color: #444;
}
body.quarto-dark #gd-tbl-affa6e1e .gt_table_body .gt_row,
html.quarto-dark #gd-tbl-affa6e1e .gt_table_body .gt_row,
:root[data-bs-theme="dark"] #gd-tbl-affa6e1e .gt_table_body .gt_row {
  color: #d0d0d0;
  border-top-color: #4b4b4b;
  border-bottom-color: #4b4b4b;
  border-left-color: #333;
  border-right-color: #333;
}
body.quarto-dark #gd-tbl-affa6e1e .gd-tbl-rownum,
html.quarto-dark #gd-tbl-affa6e1e .gd-tbl-rownum,
:root[data-bs-theme="dark"] #gd-tbl-affa6e1e .gd-tbl-rownum {
  color: #888;
  border-right-color: rgba(102, 153, 204, 0.4) !important;
}
body.quarto-dark #gd-tbl-affa6e1e .gd-tbl-missing,
html.quarto-dark #gd-tbl-affa6e1e .gd-tbl-missing,
:root[data-bs-theme="dark"] #gd-tbl-affa6e1e .gd-tbl-missing {
  color: #ff6b6b !important;
  background-color: rgba(60, 17, 24, 0.2);
}
body.quarto-dark #gd-tbl-affa6e1e .gd-tbl-dtype,
html.quarto-dark #gd-tbl-affa6e1e .gd-tbl-dtype,
:root[data-bs-theme="dark"] #gd-tbl-affa6e1e .gd-tbl-dtype {
  color: #888;
}
body.quarto-dark #gd-tbl-affa6e1e .gt_bottom_border,
html.quarto-dark #gd-tbl-affa6e1e .gt_bottom_border,
:root[data-bs-theme="dark"] #gd-tbl-affa6e1e .gt_bottom_border {
  border-bottom-color: #555;
}
body.quarto-dark #gd-tbl-affa6e1e .gd-tbl-badge-rows-label,
html.quarto-dark #gd-tbl-affa6e1e .gd-tbl-badge-rows-label,
:root[data-bs-theme="dark"] #gd-tbl-affa6e1e .gd-tbl-badge-rows-label {
  background-color: #3d2a4d;
  border-color: #3d2a4d;
  color: #e0c0ff;
}
body.quarto-dark #gd-tbl-affa6e1e .gd-tbl-badge-rows-value,
html.quarto-dark #gd-tbl-affa6e1e .gd-tbl-badge-rows-value,
:root[data-bs-theme="dark"] #gd-tbl-affa6e1e .gd-tbl-badge-rows-value {
  border-color: #3d2a4d;
  color: #d0b0e0;
}
body.quarto-dark #gd-tbl-affa6e1e .gd-tbl-badge-cols-label,
html.quarto-dark #gd-tbl-affa6e1e .gd-tbl-badge-cols-label,
:root[data-bs-theme="dark"] #gd-tbl-affa6e1e .gd-tbl-badge-cols-label {
  background-color: #2a4d2a;
  border-color: #2a4d2a;
  color: #b0e0b0;
}
body.quarto-dark #gd-tbl-affa6e1e .gd-tbl-badge-cols-value,
html.quarto-dark #gd-tbl-affa6e1e .gd-tbl-badge-cols-value,
:root[data-bs-theme="dark"] #gd-tbl-affa6e1e .gd-tbl-badge-cols-value {
  border-color: #2a4d2a;
  color: #a0d0a0;
}
</style>

<table class="gt_table" data-quarto-disable-processing="true" data-quarto-bootstrap="false">
<thead>
<tr class="gt_heading">
<th colspan="3" class="gt_heading gt_title gt_font_normal"><div style="padding-top: 0; padding-bottom: 7px;">
<span class="gd-tbl-badge" style="background-color: #150458; color: #FFFFFF; border: 1px solid #150458; margin-right: 8px;">Pandas</span>Rows6Columns2
</div></th>
</tr>
<tr class="gt_col_headings">
<th class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"></th>
<th id="time" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

time

<em>f64</em>

</div></th>
<th id="subject_1" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

subject_1

<em>f64</em>

</div></th>
</tr>
</thead>
<tbody class="gt_table_body">
<tr>
<td class="gt_row gt_right gd-tbl-rownum">0</td>
<td class="gt_row gt_right" style="max-width: 199px">0</td>
<td class="gt_row gt_right" style="max-width: 266px">1</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">1</td>
<td class="gt_row gt_right" style="max-width: 199px">50</td>
<td class="gt_row gt_right" style="max-width: 266px">0.966310651788</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">2</td>
<td class="gt_row gt_right" style="max-width: 199px">100</td>
<td class="gt_row gt_right" style="max-width: 266px">0.851568181027</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">3</td>
<td class="gt_row gt_right" style="max-width: 199px">192</td>
<td class="gt_row gt_right" style="max-width: 266px">0.667410151188</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">4</td>
<td class="gt_row gt_right" style="max-width: 199px">300</td>
<td class="gt_row gt_right" style="max-width: 266px">0.56241112508</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">5</td>
<td class="gt_row gt_right" style="max-width: 199px">400</td>
<td class="gt_row gt_right" style="max-width: 266px">0.395677691279</td>
</tr>
</tbody>
</table>


Notice the kink near day 192: bilirubin rises from 14.5 to 21.3 at the second visit, which steepens the hazard and causes survival to drop more quickly after that point. A static model using only the baseline value of 14.5 would miss this deterioration entirely.

To see how different the trajectories are, compare the TVC prediction to a static prediction that fixes bilirubin at 14.5 for the entire follow-up:


``` python
# Static prediction: fix covariates at their baseline (day-0) values
static_path = pd.DataFrame({
    "bili": [14.5], "albumin": [2.60], "protime": [12.2]
})

surv_static = cox_tvc.predict(
    static_path,
    type="survival",
    times=[0, 50, 100, 192, 300, 400],
    format="pandas",
)

# Side-by-side comparison
import polars as pl

comparison = pl.from_pandas(surv_tvc).rename({"subject_1": "tvc"}).with_columns(
    pl.from_pandas(surv_static)["subject_1"].alias("static (baseline bili only)")
)
comparison
```


<style>
@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,400;0,600;1,400&family=IBM+Plex+Sans:wght@400;600&display=swap');
#gd-tbl-4ea07e61 .gt_table {
  display: table;
  border-collapse: collapse;
  table-layout: fixed;
  line-height: normal;
  margin-left: auto;
  margin-right: auto;
  color: #333333;
  font-size: 14px;
  font-weight: normal;
  font-style: normal;
  background-color: #FFFFFF;
  width: auto;
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #A8A8A8;
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #A8A8A8;
}
#gd-tbl-4ea07e61 .gt_heading {
  background-color: #FFFFFF;
  text-align: left;
  border-bottom-color: #FFFFFF;
  border-left-style: none;
  border-right-style: none;
}
#gd-tbl-4ea07e61 .gt_title {
  color: #333333;
  font-size: 125%;
  font-weight: initial;
  padding-top: 4px;
  padding-bottom: 4px;
  padding-left: 5px;
  padding-right: 5px;
  border-bottom-color: #FFFFFF;
  border-bottom-width: 0;
}
#gd-tbl-4ea07e61 .gt_subtitle {
  color: #333333;
  font-size: 85%;
  font-weight: initial;
  padding-top: 3px;
  padding-bottom: 5px;
  padding-left: 5px;
  padding-right: 5px;
  border-top-color: #FFFFFF;
  border-top-width: 0;
}
#gd-tbl-4ea07e61 .gt_bottom_border {
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #D3D3D3;
}
#gd-tbl-4ea07e61 .gt_col_headings {
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #D3D3D3;
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #D3D3D3;
  border-left-style: none;
  border-right-style: none;
}
#gd-tbl-4ea07e61 .gt_col_heading {
  color: #333333;
  background-color: #FFFFFF;
  font-size: 100%;
  font-weight: normal;
  text-transform: inherit;
  border-left-style: solid;
  border-left-width: 1px;
  border-left-color: #F2F2F2;
  border-right-style: solid;
  border-right-width: 1px;
  border-right-color: #F2F2F2;
  vertical-align: bottom;
  padding-top: 5px;
  padding-bottom: 5px;
  padding-left: 5px;
  padding-right: 5px;
  overflow-x: hidden;
}
#gd-tbl-4ea07e61 .gt_table_body {
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #D3D3D3;
}
#gd-tbl-4ea07e61 .gt_row {
  padding-top: 4px;
  padding-bottom: 4px;
  padding-left: 5px;
  padding-right: 5px;
  margin: 10px;
  border-top-style: solid;
  border-top-width: 1px;
  border-top-color: #E9E9E9;
  border-left-style: solid;
  border-left-width: 1px;
  border-left-color: #E9E9E9;
  border-right-style: solid;
  border-right-width: 1px;
  border-right-color: #E9E9E9;
  vertical-align: middle;
  overflow-x: hidden;
}
#gd-tbl-4ea07e61 .gt_left { text-align: left; }
#gd-tbl-4ea07e61 .gt_center { text-align: center; }
#gd-tbl-4ea07e61 .gt_right { text-align: right; font-variant-numeric: tabular-nums; }
#gd-tbl-4ea07e61 .gt_font_normal { font-weight: normal; }
#gd-tbl-4ea07e61 .gt_font_bold { font-weight: bold; }
#gd-tbl-4ea07e61 .gt_font_italic { font-style: italic; }
#gd-tbl-4ea07e61 .gt_striped { background-color: rgba(128,128,128,0.05); }
#gd-tbl-4ea07e61 .gt_from_md > :first-child { margin-top: 0; }
#gd-tbl-4ea07e61 .gt_from_md > :last-child { margin-bottom: 0; }
/* Data cell font */
#gd-tbl-4ea07e61 .gt_table_body .gt_row {
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 12px;
  color: #333333;
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  height: 14px;
}
/* Column label font */
#gd-tbl-4ea07e61 .gt_col_heading {
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 12px;
  color: #333333;
}
/* Row number styling */
#gd-tbl-4ea07e61 .gd-tbl-rownum {
  color: gray;
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 10px;
  border-right: 2px solid rgba(102, 153, 204, 0.5) !important;
  text-align: right;
  padding-right: 6px;
  white-space: nowrap;
}
/* Head/tail divider */
#gd-tbl-4ea07e61 tr.gd-tbl-divider td,
#gd-tbl-4ea07e61 tr.gd-tbl-divider th {
  border-bottom: 2px solid rgba(102, 153, 204, 0.5);
}
/* Missing values */
#gd-tbl-4ea07e61 .gd-tbl-missing {
  color: #B22222 !important;
  background-color: rgba(255, 193, 193, 0.35);
}
/* Column label sub-elements */
#gd-tbl-4ea07e61 .gd-tbl-colname {
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  padding-bottom: 0;
  margin-bottom: 0;
}
#gd-tbl-4ea07e61 .gd-tbl-dtype {
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  padding-top: 0;
  margin-top: 0;
  color: #666666;
}
/* Header badge styling */
#gd-tbl-4ea07e61 .gd-tbl-badge {
  display: inline-block;
  padding: 2px 10px;
  font-family: 'IBM Plex Sans', -apple-system, BlinkMacSystemFont, sans-serif;
  font-size: 10px;
  font-weight: bold;
  text-transform: uppercase;
  position: inherit;
}
#gd-tbl-4ea07e61 .gd-tbl-badge-rows-label {
  background-color: #eecbff;
  color: #333333;
  border: 1px solid #eecbff;
  margin-left: 5px;
}
#gd-tbl-4ea07e61 .gd-tbl-badge-rows-value {
  background-color: transparent;
  color: #333333;
  border: 1px solid #eecbff;
  margin-left: -4px;
  margin-right: 3px;
}
#gd-tbl-4ea07e61 .gd-tbl-badge-cols-label {
  background-color: #BDE7B4;
  color: #333333;
  border: 1px solid #BDE7B4;
}
#gd-tbl-4ea07e61 .gd-tbl-badge-cols-value {
  background-color: transparent;
  color: #333333;
  border: 1px solid #BDE7B4;
  margin-left: -4px;
}
/* Dark mode */
body.quarto-dark #gd-tbl-4ea07e61 .gt_table,
html.quarto-dark #gd-tbl-4ea07e61 .gt_table,
:root[data-bs-theme="dark"] #gd-tbl-4ea07e61 .gt_table {
  background-color: #1a1a2e;
  color: #e0e0e0;
  border-top-color: #555;
  border-bottom-color: #555;
}
body.quarto-dark #gd-tbl-4ea07e61 .gt_heading,
html.quarto-dark #gd-tbl-4ea07e61 .gt_heading,
:root[data-bs-theme="dark"] #gd-tbl-4ea07e61 .gt_heading {
  background-color: #1a1a2e;
  border-bottom-color: #1a1a2e;
}
body.quarto-dark #gd-tbl-4ea07e61 .gt_title,
html.quarto-dark #gd-tbl-4ea07e61 .gt_title,
:root[data-bs-theme="dark"] #gd-tbl-4ea07e61 .gt_title {
  color: #e0e0e0;
}
body.quarto-dark #gd-tbl-4ea07e61 .gt_subtitle,
html.quarto-dark #gd-tbl-4ea07e61 .gt_subtitle,
:root[data-bs-theme="dark"] #gd-tbl-4ea07e61 .gt_subtitle {
  color: #b0b0b0;
}
body.quarto-dark #gd-tbl-4ea07e61 .gt_col_headings,
html.quarto-dark #gd-tbl-4ea07e61 .gt_col_headings,
:root[data-bs-theme="dark"] #gd-tbl-4ea07e61 .gt_col_headings {
  border-top-color: #444;
  border-bottom-color: #444;
}
body.quarto-dark #gd-tbl-4ea07e61 .gt_col_heading,
html.quarto-dark #gd-tbl-4ea07e61 .gt_col_heading,
:root[data-bs-theme="dark"] #gd-tbl-4ea07e61 .gt_col_heading {
  color: #b0b0b0;
  background-color: #1a1a2e;
  border-left-color: #333;
  border-right-color: #333;
}
body.quarto-dark #gd-tbl-4ea07e61 .gt_table_body,
html.quarto-dark #gd-tbl-4ea07e61 .gt_table_body,
:root[data-bs-theme="dark"] #gd-tbl-4ea07e61 .gt_table_body {
  border-top-color: #444;
}
body.quarto-dark #gd-tbl-4ea07e61 .gt_table_body .gt_row,
html.quarto-dark #gd-tbl-4ea07e61 .gt_table_body .gt_row,
:root[data-bs-theme="dark"] #gd-tbl-4ea07e61 .gt_table_body .gt_row {
  color: #d0d0d0;
  border-top-color: #4b4b4b;
  border-bottom-color: #4b4b4b;
  border-left-color: #333;
  border-right-color: #333;
}
body.quarto-dark #gd-tbl-4ea07e61 .gd-tbl-rownum,
html.quarto-dark #gd-tbl-4ea07e61 .gd-tbl-rownum,
:root[data-bs-theme="dark"] #gd-tbl-4ea07e61 .gd-tbl-rownum {
  color: #888;
  border-right-color: rgba(102, 153, 204, 0.4) !important;
}
body.quarto-dark #gd-tbl-4ea07e61 .gd-tbl-missing,
html.quarto-dark #gd-tbl-4ea07e61 .gd-tbl-missing,
:root[data-bs-theme="dark"] #gd-tbl-4ea07e61 .gd-tbl-missing {
  color: #ff6b6b !important;
  background-color: rgba(60, 17, 24, 0.2);
}
body.quarto-dark #gd-tbl-4ea07e61 .gd-tbl-dtype,
html.quarto-dark #gd-tbl-4ea07e61 .gd-tbl-dtype,
:root[data-bs-theme="dark"] #gd-tbl-4ea07e61 .gd-tbl-dtype {
  color: #888;
}
body.quarto-dark #gd-tbl-4ea07e61 .gt_bottom_border,
html.quarto-dark #gd-tbl-4ea07e61 .gt_bottom_border,
:root[data-bs-theme="dark"] #gd-tbl-4ea07e61 .gt_bottom_border {
  border-bottom-color: #555;
}
body.quarto-dark #gd-tbl-4ea07e61 .gd-tbl-badge-rows-label,
html.quarto-dark #gd-tbl-4ea07e61 .gd-tbl-badge-rows-label,
:root[data-bs-theme="dark"] #gd-tbl-4ea07e61 .gd-tbl-badge-rows-label {
  background-color: #3d2a4d;
  border-color: #3d2a4d;
  color: #e0c0ff;
}
body.quarto-dark #gd-tbl-4ea07e61 .gd-tbl-badge-rows-value,
html.quarto-dark #gd-tbl-4ea07e61 .gd-tbl-badge-rows-value,
:root[data-bs-theme="dark"] #gd-tbl-4ea07e61 .gd-tbl-badge-rows-value {
  border-color: #3d2a4d;
  color: #d0b0e0;
}
body.quarto-dark #gd-tbl-4ea07e61 .gd-tbl-badge-cols-label,
html.quarto-dark #gd-tbl-4ea07e61 .gd-tbl-badge-cols-label,
:root[data-bs-theme="dark"] #gd-tbl-4ea07e61 .gd-tbl-badge-cols-label {
  background-color: #2a4d2a;
  border-color: #2a4d2a;
  color: #b0e0b0;
}
body.quarto-dark #gd-tbl-4ea07e61 .gd-tbl-badge-cols-value,
html.quarto-dark #gd-tbl-4ea07e61 .gd-tbl-badge-cols-value,
:root[data-bs-theme="dark"] #gd-tbl-4ea07e61 .gd-tbl-badge-cols-value {
  border-color: #2a4d2a;
  color: #a0d0a0;
}
</style>

<table class="gt_table" data-quarto-disable-processing="true" data-quarto-bootstrap="false">
<thead>
<tr class="gt_heading">
<th colspan="4" class="gt_heading gt_title gt_font_normal"><div style="padding-top: 0; padding-bottom: 7px;">
<span class="gd-tbl-badge" style="background-color: #0075FF; color: #FFFFFF; border: 1px solid #0075FF; margin-right: 8px;">Polars</span>Rows6Columns3
</div></th>
</tr>
<tr class="gt_col_headings">
<th class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"></th>
<th id="time" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

time

<em>f64</em>

</div></th>
<th id="tvc" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

tvc

<em>f64</em>

</div></th>
<th id="static (baseline bili only)" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

static (baseline bili only)

<em>f64</em>

</div></th>
</tr>
</thead>
<tbody class="gt_table_body">
<tr>
<td class="gt_row gt_right gd-tbl-rownum">0</td>
<td class="gt_row gt_right" style="max-width: 73px">0</td>
<td class="gt_row gt_right" style="max-width: 140px">1</td>
<td class="gt_row gt_right" style="max-width: 250px">1</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">1</td>
<td class="gt_row gt_right" style="max-width: 73px">50</td>
<td class="gt_row gt_right" style="max-width: 140px">0.966310651788</td>
<td class="gt_row gt_right" style="max-width: 250px">0.966310651788</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">2</td>
<td class="gt_row gt_right" style="max-width: 73px">100</td>
<td class="gt_row gt_right" style="max-width: 140px">0.851568181027</td>
<td class="gt_row gt_right" style="max-width: 250px">0.851568181027</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">3</td>
<td class="gt_row gt_right" style="max-width: 73px">192</td>
<td class="gt_row gt_right" style="max-width: 140px">0.667410151188</td>
<td class="gt_row gt_right" style="max-width: 250px">0.667410151188</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">4</td>
<td class="gt_row gt_right" style="max-width: 73px">300</td>
<td class="gt_row gt_right" style="max-width: 140px">0.56241112508</td>
<td class="gt_row gt_right" style="max-width: 250px">0.567617113732</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">5</td>
<td class="gt_row gt_right" style="max-width: 73px">400</td>
<td class="gt_row gt_right" style="max-width: 140px">0.395677691279</td>
<td class="gt_row gt_right" style="max-width: 250px">0.406971009427</td>
</tr>
</tbody>
</table>


At day 400 (the subject's actual exit time) the TVC prediction gives a survival probability roughly 10 percentage points lower than the static prediction, reflecting the bilirubin rise captured during follow-up.


# Visualizing the survival trajectory

Build predictions at a finer time resolution and melt them into a tidy long frame, then pass it to Altair to draw overlapping survival curves.


``` python
import altair as alt
import polars as pl

times = list(range(0, 421, 5))

surv_tvc_fine = cox_tvc.predict(
    trajectory=tvc_path, times=times, format="polars"
)
surv_static_fine = cox_tvc.predict(
    static_path, type="survival", times=times, format="polars"
)

# Combine into a tidy long frame for Altair
plot_data = (
    surv_tvc_fine.rename({"subject_1": "TVC (updating bilirubin)"})
    .join(
        surv_static_fine.rename({"subject_1": "Static (baseline bilirubin)"}),
        on="time",
    )
    .unpivot(index="time", variable_name="model", value_name="survival")
)

alt.Chart(plot_data).mark_line().encode(
    x=alt.X("time:Q", title="Time (days)"),
    y=alt.Y("survival:Q", title="Survival probability", scale=alt.Scale(domain=[0, 1])),
    color=alt.Color("model:N", title="Model"),
)
```


<style>
  #altair-viz-4fb628fd315041de87ed0470aeda15fa.vega-embed {
    width: 100%;
    display: flex;
  }

  #altair-viz-4fb628fd315041de87ed0470aeda15fa.vega-embed details,
  #altair-viz-4fb628fd315041de87ed0470aeda15fa.vega-embed details summary {
    position: relative;
  }
</style>


The TVC curve (updating bilirubin at day 192) separates noticeably from the static curve after the second visit. Both start from the same point because the baseline covariate values are identical. The divergence begins exactly where the trajectory changes.


# Summary

| Step | Code |
|----|----|
| Load repeated-measurement data | `gw.load_dataset("pbcseq")` |
| Build counting-process dataset | `gw.split_episodes(base, visits, id=, time=, event=, visit_time=)` |
| Wrap the response | `gw.Surv.counting(tstart, tstop, event)` |
| Fit the TVC Cox model | `gw.CoxPH().fit(y, covariates)` |
| Predict along a trajectory | `cox.predict(trajectory=path, times=...)` |

Time-varying covariates require more data preparation than a static model, but the tradeoff is hazard ratios that reflect the covariate at the time of each event rather than a single snapshot.
