From 271906e1701bebca1157257679999263d55baba4 Mon Sep 17 00:00:00 2001 From: Tom Palmer Date: Thu, 1 Oct 2026 14:13:35 +0100 Subject: [PATCH 01/28] Add Python 3.15 --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 592513b..d785a5d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,6 +19,7 @@ classifiers = [ "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: 3.15", ] authors = [ From 9f48c77c24c9b02ae3b9a6df1bb4c565c64c238c Mon Sep 17 00:00:00 2001 From: Tom Palmer Date: Thu, 1 Oct 2026 14:14:14 +0100 Subject: [PATCH 02/28] Test on Python 3.15 --- .github/workflows/python-app.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-app.yml b/.github/workflows/python-app.yml index 2421ad6..e517e7a 100644 --- a/.github/workflows/python-app.yml +++ b/.github/workflows/python-app.yml @@ -17,7 +17,7 @@ jobs: fail-fast: false matrix: os: [macos-26] - python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] + python-version: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.15"] steps: - uses: actions/checkout@v7 From f876f9963284d7f932f97600b7b8503e0ceeb88b Mon Sep 17 00:00:00 2001 From: Tom Palmer Date: Sun, 11 Oct 2026 16:41:26 +0100 Subject: [PATCH 03/28] Bump version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index d785a5d..8e46bf8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "pySEQTarget" -version = "0.14.2" +version = "0.14.3" description = "Sequential Target Trial Emulation" readme = "README.md" license = {text = "MIT"} From a1014760f91fe6d8b9d5ca55856d7dafc683ba6e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 11 Oct 2026 15:41:47 +0000 Subject: [PATCH 04/28] Auto-format code --- CITATION.cff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CITATION.cff b/CITATION.cff index 28d5beb..9315375 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -18,7 +18,7 @@ authors: affiliation: "CAUSALab, Department of Epidemiology, Harvard T.H. Chan School of Public Health; Department of Biostatistics, Harvard T.H. Chan School of Public Health" orcid: https://orcid.org/0000-0003-1619-8456 title: "pySEQTarget: Sequential Target Trial Emulation" -version: 0.14.2 +version: 0.14.3 url: https://pyseqtarget.readthedocs.io/ repository-code: https://github.com/CausalInference/pySEQTarget repository-artifact: https://pypi.org/project/pySEQTarget/ From 6bfe739b68c6a156c22f3384845c65820546bdcf Mon Sep 17 00:00:00 2001 From: Tom Palmer Date: Sun, 11 Oct 2026 16:57:30 +0100 Subject: [PATCH 05/28] Exclude jax on 3.15 - no wheels yet --- pyproject.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 8e46bf8..2cea093 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -54,8 +54,8 @@ output = [ "tabulate" ] gpu = [ - "jax[cuda12]; sys_platform == 'linux'", - "jax; sys_platform != 'linux'", + "jax[cuda12]; sys_platform == 'linux' and python_version < '3.15'", + "jax; sys_platform != 'linux' and python_version < '3.15'", ] dev = [ "pySEQTarget[output,gpu]", @@ -77,7 +77,7 @@ Repository = "https://github.com/CausalInference/pySEQTarget" dev = [ "black", "isort", - "jax", + "jax; python_version < '3.15'", "pytest", "myst-parser", "piccolo_theme", From f267f8cbea4449292ca6aaa051665e9739496695 Mon Sep 17 00:00:00 2001 From: Tom Palmer Date: Mon, 12 Oct 2026 14:06:28 +0100 Subject: [PATCH 06/28] Stop converting numeric fixed covariates to categories --- pySEQTarget/SEQuential.py | 9 ++-- pySEQTarget/analysis/_outcome_fit.py | 6 +-- pySEQTarget/helpers/_fix_categories.py | 9 ++++ pySEQTarget/helpers/_predict_model.py | 11 ++-- pySEQTarget/initialization/_outcome.py | 4 +- tests/test_fixed_covariates.py | 70 ++++++++++++++++++++++++++ 6 files changed, 92 insertions(+), 17 deletions(-) create mode 100644 tests/test_fixed_covariates.py diff --git a/pySEQTarget/SEQuential.py b/pySEQTarget/SEQuential.py index 784d37f..55da6cf 100644 --- a/pySEQTarget/SEQuential.py +++ b/pySEQTarget/SEQuential.py @@ -16,6 +16,7 @@ from .expansion import _binder, _diagnostics, _dynamic, _random_selection from .helpers import (Offloader, _bake_model_formulas, _col_string, _format_time, bootstrap_loop) +from .helpers._fix_categories import _cast_fixed_categories from .initialization import (_cense_denominator, _cense_numerator, _denominator, _numerator, _outcome) from .plot import _survival_plot @@ -41,7 +42,8 @@ class SEQuential: :param treatment_col: Column name specifying treatment per time_col :param outcome_col: Column name specifying outcome per time_col :param time_varying_cols: Time-varying column names as covariates (BMI, Age, etc.) - :param fixed_cols: Fixed column names as covariates (Sex, YOB, etc.) + :param fixed_cols: Fixed column names as covariates (Sex, YOB, etc.). Numeric + columns enter as continuous; supply categorical ones as string or Categorical :param method: Method for analysis ['ITT', 'dose-response', or 'censoring'] :param parameters: Parameters to augment analysis, specified with ``pySEQTarget.SEQopts`` :type parameters: Optional[SEQopts] or None @@ -306,10 +308,7 @@ def fit(self) -> None: # models on `self` - so we keep the original polars frame for # the downstream steps rather than paying a pl.from_pandas() # round-trip per replicate. - WDT_pd = WDT_pl.to_pandas() - for col in self.fixed_cols: - if col in WDT_pd.columns: - WDT_pd[col] = WDT_pd[col].astype("category") + WDT_pd = _cast_fixed_categories(self.fixed_cols, WDT_pl.to_pandas()) _fit_LTFU(self, WDT_pd) _fit_visit(self, WDT_pd) diff --git a/pySEQTarget/analysis/_outcome_fit.py b/pySEQTarget/analysis/_outcome_fit.py index 99cf945..96102bb 100644 --- a/pySEQTarget/analysis/_outcome_fit.py +++ b/pySEQTarget/analysis/_outcome_fit.py @@ -6,6 +6,7 @@ import statsmodels.formula.api as smf from pandas.api.types import is_numeric_dtype +from ..helpers._fix_categories import _cast_fixed_categories from ..helpers._spline import _compute_spline_knots, _cr_term @@ -54,10 +55,7 @@ def _cast_categories(self, df_pd): if squared_col in df_pd.columns: df_pd[squared_col] = df_pd[squared_col].astype("category") - if self.fixed_cols: - for col in self.fixed_cols: - if col in df_pd.columns: - df_pd[col] = df_pd[col].astype("category") + _cast_fixed_categories(self.fixed_cols, df_pd) # Stable factor encoding for categorical time-varying covariates: fix the # level set from the full expanded data (captured on the non-bootstrap diff --git a/pySEQTarget/helpers/_fix_categories.py b/pySEQTarget/helpers/_fix_categories.py index ea4fe2d..dc1e590 100644 --- a/pySEQTarget/helpers/_fix_categories.py +++ b/pySEQTarget/helpers/_fix_categories.py @@ -1,4 +1,13 @@ import pandas as pd +from pandas.api.types import is_numeric_dtype + + +def _cast_fixed_categories(fixed_cols, df): + """Cast non-numeric fixed covariates to category; numeric ones stay continuous.""" + for col in fixed_cols: + if col in df.columns and not is_numeric_dtype(df[col]): + df[col] = df[col].astype("category") + return df def _model_design_info(model): diff --git a/pySEQTarget/helpers/_predict_model.py b/pySEQTarget/helpers/_predict_model.py index 13c2655..4275fd9 100644 --- a/pySEQTarget/helpers/_predict_model.py +++ b/pySEQTarget/helpers/_predict_model.py @@ -1,6 +1,7 @@ import numpy as np -from ._fix_categories import _fix_categories_for_predict +from ._fix_categories import (_cast_fixed_categories, + _fix_categories_for_predict) def _safe_predict(model, data, clip_probs=True): @@ -42,17 +43,13 @@ def _safe_predict(model, data, clip_probs=True): def _prep_predict_frame(self, newdata): - """Convert a polars frame to pandas with fixed_cols cast to category. + """Convert a polars frame to pandas with non-numeric fixed_cols cast to category. Split out from _predict_model so callers predicting with several models on the same rows (e.g. numerator + denominator in _weight_predict) can pay the conversion once and share the frame. """ - newdata = newdata.to_pandas() - for col in self.fixed_cols: - if col in newdata.columns: - newdata[col] = newdata[col].astype("category") - return newdata + return _cast_fixed_categories(self.fixed_cols, newdata.to_pandas()) def _predict_model_pd(model, newdata): diff --git a/pySEQTarget/initialization/_outcome.py b/pySEQTarget/initialization/_outcome.py index cd693f5..de9b702 100644 --- a/pySEQTarget/initialization/_outcome.py +++ b/pySEQTarget/initialization/_outcome.py @@ -14,7 +14,9 @@ def _outcome(self) -> str: if self.time_varying_cols else None ) - fixed = "+".join(self.fixed_cols) if self.fixed_cols else None + # The subgroup column is constant within each subgroup's outcome model + fixed_cols = [c for c in self.fixed_cols if c != self.subgroup_colname] + fixed = "+".join(fixed_cols) if fixed_cols else None trial = ( "+".join(["trial", f"trial{self.indicator_squared}"]) if self.trial_include diff --git a/tests/test_fixed_covariates.py b/tests/test_fixed_covariates.py new file mode 100644 index 0000000..2458ce5 --- /dev/null +++ b/tests/test_fixed_covariates.py @@ -0,0 +1,70 @@ +"""Numeric fixed covariates stay continuous; non-numeric ones are categorical.""" + +import numpy as np +import pandas as pd +import polars as pl + +from pySEQTarget import SEQopts, SEQuential +from pySEQTarget.data import load_data +from pySEQTarget.helpers._fix_categories import _cast_fixed_categories + + +def _with_age(data): + rng = np.random.default_rng(1) + ids = data["ID"].unique().sort() + ages = pl.DataFrame({"ID": ids, "age": np.round(rng.uniform(20, 80, len(ids)), 1)}) + return data.join(ages, on="ID") + + +def test_cast_leaves_numeric_fixed_covariates_numeric(): + df = pd.DataFrame( + { + "age": [34.5, 61.2, 47.8], + "sex": [0, 1, 1], + "region": ["north", "south", "north"], + } + ) + out = _cast_fixed_categories(["age", "sex", "region"], df) + assert out["age"].tolist() == [34.5, 61.2, 47.8] + assert out["sex"].tolist() == [0, 1, 1] + assert isinstance(out["region"].dtype, pd.CategoricalDtype) + + +def test_continuous_fixed_covariate_is_a_single_term(): + s = SEQuential( + _with_age(load_data("SEQdata")), + id_col="ID", + time_col="time", + eligible_col="eligible", + treatment_col="tx_init", + outcome_col="outcome", + time_varying_cols=["N", "L", "P"], + fixed_cols=["sex", "age"], + method="censoring", + parameters=SEQopts(weighted=True, weight_preexpansion=False, km_curves=True), + ) + s.expand() + s.fit() + s.survival() + names = list(s.outcome_model[0]["outcome"].params.index) + assert [n for n in names if n.startswith("age")] == ["age"] + assert "sex" in names + assert "age" in s.denominator_model[0].params.index + + +def test_subgroup_drops_only_the_subgroup_column_from_the_outcome_model(): + s = SEQuential( + _with_age(load_data("SEQdata")), + id_col="ID", + time_col="time", + eligible_col="eligible", + treatment_col="tx_init", + outcome_col="outcome", + time_varying_cols=["N", "L", "P"], + fixed_cols=["sex", "age"], + method="ITT", + parameters=SEQopts(subgroup_colname="sex"), + ) + terms = s.covariates.split("+") + assert "age" in terms + assert "sex" not in terms From 5e0dc0274a38efbde43359427597d168ba7e0f37 Mon Sep 17 00:00:00 2001 From: Tom Palmer Date: Mon, 12 Oct 2026 14:07:48 +0100 Subject: [PATCH 07/28] Match the baseline and squared indicators only as name suffixes --- pySEQTarget/expansion/_binder.py | 30 +++++++-------------- tests/test_indicator_suffixes.py | 46 ++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 20 deletions(-) create mode 100644 tests/test_indicator_suffixes.py diff --git a/pySEQTarget/expansion/_binder.py b/pySEQTarget/expansion/_binder.py index 3c58e40..4613c4e 100644 --- a/pySEQTarget/expansion/_binder.py +++ b/pySEQTarget/expansion/_binder.py @@ -22,22 +22,13 @@ def _binder(self, kept_cols): cols = kept_cols.union({self.eligible_col, self.outcome_col, self.treatment_col}) cols = {col for col in cols if col is not None} - regular = { - col - for col in cols - if not (self.indicator_baseline in col or self.indicator_squared in col) - and col not in excluded - } - - baseline = { - col for col in cols if self.indicator_baseline in col and col not in excluded - } - bas_kept = {col.replace(self.indicator_baseline, "") for col in baseline} - - squared = { - col for col in cols if self.indicator_squared in col and col not in excluded - } - sq_kept = {col.replace(self.indicator_squared, "") for col in squared} + # The indicators are suffixes, so e.g. "bmi_baseline" is a regular column + bas_sfx, sq_sfx = self.indicator_baseline, self.indicator_squared + baseline = {c for c in cols if c.endswith(bas_sfx) and c not in excluded} + squared = {c for c in cols if c.endswith(sq_sfx) and c not in excluded} + regular = cols - baseline - squared - excluded + bas_kept = {c[: -len(bas_sfx)] for c in baseline} + sq_kept = {c[: -len(sq_sfx)] for c in squared} kept = list(regular.union(bas_kept).union(sq_kept)) @@ -72,12 +63,11 @@ def _binder(self, kept_cols): if squared: squares = [] - for sq in squared: - col = sq.replace(self.indicator_squared, "") - squares.append((pl.col(col) ** 2).alias(f"{col}{self.indicator_squared}")) + for col in sq_kept: + squares.append((pl.col(col) ** 2).alias(f"{col}{sq_sfx}")) DT = DT.with_columns(squares) - baseline_cols = {bas.replace(self.indicator_baseline, "") for bas in baseline} + baseline_cols = set(bas_kept) needed = {self.eligible_col, self.treatment_col} baseline_cols.update({c for c in needed}) diff --git a/tests/test_indicator_suffixes.py b/tests/test_indicator_suffixes.py new file mode 100644 index 0000000..282596a --- /dev/null +++ b/tests/test_indicator_suffixes.py @@ -0,0 +1,46 @@ +"""The _bas/_sq indicators are matched only as name suffixes.""" + +import polars as pl + +from pySEQTarget import SEQopts, SEQuential +from pySEQTarget.data import load_data + + +def test_indicator_text_mid_name_is_a_regular_column(): + data = load_data("SEQdata").with_columns( + (pl.col("N") + 1).alias("bmi_baseline"), (pl.col("L") + 1).alias("bmi_sqrt") + ) + s = SEQuential( + data, + id_col="ID", + time_col="time", + eligible_col="eligible", + treatment_col="tx_init", + outcome_col="outcome", + time_varying_cols=["N", "L", "P"], + fixed_cols=["sex", "bmi_baseline", "bmi_sqrt"], + method="ITT", + ) + s.expand() + assert {"bmi_baseline", "bmi_sqrt", "N_bas"} <= set(s.DT.columns) + s.fit() + names = s.outcome_model[0]["outcome"].params.index + assert {"bmi_baseline", "bmi_sqrt"} <= set(names) + + +def test_suffixed_columns_are_still_derived(): + s = SEQuential( + load_data("SEQdata"), + id_col="ID", + time_col="time", + eligible_col="eligible", + treatment_col="tx_init", + outcome_col="outcome", + time_varying_cols=["N", "L", "P"], + fixed_cols=["sex"], + method="ITT", + parameters=SEQopts(covariates="tx_init_bas+followup+N_bas+L_sq"), + ) + s.expand() + assert {"N_bas", "L_sq"} <= set(s.DT.columns) + assert (s.DT["L_sq"] == s.DT["L"] ** 2).all() From 2fb6132c139b07a809ce6aa914a42b2b68338237 Mon Sep 17 00:00:00 2001 From: Tom Palmer Date: Mon, 12 Oct 2026 14:12:59 +0100 Subject: [PATCH 08/28] Reorder expected coefficients now that numeric fixed covariates are numeric terms --- pySEQTarget/SEQuential.py | 10 ++++++++-- tests/test_coefficients.py | 22 ++++++++++---------- tests/test_followup_options.py | 6 +++--- tests/test_parallel.py | 2 +- tests/test_preexpansion_first_row.py | 30 ++++++++++++++++++++++++++++ 5 files changed, 53 insertions(+), 17 deletions(-) create mode 100644 tests/test_preexpansion_first_row.py diff --git a/pySEQTarget/SEQuential.py b/pySEQTarget/SEQuential.py index 55da6cf..a1d136b 100644 --- a/pySEQTarget/SEQuential.py +++ b/pySEQTarget/SEQuential.py @@ -312,8 +312,14 @@ def fit(self) -> None: _fit_LTFU(self, WDT_pd) _fit_visit(self, WDT_pd) - _fit_numerator(self, WDT_pd) - _fit_denominator(self, WDT_pd) + # A subject's first row has no previous treatment (tx_lag is a fill) + tx_WDT_pd = ( + WDT_pd[WDT_pd.groupby(self.id_col).cumcount() > 0] + if self.weight_preexpansion + else WDT_pd + ) + _fit_numerator(self, tx_WDT_pd) + _fit_denominator(self, tx_WDT_pd) if self.offload: _offload_weights(self, boot_idx) diff --git a/tests/test_coefficients.py b/tests/test_coefficients.py index bef2738..d423476 100644 --- a/tests/test_coefficients.py +++ b/tests/test_coefficients.py @@ -25,11 +25,11 @@ def test_ITT_coefs(): expected = [ -6.828506035553407, 0.18935003090041902, - 0.12717241010542563, 0.033715156987629266, -0.00014691202235029346, 0.044566165558944326, 0.0005787770439053261, + 0.12717241010542563, 0.0032906669395295026, -0.01339242049205771, 0.20072409918428052, @@ -57,13 +57,13 @@ def test_PreE_dose_response_coefs(): matrix = s.outcome_model[0]["outcome"].summary2().tables[1]["Coef."].to_list() expected = [ -4.842735939069144, - 0.14286755770151904, 0.055221018477671927, -0.000581657931537684, -0.008484541900408258, 0.00021073328759912806, 0.010537967151467553, 0.0007772316818101141, + 0.14286755770151904, ] assert matrix == approx(expected, rel=1e-3) @@ -89,13 +89,13 @@ def test_PostE_dose_response_coefs(): matrix = s.outcome_model[0]["outcome"].summary2().tables[1]["Coef."].to_list() expected = [ -6.265901713761531, - 0.14065954021957594, 0.048626017624679704, -0.0004688287307505834, -0.003975906839775267, 0.00016676441745740924, 0.03866279977096397, 0.0005928449623613982, + 0.14065954021957594, 0.0030001459817949844, -0.02106338184559446, 0.14867250693140854, @@ -124,11 +124,11 @@ def test_PreE_censoring_coefs(): expected = [ -4.872373936951975, 0.48389186624295133, - 0.0477349453301334, 0.029127276869076173, 4.784054961154824e-05, -0.013614654772205668, 0.0011281734101133744, + 0.0477349453301334, ] assert matrix == approx(expected, rel=1e-3) @@ -155,11 +155,11 @@ def test_PostE_censoring_coefs(): expected = [ -9.172266785106519, 0.4707554720116625, - 0.08162617232478116, 0.029021087196430605, 7.8937226861939e-05, 0.06700192286925702, 0.0005834323664644191, + 0.08162617232478116, 0.004870212765388434, 0.013503198983327514, 0.4466573801510379, @@ -228,11 +228,11 @@ def test_PostE_censoring_excused_coefs(): expected = [ -7.722441228318476, 0.25040421685828396, - 0.08370244078073162, 0.03644249151697272, -0.00019169394285363785, 0.053677366381589396, 0.0005643189202781975, + 0.08370244078073162, 0.005250478928581509, 0.0014679503081325516, 0.3008769969502361, @@ -263,11 +263,11 @@ def test_PreE_LTFU_ITT(): expected = [ -21.636346991788276, 0.06813705852786496, - -0.1939555961858531, 0.02874152772603635, -0.0005734047013500563, 0.2854740212699898, -0.0013729662310668182, + -0.1939555961858531, 0.006501915963316852, -0.4467079969655381, 1.3870473474960576, @@ -298,11 +298,11 @@ def test_PostE_LTFU_ITT(): expected = [ -21.847198431385877, 0.07786703138967718, - -0.15461370944416225, 0.030140057462437704, -0.0006287338029348562, 0.287393206037481, -0.0013719595115633126, + -0.15461370944416225, 0.007295485861066434, -0.42797049565882755, 1.4082102322835948, @@ -331,11 +331,11 @@ def test_ITT_multinomial(): expected = [ -47.505262164163625, 1.76628017234151, - 22.79205044396338, 0.14473536056627245, -0.003725499516376173, 0.2893070991930884, -0.004266608123938117, + 22.79205044396338, 0.05574429164512122, 0.7847862691929901, 1.4703411759229423, @@ -366,11 +366,11 @@ def test_weighted_multinomial(): expected = [ -109.99715622379995, -12.536816769546702, - 9.22013733949143, -0.6129380297017852, 0.01597877250531723, 5.743984176710672, -0.08478678955657822, + 9.22013733949143, ] assert matrix == approx(expected, rel=1e-3) @@ -398,11 +398,11 @@ def test_ITT_visit(): expected = [ -21.636346991788276, 0.06813705852786496, - -0.1939555961858531, 0.02874152772603635, -0.0005734047013500563, 0.2854740212699898, -0.0013729662310668182, + -0.1939555961858531, 0.006501915963316852, -0.4467079969655381, 1.3870473474960576, diff --git a/tests/test_followup_options.py b/tests/test_followup_options.py index 4cd6c65..07125ea 100644 --- a/tests/test_followup_options.py +++ b/tests/test_followup_options.py @@ -30,9 +30,9 @@ def test_followup_class(): 0.11375627612408938, 0.14496108664292745, 0.1798424095611678, - 0.09066206802273916, 0.015738693166264354, 0.0009258560187318309, + 0.09066206802273916, 0.011267393559242982, 0.022194521411244304, 0.19115237121222872, @@ -70,9 +70,9 @@ def test_followup_spline(): expected = [ -4.804282252748607, 0.19115933860001255, - 0.12717121164606823, 0.044310717515918724, 0.0005814999431447507, + 0.12717121164606823, 0.0032948355025455216, -0.013371824500839971, 0.19972467861548412, @@ -105,9 +105,9 @@ def test_no_followup(): expected = [ -6.062350570326165, 0.17748844870984498, - 0.11209431124681817, 0.03344595751001804, 0.0005457002039545119, + 0.11209431124681817, 0.0032236473201563585, -0.014463448024337773, 0.20398559747503964, diff --git a/tests/test_parallel.py b/tests/test_parallel.py index a6384f9..f0e8c74 100644 --- a/tests/test_parallel.py +++ b/tests/test_parallel.py @@ -32,11 +32,11 @@ def test_parallel_ITT(): [ -6.828506035553407, 0.18935003090041902, - 0.12717241010542563, 0.033715156987629266, -0.00014691202235029346, 0.044566165558944326, 0.0005787770439053261, + 0.12717241010542563, 0.0032906669395295026, -0.01339242049205771, 0.20072409918428052, diff --git a/tests/test_preexpansion_first_row.py b/tests/test_preexpansion_first_row.py new file mode 100644 index 0000000..36e56ec --- /dev/null +++ b/tests/test_preexpansion_first_row.py @@ -0,0 +1,30 @@ +"""Each subject's first row is left out of the pre-expansion treatment models.""" + +from pySEQTarget import SEQopts, SEQuential +from pySEQTarget.data import load_data + + +def _model(): + data = load_data("SEQdata") + s = SEQuential( + data, + id_col="ID", + time_col="time", + eligible_col="eligible", + treatment_col="tx_init", + outcome_col="outcome", + time_varying_cols=["N", "L", "P"], + fixed_cols=["sex"], + method="censoring", + parameters=SEQopts(weighted=True), + ) + s.expand() + s.fit() + return s, data + + +def test_first_rows_are_not_fitted(): + s, data = _model() + n_ids = data["ID"].n_unique() + fitted = sum(int(m.nobs) for m in s.denominator_model) + assert fitted == data.height - n_ids From 3b8f927cb8c5605047bd303c9853ae475aa331ca Mon Sep 17 00:00:00 2001 From: Tom Palmer Date: Mon, 12 Oct 2026 14:19:50 +0100 Subject: [PATCH 09/28] Keep the subgroup column in the expansion --- pySEQTarget/SEQuential.py | 1 + tests/test_fixed_covariates.py | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/pySEQTarget/SEQuential.py b/pySEQTarget/SEQuential.py index a1d136b..ba5f412 100644 --- a/pySEQTarget/SEQuential.py +++ b/pySEQTarget/SEQuential.py @@ -147,6 +147,7 @@ def expand(self): self.cense_eligible_colname, self.compevent_colname, self.visit_colname, + self.subgroup_colname, *self.weight_eligible_colnames, *self.excused_colnames, ] diff --git a/tests/test_fixed_covariates.py b/tests/test_fixed_covariates.py index 2458ce5..46a6402 100644 --- a/tests/test_fixed_covariates.py +++ b/tests/test_fixed_covariates.py @@ -63,8 +63,13 @@ def test_subgroup_drops_only_the_subgroup_column_from_the_outcome_model(): time_varying_cols=["N", "L", "P"], fixed_cols=["sex", "age"], method="ITT", - parameters=SEQopts(subgroup_colname="sex"), + parameters=SEQopts(subgroup_colname="sex", km_curves=True), ) terms = s.covariates.split("+") assert "age" in terms assert "sex" not in terms + # Still carried through the expansion to split the analysis by + s.expand() + s.fit() + s.survival() + assert set(s.km_data["sex"].unique()) == {0, 1} From 9ee4099c27283c099b62427f2ef0041ab252c351 Mon Sep 17 00:00:00 2001 From: Tom Palmer Date: Mon, 12 Oct 2026 14:20:41 +0100 Subject: [PATCH 10/28] Leave each subject's first row out of the pre-expansion weight models --- tests/test_coefficients.py | 56 +++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/tests/test_coefficients.py b/tests/test_coefficients.py index d423476..92f976e 100644 --- a/tests/test_coefficients.py +++ b/tests/test_coefficients.py @@ -56,14 +56,14 @@ def test_PreE_dose_response_coefs(): s.fit() matrix = s.outcome_model[0]["outcome"].summary2().tables[1]["Coef."].to_list() expected = [ - -4.842735939069144, - 0.055221018477671927, - -0.000581657931537684, - -0.008484541900408258, - 0.00021073328759912806, - 0.010537967151467553, - 0.0007772316818101141, - 0.14286755770151904, + -4.838361606118745, + 0.0555200193349395, + -0.000588987903925482, + -0.008977364567147181, + 0.00022025518488454974, + 0.01046828606393553, + 0.0007774475011663997, + 0.13972199132132426, ] assert matrix == approx(expected, rel=1e-3) @@ -122,13 +122,13 @@ def test_PreE_censoring_coefs(): s.fit() matrix = s.outcome_model[0]["outcome"].summary2().tables[1]["Coef."].to_list() expected = [ - -4.872373936951975, - 0.48389186624295133, - 0.029127276869076173, - 4.784054961154824e-05, - -0.013614654772205668, - 0.0011281734101133744, - 0.0477349453301334, + -4.866811032893474, + 0.48052384773425627, + 0.029219605971331802, + 4.518185255729768e-05, + -0.013811946311246277, + 0.0011309893093644648, + 0.04763133686352373, ] assert matrix == approx(expected, rel=1e-3) @@ -191,12 +191,12 @@ def test_PreE_censoring_excused_coefs(): s.fit() matrix = s.outcome_model[0]["outcome"].summary2().tables[1]["Coef."].to_list() expected = [ - -5.028261715903588, - 0.09661040854758277, - -0.029861423750765226, - 0.0014186936955145387, - 0.08365564531281737, - -0.0006220464783614585, + -4.862816329255945, + 0.13225723252391386, + -0.009346287352391546, + 0.0008998246435361649, + 0.05433485784114299, + -9.176768394013551e-05, ] assert matrix == approx(expected, rel=1e-3) @@ -364,13 +364,13 @@ def test_weighted_multinomial(): s.fit() matrix = s.outcome_model[0]["outcome"].summary2().tables[1]["Coef."].to_list() expected = [ - -109.99715622379995, - -12.536816769546702, - -0.6129380297017852, - 0.01597877250531723, - 5.743984176710672, - -0.08478678955657822, - 9.22013733949143, + -114.41826601385597, + -14.602543364243662, + -0.649932788806128, + 0.019785420110673472, + 5.98949979981013, + -0.08853893197574524, + 9.555508489654326, ] assert matrix == approx(expected, rel=1e-3) From a14c197581aaeccf32a678ab7bc20f7d2711a03a Mon Sep 17 00:00:00 2001 From: Tom Palmer Date: Mon, 12 Oct 2026 15:05:20 +0100 Subject: [PATCH 11/28] Make treatment weights independent of the order of treatment_level --- pySEQTarget/weighting/_weight_fit.py | 4 +++ pySEQTarget/weighting/_weight_pred.py | 26 +++++++---------- tests/test_coefficients.py | 14 ++++----- tests/test_treatment_level_order.py | 41 +++++++++++++++++++++++++++ 4 files changed, 62 insertions(+), 23 deletions(-) create mode 100644 tests/test_treatment_level_order.py diff --git a/pySEQTarget/weighting/_weight_fit.py b/pySEQTarget/weighting/_weight_fit.py index 851bff8..4043d40 100644 --- a/pySEQTarget/weighting/_weight_fit.py +++ b/pySEQTarget/weighting/_weight_fit.py @@ -125,6 +125,8 @@ def _fit_numerator(self, WDT): model_fit = smf.mnlogit(formula, DT_subset).fit( disp=0, method=self.weight_fit_method ) + # Column order of mnlogit predictions, to look classes up by value + model_fit.seq_classes = sorted(DT_subset[predictor].unique().tolist()) _check_separation(model_fit, label=f"numerator (level {level})") fits.append(model_fit) @@ -166,6 +168,8 @@ def _fit_denominator(self, WDT): model_fit = smf.mnlogit(formula, DT_subset).fit( disp=0, method=self.weight_fit_method ) + # Column order of mnlogit predictions, to look classes up by value + model_fit.seq_classes = sorted(DT_subset[predictor].unique().tolist()) _check_separation(model_fit, label=f"denominator (level {level})") fits.append(model_fit) diff --git a/pySEQTarget/weighting/_weight_pred.py b/pySEQTarget/weighting/_weight_pred.py index 56341b5..e04758c 100644 --- a/pySEQTarget/weighting/_weight_pred.py +++ b/pySEQTarget/weighting/_weight_pred.py @@ -5,21 +5,13 @@ from ..helpers._predict_model import _predict_model_pd, _prep_predict_frame -def _extract_class_probability(p, level_idx, is_binary): - """ - Extract the probability for a specific class from model predictions. - Handles both binary (logit) and multinomial (mnlogit) output formats. - """ +def _extract_class_probability(p, model, level, is_binary): + """P(treatment == level): logit predicts P(A = 1), mnlogit one column per class.""" if is_binary: - # logit returns P(Y=1) directly as 1D array - # For level 0: want P(stay at 0) = 1 - P(Y=1) - # For level 1: want P(switch to 1) = P(Y=1) - return p if level_idx == 1 else (1 - p) - else: - # mnlogit returns [P(Y=0), P(Y=1), ...] as 2D array - if p.ndim == 1: - p = p.reshape(-1, 1) - return p[:, level_idx] + return p if level == 1 else 1 - p + if level not in model.seq_classes: + return np.zeros(len(p)) + return p.reshape(len(p), -1)[:, model.seq_classes.index(level)] def _weight_predict(self, WDT): @@ -69,14 +61,16 @@ def _weight_predict(self, WDT): if denom_model is not None: p = _predict_model_pd(denom_model, subset_pd) - p_class = _extract_class_probability(p, i, is_binary) + p_class = _extract_class_probability( + p, denom_model, level, is_binary + ) pred_denom[lag_mask] = np.where( switched_treatment[lag_mask], 1.0 - p_class, p_class ) if num_model is not None: p = _predict_model_pd(num_model, subset_pd) - p_class = _extract_class_probability(p, i, is_binary) + p_class = _extract_class_probability(p, num_model, level, is_binary) pred_num[lag_mask] = np.where( switched_treatment[lag_mask], 1.0 - p_class, p_class ) diff --git a/tests/test_coefficients.py b/tests/test_coefficients.py index 92f976e..b847249 100644 --- a/tests/test_coefficients.py +++ b/tests/test_coefficients.py @@ -364,13 +364,13 @@ def test_weighted_multinomial(): s.fit() matrix = s.outcome_model[0]["outcome"].summary2().tables[1]["Coef."].to_list() expected = [ - -114.41826601385597, - -14.602543364243662, - -0.649932788806128, - 0.019785420110673472, - 5.98949979981013, - -0.08853893197574524, - 9.555508489654326, + -434.5477209025554, + -21.903908253317347, + 0.7744444103257456, + -0.2841674407328827, + 24.339152289244993, + -0.3621057042257281, + 21.831769438158425, ] assert matrix == approx(expected, rel=1e-3) diff --git a/tests/test_treatment_level_order.py b/tests/test_treatment_level_order.py new file mode 100644 index 0000000..0123ed5 --- /dev/null +++ b/tests/test_treatment_level_order.py @@ -0,0 +1,41 @@ +"""Treatment weights do not depend on the order of treatment_level.""" + +import numpy as np +import pytest + +from pySEQTarget import SEQopts, SEQuential +from pySEQTarget.data import load_data + + +def _weights(dataset, treatment_level, preexpansion): + s = SEQuential( + load_data(dataset), + id_col="ID", + time_col="time", + eligible_col="eligible", + treatment_col="tx_init", + outcome_col="outcome", + time_varying_cols=["N", "L", "P"], + fixed_cols=["sex"], + method="censoring", + parameters=SEQopts( + weighted=True, + weight_preexpansion=preexpansion, + treatment_level=treatment_level, + ), + ) + s.expand() + s.fit() + return s.DT.sort(["ID", "trial", "followup"])["weight"].to_numpy() + + +@pytest.mark.filterwarnings("ignore") +@pytest.mark.parametrize("preexpansion", [False, True]) +@pytest.mark.parametrize( + "dataset, levels", + [("SEQdata", [0, 1]), ("SEQdata_multitreatment", [1, 2])], +) +def test_weights_match_with_treatment_level_reversed(dataset, levels, preexpansion): + forward = _weights(dataset, levels, preexpansion) + reverse = _weights(dataset, levels[::-1], preexpansion) + assert np.allclose(forward, reverse) From 07d7c30eab34e050abf52f0bde7f4bf7954c2a24 Mon Sep 17 00:00:00 2001 From: Tom Palmer Date: Mon, 12 Oct 2026 15:09:04 +0100 Subject: [PATCH 12/28] Make the expansion read excused_colnames the same way as the weight models --- pySEQTarget/expansion/_dynamic.py | 3 ++- tests/test_coefficients.py | 32 +++++++++++++++---------------- tests/test_excused_direction.py | 31 ++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 17 deletions(-) create mode 100644 tests/test_excused_direction.py diff --git a/pySEQTarget/expansion/_dynamic.py b/pySEQTarget/expansion/_dynamic.py index 52060a8..ba62d37 100644 --- a/pySEQTarget/expansion/_dynamic.py +++ b/pySEQTarget/expansion/_dynamic.py @@ -33,8 +33,9 @@ def _dynamic(self): for i, val in enumerate(self.treatment_level): colname = self.excused_colnames[i] if colname is not None: + # Column i excuses a switch away from level i, as in the weight models conditions.append( - (pl.col(colname) == 1) & (pl.col(self.treatment_col) == val) + (pl.col(colname) == 1) & (pl.col("tx_lag") == val) ) if conditions: diff --git a/tests/test_coefficients.py b/tests/test_coefficients.py index b847249..8a8a9e9 100644 --- a/tests/test_coefficients.py +++ b/tests/test_coefficients.py @@ -191,12 +191,12 @@ def test_PreE_censoring_excused_coefs(): s.fit() matrix = s.outcome_model[0]["outcome"].summary2().tables[1]["Coef."].to_list() expected = [ - -4.862816329255945, - 0.13225723252391386, - -0.009346287352391546, - 0.0008998246435361649, - 0.05433485784114299, - -9.176768394013551e-05, + -4.804650815594313, + 0.15964610209528257, + 0.029097252181086327, + -4.654535663714614e-05, + 0.007817954062830172, + 0.0008537393051722129, ] assert matrix == approx(expected, rel=1e-3) @@ -226,16 +226,16 @@ def test_PostE_censoring_excused_coefs(): s.fit() matrix = s.outcome_model[0]["outcome"].summary2().tables[1]["Coef."].to_list() expected = [ - -7.722441228318476, - 0.25040421685828396, - 0.03644249151697272, - -0.00019169394285363785, - 0.053677366381589396, - 0.0005643189202781975, - 0.08370244078073162, - 0.005250478928581509, - 0.0014679503081325516, - 0.3008769969502361, + -8.509145805375901, + 0.20510824302593583, + 0.03501877219835183, + -0.00013575165499032937, + 0.06894107168655417, + 0.0004838972459058374, + 0.1280286673811157, + 0.002303233929883499, + 0.00506482737178425, + 0.37986415103206606, ] assert matrix == approx(expected, rel=1e-3) diff --git a/tests/test_excused_direction.py b/tests/test_excused_direction.py new file mode 100644 index 0000000..cfc00a5 --- /dev/null +++ b/tests/test_excused_direction.py @@ -0,0 +1,31 @@ +"""excused_colnames[i] excuses a switch away from treatment_level[i].""" + +import polars as pl + +from pySEQTarget import SEQopts, SEQuential +from pySEQTarget.data import load_data + + +def test_expansion_excuses_switches_away_from_each_level(): + s = SEQuential( + load_data("SEQdata"), + id_col="ID", + time_col="time", + eligible_col="eligible", + treatment_col="tx_init", + outcome_col="outcome", + time_varying_cols=["N", "L", "P"], + fixed_cols=["sex"], + method="censoring", + parameters=SEQopts( + excused=True, excused_colnames=["excusedZero", "excusedOne"] + ), + ) + s.expand() + excused = s.DT.filter(pl.col("isExcused")) + assert excused.height > 0 + # A switch away from 0 lands on 1 (excusedZero), and away from 1 on 0 (excusedOne) + away = ((pl.col("excusedZero") == 1) & (pl.col("tx_init") == 1)) | ( + (pl.col("excusedOne") == 1) & (pl.col("tx_init") == 0) + ) + assert excused.select(away.all()).item() From 8f8ee11cd0ce9b458ed97d043efb30e063b9f750 Mon Sep 17 00:00:00 2001 From: Tom Palmer Date: Mon, 12 Oct 2026 15:20:39 +0100 Subject: [PATCH 13/28] Fix the excused-censoring weights for every arm and treatment_level order --- pySEQTarget/weighting/_weight_pred.py | 119 +++++++++++--------------- tests/test_coefficients.py | 21 +++-- tests/test_excused_weights.py | 49 +++++++++++ tests/test_treatment_level_order.py | 16 +++- 4 files changed, 124 insertions(+), 81 deletions(-) create mode 100644 tests/test_excused_weights.py diff --git a/pySEQTarget/weighting/_weight_pred.py b/pySEQTarget/weighting/_weight_pred.py index e04758c..e38c40d 100644 --- a/pySEQTarget/weighting/_weight_pred.py +++ b/pySEQTarget/weighting/_weight_pred.py @@ -85,84 +85,65 @@ def _weight_predict(self, WDT): else: for i, level in enumerate(self.treatment_level): col = self.excused_colnames[i] - - if col is not None: - denom_model = self._offloader.load_model(self.denominator_model[i]) - denom_mask = ((WDT["tx_lag"] == level) & (WDT[col] != 1)).to_numpy() - - if denom_model is not None and denom_mask.sum() > 0: - pred_denom = np.ones(WDT.height) - subset = WDT.filter(pl.Series(denom_mask)) - p = _predict_model(self, denom_model, subset) - - if p.ndim == 1: - prob_switch = p - else: - prob_switch = p[:, 1] if p.shape[1] > 1 else p.flatten() - - pred_denom[denom_mask] = prob_switch - - WDT = WDT.with_columns( - pl.when(pl.Series(denom_mask)) - .then(pl.Series(pred_denom)) - .otherwise(pl.col("denominator")) - .alias("denominator") - ) - - if i == 0: - flip_mask = ( - (WDT["tx_lag"] == level) - & (WDT[col] == 0) - & (WDT[self.treatment_col] == level) - ).to_numpy() - else: - flip_mask = ( - (WDT["tx_lag"] == level) - & (WDT[col] == 0) - & (WDT[self.treatment_col] != level) - ).to_numpy() - - WDT = WDT.with_columns( - pl.when(pl.Series(flip_mask)) - .then(1.0 - pl.col("denominator")) - .otherwise(pl.col("denominator")) - .alias("denominator") + if col is None: + continue + denom_model = self._offloader.load_model(self.denominator_model[i]) + denom_mask = ((WDT["tx_lag"] == level) & (WDT[col] != 1)).to_numpy() + if denom_model is None or denom_mask.sum() == 0: + continue + subset = WDT.filter(pl.Series(denom_mask)) + p = _predict_model(self, denom_model, subset) + if self.weight_preexpansion: + # Treatment model: probability of the treatment received + p_level = _extract_class_probability( + p, denom_model, level, is_binary ) + stay = (subset[self.treatment_col] == level).to_numpy() + prob = np.where(stay, p_level, 1.0 - p_level) + else: + # Censoring model: probability of remaining uncensored + p_cens = _extract_class_probability(p, denom_model, 1, is_binary) + prob = np.where( + subset["switch"].to_numpy() == 0, 1.0 - p_cens, p_cens + ) + pred_denom = np.ones(WDT.height) + pred_denom[denom_mask] = prob + WDT = WDT.with_columns( + pl.when(pl.Series(denom_mask)) + .then(pl.Series(pred_denom)) + .otherwise(pl.col("denominator")) + .alias("denominator") + ) if self.weight_preexpansion: WDT = WDT.with_columns(pl.lit(1.0).alias("numerator")) else: for i, level in enumerate(self.treatment_level): col = self.excused_colnames[i] + if col is None: + continue + num_model = self._offloader.load_model(self.numerator_model[i]) + num_mask = ( + (WDT[self.treatment_col] == level) & (WDT[col] == 0) + ).to_numpy() + if num_model is None or num_mask.sum() == 0: + continue + subset = WDT.filter(pl.Series(num_mask)) + p = _predict_model(self, num_model, subset) + pred_num = np.ones(WDT.height) + pred_num[num_mask] = _extract_class_probability( + p, num_model, 1, is_binary + ) + WDT = WDT.with_columns( + pl.when(pl.Series(num_mask)) + .then(pl.Series(pred_num)) + .otherwise(pl.col("numerator")) + .alias("numerator") + ) - if col is not None: - num_model = self._offloader.load_model(self.numerator_model[i]) - num_mask = ( - (WDT[self.treatment_col] == level) & (WDT[col] == 0) - ).to_numpy() - - if num_model is not None and num_mask.sum() > 0: - pred_num = np.ones(WDT.height) - subset = WDT.filter(pl.Series(num_mask)) - p = _predict_model(self, num_model, subset) - - if p.ndim == 1: - prob_switch = p - else: - prob_switch = p[:, 1] if p.shape[1] > 1 else p.flatten() - - pred_num[num_mask] = prob_switch - - WDT = WDT.with_columns( - pl.when(pl.Series(num_mask)) - .then(pl.Series(pred_num)) - .otherwise(pl.col("numerator")) - .alias("numerator") - ) - - first_level = self.treatment_level[0] + # As for the denominator, the model predicts P(censored) WDT = WDT.with_columns( - pl.when(pl.col(self.treatment_col) == first_level) + pl.when(pl.col("switch") == 0) .then(1.0 - pl.col("numerator")) .otherwise(pl.col("numerator")) .alias("numerator") diff --git a/tests/test_coefficients.py b/tests/test_coefficients.py index 8a8a9e9..e49066b 100644 --- a/tests/test_coefficients.py +++ b/tests/test_coefficients.py @@ -219,23 +219,22 @@ def test_PostE_censoring_excused_coefs(): weight_preexpansion=False, excused=True, excused_colnames=["excusedZero", "excusedOne"], - weight_max=1, ), ) s.expand() s.fit() matrix = s.outcome_model[0]["outcome"].summary2().tables[1]["Coef."].to_list() expected = [ - -8.509145805375901, - 0.20510824302593583, - 0.03501877219835183, - -0.00013575165499032937, - 0.06894107168655417, - 0.0004838972459058374, - 0.1280286673811157, - 0.002303233929883499, - 0.00506482737178425, - 0.37986415103206606, + -8.311960526025656, + 0.1820521596172769, + 0.03422386974709779, + -0.00013723383158569053, + 0.06646241563319619, + 0.0004999277868749847, + 0.15032828057125242, + 0.0012618850925656703, + 0.0028819214525432277, + 0.3590674018732999, ] assert matrix == approx(expected, rel=1e-3) diff --git a/tests/test_excused_weights.py b/tests/test_excused_weights.py new file mode 100644 index 0000000..99d0e1b --- /dev/null +++ b/tests/test_excused_weights.py @@ -0,0 +1,49 @@ +"""Post-expansion excused weights use P(uncensored) in every arm.""" + +import polars as pl +import pytest + +from pySEQTarget import SEQopts, SEQuential +from pySEQTarget.data import load_data + + +@pytest.mark.filterwarnings("ignore") +def test_uncensored_rows_get_the_probability_of_staying_uncensored(): + s = SEQuential( + load_data("SEQdata"), + id_col="ID", + time_col="time", + eligible_col="eligible", + treatment_col="tx_init", + outcome_col="outcome", + time_varying_cols=["N", "L", "P"], + fixed_cols=["sex"], + method="censoring", + parameters=SEQopts( + weighted=True, + weight_preexpansion=False, + excused=True, + excused_colnames=["excusedZero", "excusedOne"], + ), + ) + s.expand() + s.fit() + # Uncensored rows on their baseline arm, which that arm's models predict + own_col = ( + pl.when(pl.col("tx_init_bas") == 0) + .then(pl.col("excusedZero")) + .otherwise(pl.col("excusedOne")) + ) + rows = s.DT.filter( + (pl.col("switch") == 0) + & (pl.col("followup") > 0) + & (pl.col("tx_init") == pl.col("tx_init_bas")) + & (own_col == 0) + ) + medians = rows.group_by("tx_init_bas").agg( + pl.col("numerator").median(), pl.col("denominator").median() + ) + # Switching is rare, so P(uncensored) is near 1 in both arms + assert medians.height == 2 + assert (medians["numerator"] > 0.5).all() + assert (medians["denominator"] > 0.5).all() diff --git a/tests/test_treatment_level_order.py b/tests/test_treatment_level_order.py index 0123ed5..a34417a 100644 --- a/tests/test_treatment_level_order.py +++ b/tests/test_treatment_level_order.py @@ -7,7 +7,7 @@ from pySEQTarget.data import load_data -def _weights(dataset, treatment_level, preexpansion): +def _weights(dataset, treatment_level, preexpansion, **opts): s = SEQuential( load_data(dataset), id_col="ID", @@ -22,6 +22,7 @@ def _weights(dataset, treatment_level, preexpansion): weighted=True, weight_preexpansion=preexpansion, treatment_level=treatment_level, + **opts, ), ) s.expand() @@ -39,3 +40,16 @@ def test_weights_match_with_treatment_level_reversed(dataset, levels, preexpansi forward = _weights(dataset, levels, preexpansion) reverse = _weights(dataset, levels[::-1], preexpansion) assert np.allclose(forward, reverse) + + +@pytest.mark.filterwarnings("ignore") +@pytest.mark.parametrize("preexpansion", [False, True]) +def test_excused_weights_match_with_treatment_level_reversed(preexpansion): + cols = ["excusedZero", "excusedOne"] + forward = _weights( + "SEQdata", [0, 1], preexpansion, excused=True, excused_colnames=cols + ) + reverse = _weights( + "SEQdata", [1, 0], preexpansion, excused=True, excused_colnames=cols[::-1] + ) + assert np.allclose(forward, reverse) From 0b56a75ec85da7fc6f949daad136e5905acc8af0 Mon Sep 17 00:00:00 2001 From: Tom Palmer Date: Mon, 12 Oct 2026 15:28:12 +0100 Subject: [PATCH 14/28] Pin the multinomial weights rather than a divergent outcome fit --- tests/test_coefficients.py | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/tests/test_coefficients.py b/tests/test_coefficients.py index e49066b..1714840 100644 --- a/tests/test_coefficients.py +++ b/tests/test_coefficients.py @@ -1,3 +1,4 @@ +import pytest from pytest import approx from pySEQTarget import SEQopts, SEQuential @@ -342,6 +343,7 @@ def test_ITT_multinomial(): assert matrix == approx(expected, rel=1e-3) +@pytest.mark.filterwarnings("ignore:overflow encountered in exp:RuntimeWarning") def test_weighted_multinomial(): data = load_data("SEQdata_multitreatment") @@ -361,17 +363,21 @@ def test_weighted_multinomial(): ) s.expand() s.fit() - matrix = s.outcome_model[0]["outcome"].summary2().tables[1]["Coef."].to_list() - expected = [ - -434.5477209025554, - -21.903908253317347, - 0.7744444103257456, - -0.2841674407328827, - 24.339152289244993, - -0.3621057042257281, - 21.831769438158425, - ] - assert matrix == approx(expected, rel=1e-3) + # The outcome model has no events in arm 2, so its fit diverges (and + # overflows); pin the multinomial weights instead + stats = s.weight_stats.row(0, named=True) + expected = { + "weight_min": 0.6247271882268575, + "weight_max": 1.3120226973615323, + "weight_mean": 0.9947273760015201, + "weight_std": 0.05493659250756025, + "weight_p01": 0.8251337794242161, + "weight_p25": 0.972097606970619, + "weight_p50": 0.9968156083037403, + "weight_p75": 1.0164134507964089, + "weight_p99": 1.1626440219480307, + } + assert stats == approx(expected, rel=1e-3) def test_ITT_visit(): From deaf79ae56d95854f4036090f48a6071d1bc11a7 Mon Sep 17 00:00:00 2001 From: Tom Palmer Date: Mon, 12 Oct 2026 15:31:36 +0100 Subject: [PATCH 15/28] Match subgroup bootstrap results by subgroup value, not position --- pySEQTarget/SEQuential.py | 2 +- pySEQTarget/analysis/_hazard.py | 46 +++++++++++++++----------- pySEQTarget/analysis/_subgroup_fit.py | 24 +++++++++++--- pySEQTarget/analysis/_survival_pred.py | 24 ++++++++------ tests/test_subgroup_bootstrap.py | 41 +++++++++++++++++++++++ 5 files changed, 102 insertions(+), 35 deletions(-) create mode 100644 tests/test_subgroup_bootstrap.py diff --git a/pySEQTarget/SEQuential.py b/pySEQTarget/SEQuential.py index ba5f412..8163cef 100644 --- a/pySEQTarget/SEQuential.py +++ b/pySEQTarget/SEQuential.py @@ -361,7 +361,7 @@ def fit(self) -> None: key: (m.params.values, list(m.model.exog_names)) for key, m in sg.items() } - for val, sg in zip(self._unique_subgroups, models_list) + for val, sg in models_list.items() } return models_list diff --git a/pySEQTarget/analysis/_hazard.py b/pySEQTarget/analysis/_hazard.py index 2a0f9c2..a3cbc52 100644 --- a/pySEQTarget/analysis/_hazard.py +++ b/pySEQTarget/analysis/_hazard.py @@ -8,28 +8,30 @@ from ..helpers._predict_model import _safe_predict from ._outcome_fit import _cast_categories +from ._subgroup_fit import _warn_missing_subgroup def _calculate_hazard(self): if self.subgroup_colname is None: - return _calculate_hazard_single(self, self.DT, idx=None, val=None) + return _calculate_hazard_single(self, self.DT, val=None) all_hazards = [] original_DT = self.DT - for i, val in enumerate(self._unique_subgroups): + for val in self._unique_subgroups: + _warn_missing_subgroup(self, val) subgroup_DT = original_DT.filter(pl.col(self.subgroup_colname) == val) - hazard = _calculate_hazard_single(self, subgroup_DT, i, val) + hazard = _calculate_hazard_single(self, subgroup_DT, val) all_hazards.append(hazard) self.DT = original_DT return pl.concat(all_hazards) -def _calculate_hazard_single(self, data, idx=None, val=None): +def _calculate_hazard_single(self, data, val=None): if self.seed is not None: self._rng = np.random.RandomState(self.seed) - full_log_hr = _hazard_handler(self, data, idx, 0, self._rng) + full_log_hr = _hazard_handler(self, data, val, 0, self._rng) if full_log_hr is None or np.isnan(full_log_hr): return _create_hazard_output(None, None, None, val, self) @@ -47,11 +49,11 @@ def _calculate_hazard_single(self, data, idx=None, val=None): # seed (always set since SEQuential pins a default) so each replicate's # RNG — and therefore the result — is identical to the serial path. if getattr(self, "parallel", False) and self.seed is not None: - boot_log_hrs = _parallel_boot_log_hrs(self, data, idx, boot_sample_idx) + boot_log_hrs = _parallel_boot_log_hrs(self, data, val, boot_sample_idx) else: boot_log_hrs = [] for model_pos, sample_idx in enumerate(boot_sample_idx): - boot_log_hr = _one_boot_log_hr(self, data, idx, model_pos, sample_idx) + boot_log_hr = _one_boot_log_hr(self, data, val, model_pos, sample_idx) if boot_log_hr is not None and not np.isnan(boot_log_hr): boot_log_hrs.append(boot_log_hr) @@ -108,7 +110,7 @@ def _truncate_to_first_event(tmp, id_col, event_col): ) -def _one_boot_log_hr(self, data, idx, model_pos, sample_idx): +def _one_boot_log_hr(self, data, val, model_pos, sample_idx): """Build one bootstrap resample of ``data`` and return its log hazard ratio. The RNG is rebuilt from ``seed + sample_idx + 1`` (matching the serial loop @@ -134,7 +136,7 @@ def _one_boot_log_hr(self, data, idx, model_pos, sample_idx): .drop("_count", "_rep") .collect() ) - return _hazard_handler(self, boot_data, idx, model_pos + 1, rng) + return _hazard_handler(self, boot_data, val, model_pos + 1, rng) # Process-pool worker state. Set once per worker process by the initializer so @@ -150,11 +152,11 @@ def _hazard_pool_init(obj, data_ref): _HZ_WORKER_DATA = obj._offloader.load_dataframe(data_ref) -def _hazard_pool_task(idx, model_pos, sample_idx): - return _one_boot_log_hr(_HZ_WORKER_OBJ, _HZ_WORKER_DATA, idx, model_pos, sample_idx) +def _hazard_pool_task(val, model_pos, sample_idx): + return _one_boot_log_hr(_HZ_WORKER_OBJ, _HZ_WORKER_DATA, val, model_pos, sample_idx) -def _parallel_boot_log_hrs(self, data, idx, boot_sample_idx): +def _parallel_boot_log_hrs(self, data, val, boot_sample_idx): """Run the bootstrap hazard simulations over a process pool. The analysis frame is handed to each worker process once (via the offloader @@ -162,7 +164,7 @@ def _parallel_boot_log_hrs(self, data, idx, boot_sample_idx): models. Results are gathered in submission order, matching the serial loop; NaN/None replicates are dropped the same way. """ - data_ref = self._offloader.save_dataframe(data, f"_haz_DT_{idx}") + data_ref = self._offloader.save_dataframe(data, f"_haz_DT_{val}") # Slim copy for the pool: drop the large frames workers reload from data_ref; # keep the fitted models, bootstrap samples, and config. _GlumFit and @@ -179,7 +181,7 @@ def _parallel_boot_log_hrs(self, data, idx, boot_sample_idx): initargs=(slim, data_ref), ) as executor: futures = [ - executor.submit(_hazard_pool_task, idx, model_pos, sample_idx) + executor.submit(_hazard_pool_task, val, model_pos, sample_idx) for model_pos, sample_idx in enumerate(boot_sample_idx) ] for future in futures: @@ -190,7 +192,7 @@ def _parallel_boot_log_hrs(self, data, idx, boot_sample_idx): return boot_log_hrs -def _hazard_handler(self, data, idx, boot_idx, rng): +def _hazard_handler(self, data, val, boot_idx, rng): exclude_cols = [ "followup", f"followup{self.indicator_squared}", @@ -215,8 +217,10 @@ def _hazard_handler(self, data, idx, boot_idx, rng): ) ) - if idx is not None: - model_dict = self.outcome_model[boot_idx][idx] + if val is not None: + model_dict = self.outcome_model[boot_idx].get(val) + if model_dict is None: + return None else: model_dict = self.outcome_model[boot_idx] @@ -226,9 +230,13 @@ def _hazard_handler(self, data, idx, boot_idx, rng): ce_model = self._offloader.load_model(model_dict["compevent"]) all_treatments = [] - for val in self.treatment_level: + for treatment_val in self.treatment_level: tmp = trials.with_columns( - [pl.lit(val).alias(f"{self.treatment_col}{self.indicator_baseline}")] + [ + pl.lit(treatment_val).alias( + f"{self.treatment_col}{self.indicator_baseline}" + ) + ] ) tmp_pd = _cast_categories(self, tmp.to_pandas()) diff --git a/pySEQTarget/analysis/_subgroup_fit.py b/pySEQTarget/analysis/_subgroup_fit.py index e78e19d..9defdc1 100644 --- a/pySEQTarget/analysis/_subgroup_fit.py +++ b/pySEQTarget/analysis/_subgroup_fit.py @@ -1,13 +1,29 @@ +import warnings + import polars as pl from ._outcome_fit import _outcome_fit +def _warn_missing_subgroup(self, val): + """Warn when bootstrap replicates have no rows in subgroup ``val``.""" + n = sum(val not in models for models in self.outcome_model[1:]) + if n: + warnings.warn( + f"{n} bootstrap replicate(s) had no rows in {self.subgroup_colname} = " + f"{val}; they are left out of its confidence intervals.", + UserWarning, + stacklevel=3, + ) + + def _subgroup_fit(self, start_params=None): + # A resample can miss a subgroup, so key the models by subgroup value subgroups = sorted(self.DT[self.subgroup_colname].unique().to_list()) - self._unique_subgroups = subgroups + if getattr(self, "_current_boot_idx", None) is None: + self._unique_subgroups = subgroups - models_list = [] + models_by_group = {} for val in subgroups: subDT = self.DT.filter(pl.col(self.subgroup_colname) == val) sg_start = (start_params or {}).get(val, {}) or {} @@ -34,5 +50,5 @@ def _subgroup_fit(self, start_params=None): "weight", start_params=sg_start.get("compevent"), ) - models_list.append(models) - return models_list + models_by_group[val] = models + return models_by_group diff --git a/pySEQTarget/analysis/_survival_pred.py b/pySEQTarget/analysis/_survival_pred.py index 81cefa8..45adf12 100644 --- a/pySEQTarget/analysis/_survival_pred.py +++ b/pySEQTarget/analysis/_survival_pred.py @@ -6,6 +6,7 @@ _model_design_info) from ..helpers._predict_model import _safe_predict from ._outcome_fit import _cast_categories +from ._subgroup_fit import _warn_missing_subgroup def _store_boot_risks(obj, treatment_val, TxDT, boot_cols, is_survival=False): @@ -67,7 +68,7 @@ def _cached_predict(model, X_cached, ref_column_names, data): return _safe_predict(model, data) -def _get_outcome_predictions(self, TxDT, idx=None): +def _get_outcome_predictions(self, TxDT, val=None): data = _cast_categories(self, TxDT.to_pandas()) predictions = {"outcome": []} if self.compevent_colname is not None: @@ -77,7 +78,7 @@ def _get_outcome_predictions(self, TxDT, idx=None): # Each bootstrap model that shares the same column structure can then # reuse it, skipping patsy entirely on the predict path. main = self.outcome_model[0] - main_dict = main[idx] if idx is not None else main + main_dict = main[val] if val is not None else main main_outcome = self._offloader.load_model(main_dict["outcome"]) outcome_dinfo = _model_design_info(main_outcome) X_outcome = _build_design_matrix(outcome_dinfo, data) @@ -91,7 +92,9 @@ def _get_outcome_predictions(self, TxDT, idx=None): compevent_cols = list(compevent_dinfo.column_names) for boot_model in self.outcome_model: - model_dict = boot_model[idx] if idx is not None else boot_model + if val is not None and val not in boot_model: + continue + model_dict = boot_model[val] if val is not None else boot_model outcome_model = self._offloader.load_model(model_dict["outcome"]) predictions["outcome"].append( _cached_predict(outcome_model, X_outcome, outcome_cols, data) @@ -107,28 +110,27 @@ def _get_outcome_predictions(self, TxDT, idx=None): def _pred_risk(self): - has_subgroups = ( - isinstance(self.outcome_model[0], list) if self.outcome_model else False - ) + has_subgroups = self.subgroup_colname is not None and bool(self.outcome_model) self._boot_risks = {} if not has_subgroups: - return _calculate_risk(self, self.DT, idx=None, val=None) + return _calculate_risk(self, self.DT, val=None) all_risks = [] original_DT = self.DT - for i, val in enumerate(self._unique_subgroups): + for val in self._unique_subgroups: + _warn_missing_subgroup(self, val) subgroup_DT = original_DT.filter(pl.col(self.subgroup_colname) == val) - risk = _calculate_risk(self, subgroup_DT, i, val) + risk = _calculate_risk(self, subgroup_DT, val) all_risks.append(risk) self.DT = original_DT return pl.concat(all_risks) -def _calculate_risk(self, data, idx=None, val=None): +def _calculate_risk(self, data, val=None): a = 1 - self.bootstrap_CI lci = a / 2 uci = 1 - lci @@ -178,7 +180,7 @@ def _calculate_risk(self, data, idx=None, val=None): ] ) - preds = _get_outcome_predictions(self, TxDT, idx=idx) + preds = _get_outcome_predictions(self, TxDT, val=val) # Drop original data columns — only followup and TID needed from here TxDT = TxDT.select(["followup", "TID"]) diff --git a/tests/test_subgroup_bootstrap.py b/tests/test_subgroup_bootstrap.py new file mode 100644 index 0000000..69e8b00 --- /dev/null +++ b/tests/test_subgroup_bootstrap.py @@ -0,0 +1,41 @@ +"""Subgroup bootstrap models are matched by subgroup value, not position.""" + +from collections import Counter + +import polars as pl +import pytest + +from pySEQTarget import SEQopts, SEQuential +from pySEQTarget.data import load_data + + +@pytest.mark.parametrize("estimate", ["survival", "hazard"]) +def test_replicate_missing_a_subgroup_is_left_out_of_it(estimate): + data = load_data("SEQdata") + opts = dict(subgroup_colname="sex", bootstrap_nboot=3, seed=42) + opts["km_curves" if estimate == "survival" else "hazard_estimate"] = True + s = SEQuential( + data, + id_col="ID", + time_col="time", + eligible_col="eligible", + treatment_col="tx_init", + outcome_col="outcome", + time_varying_cols=["N", "L", "P"], + fixed_cols=["sex"], + method="ITT", + parameters=SEQopts(**opts), + ) + s.expand() + s.bootstrap() + # The last replicate resamples only sex == 1, so it has no sex == 0 rows + ids = data.filter(pl.col("sex") == 1)["ID"].unique().to_list() + s._boot_samples[-1] = Counter(ids) + s.fit() + + assert s._unique_subgroups == [0, 1] + assert set(s.outcome_model[-1]) == {1} + with pytest.warns(UserWarning, match="1 bootstrap replicate.*sex = 0"): + getattr(s, estimate)() + out = s.km_data if estimate == "survival" else s.hazard_ratio + assert set(out["sex"].unique()) == {0, 1} From 0ab81686843781b5376866cb49d682d906ac98c5 Mon Sep 17 00:00:00 2001 From: Tom Palmer Date: Mon, 12 Oct 2026 15:33:24 +0100 Subject: [PATCH 16/28] Count only trial-periods that can reach the window as eligible for end-of-follow-up --- pySEQTarget/analysis/_endoffup.py | 22 +++++++++++++++------- tests/test_end_of_fup.py | 24 ++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/pySEQTarget/analysis/_endoffup.py b/pySEQTarget/analysis/_endoffup.py index 2fdf095..f7e7ac7 100644 --- a/pySEQTarget/analysis/_endoffup.py +++ b/pySEQTarget/analysis/_endoffup.py @@ -85,18 +85,26 @@ def _eof_measure(self, DT): def _eof_period_flags(self, DT): - """One row per trial-period, flagged with what it has available.""" + """One row per trial-period that can reach the window, flagged with what it has.""" k = self.end_of_fup_time w = self.end_of_fup_window valid = pl.col(self.outcome_col).is_not_null() in_window = valid & (pl.col("followup") >= k - w) & (pl.col("followup") <= k + w) + last = DT["period"].max() - return DT.group_by([self.id_col, "trial"] + _eof_group_cols(self, DT)).agg( - [ - (valid & (pl.col("followup") == k)).any().alias("at_k"), - in_window.any().alias("in_window"), - valid.any().alias("measured"), - ] + return ( + DT.group_by([self.id_col, "trial"] + _eof_group_cols(self, DT)) + .agg( + [ + (pl.col("period") - pl.col("followup")).min().alias("_start"), + (valid & (pl.col("followup") == k)).any().alias("at_k"), + in_window.any().alias("in_window"), + valid.any().alias("measured"), + ] + ) + # Trial-periods starting too late to reach the window before the data end + .filter(pl.col("_start") + k - w <= last) + .drop("_start") ) diff --git a/tests/test_end_of_fup.py b/tests/test_end_of_fup.py index 10fd2d2..0c58a5c 100644 --- a/tests/test_end_of_fup.py +++ b/tests/test_end_of_fup.py @@ -435,3 +435,27 @@ def test_end_of_followup_requires_eof_mode_and_fit(): s.expand() with pytest.raises(ValueError, match="fit"): s.end_of_followup() + + +def test_trial_periods_that_cannot_reach_the_window_are_not_eligible(): + k, w = 12, 3 + s = _eof_run(end_of_fup=True, end_of_fup_time=k, end_of_fup_window=w) + starts = s.DT.group_by(["ID", "trial", "tx_init_bas"]).agg( + (pl.col("period") - pl.col("followup")).min().alias("start") + ) + reachable = ( + starts.filter(pl.col("start") + k - w <= s.DT["period"].max()) + .group_by("tx_init_bas") + .len() + .sort("tx_init_bas") + ) + eof = s.eof_data.sort("A") + assert eof["Trial-periods (Eligible)"].to_list() == reachable["len"].to_list() + assert reachable["len"].sum() < starts.height + # Analysed, censored and never measured still partition the eligible total + parts = ( + eof["Trial-periods (Analysed)"] + + eof["Trial-periods (Censored)"] + + eof["Trial-periods (No measurement)"] + ) + assert (parts == eof["Trial-periods (Eligible)"]).all() From 1c189fb2d7d3b2c56a51d0071b3886e7cb61873c Mon Sep 17 00:00:00 2001 From: Tom Palmer Date: Mon, 12 Oct 2026 15:38:05 +0100 Subject: [PATCH 17/28] Give an informative error naming any model term that is undefined for some rows --- pySEQTarget/analysis/_outcome_fit.py | 4 ++ pySEQTarget/helpers/_check_design.py | 25 ++++++++ pySEQTarget/helpers/_col_string.py | 13 ++-- pySEQTarget/helpers/_predict_model.py | 23 +++++-- pySEQTarget/weighting/_weight_fit.py | 8 +++ tests/test_undefined_terms.py | 86 +++++++++++++++++++++++++++ 6 files changed, 148 insertions(+), 11 deletions(-) create mode 100644 pySEQTarget/helpers/_check_design.py create mode 100644 tests/test_undefined_terms.py diff --git a/pySEQTarget/analysis/_outcome_fit.py b/pySEQTarget/analysis/_outcome_fit.py index 96102bb..4e7d1b3 100644 --- a/pySEQTarget/analysis/_outcome_fit.py +++ b/pySEQTarget/analysis/_outcome_fit.py @@ -1,11 +1,13 @@ import re +import numpy as np # noqa: F401 - formulas are evaluated here, e.g. np.log(x) import pandas as pd import polars as pl import statsmodels.api as sm import statsmodels.formula.api as smf from pandas.api.types import is_numeric_dtype +from ..helpers._check_design import _check_design from ..helpers._fix_categories import _cast_fixed_categories from ..helpers._spline import _compute_spline_knots, _cr_term @@ -106,6 +108,8 @@ def _outcome_fit( formula, self.indicator_squared, self._followup_spline_knots ) + if getattr(self, "_current_boot_idx", None) is None: + _check_design(formula, df_pd) full_formula = f"{outcome} ~ {formula}" var_weights = df_pd[weight_col] if weighted else None diff --git a/pySEQTarget/helpers/_check_design.py b/pySEQTarget/helpers/_check_design.py new file mode 100644 index 0000000..b26fbe7 --- /dev/null +++ b/pySEQTarget/helpers/_check_design.py @@ -0,0 +1,25 @@ +import numpy as np +import patsy + + +def _undefined_terms(formula, data): + """Design-matrix columns with missing or infinite values; ``formula`` may be a DesignInfo.""" + if isinstance(formula, str): + formula = formula.split("~", 1)[-1] + if formula.strip() in ("", "1"): + return [] + X = patsy.dmatrix( + formula, data, NA_action=patsy.NAAction(NA_types=[]), return_type="dataframe" + ) + return [col for col in X.columns if not np.isfinite(X[col]).all()] + + +def _check_design(formula, data): + """Raise, naming the terms, if a model's design matrix has missing or infinite values.""" + bad = _undefined_terms(formula, data) + if bad: + raise ValueError( + f"Model term(s) {', '.join(bad)} produced missing or infinite values, " + "e.g. log() or sqrt() of a non-positive value; transform the variable " + "so the term is defined for every row." + ) diff --git a/pySEQTarget/helpers/_col_string.py b/pySEQTarget/helpers/_col_string.py index 1f6c07c..5914033 100644 --- a/pySEQTarget/helpers/_col_string.py +++ b/pySEQTarget/helpers/_col_string.py @@ -9,11 +9,14 @@ def _term_columns(expression): except SyntaxError: return set(expression.replace("+", " ").replace("*", " ").split()) - called = { - node.func - for node in ast.walk(tree) - if isinstance(node, ast.Call) and isinstance(node.func, ast.Name) - } + called = set() + for node in ast.walk(tree): + if isinstance(node, ast.Call): + # The function, or the module it comes from, as in np.log(x) + func = node.func + while isinstance(func, ast.Attribute): + func = func.value + called.add(func) return { node.id for node in ast.walk(tree) diff --git a/pySEQTarget/helpers/_predict_model.py b/pySEQTarget/helpers/_predict_model.py index 4275fd9..29dd962 100644 --- a/pySEQTarget/helpers/_predict_model.py +++ b/pySEQTarget/helpers/_predict_model.py @@ -1,7 +1,16 @@ import numpy as np +from ._check_design import _check_design from ._fix_categories import (_cast_fixed_categories, - _fix_categories_for_predict) + _fix_categories_for_predict, _model_design_info) + + +def _check_predictions(model, data, probs): + """If predictions are NaN because a model term is undefined, say which.""" + if np.any(np.isnan(probs)): + design_info = _model_design_info(model) + if design_info is not None: + _check_design(design_info, data) def _safe_predict(model, data, clip_probs=True): @@ -30,6 +39,7 @@ def _safe_predict(model, data, clip_probs=True): if clip_probs: probs = np.array(probs) + _check_predictions(model, data, probs) if np.any(np.isnan(probs)): raise ValueError( "NaN values in predicted probabilities. This typically indicates " @@ -55,13 +65,14 @@ def _prep_predict_frame(self, newdata): def _predict_model_pd(model, newdata): """Predict on an already-prepared pandas frame, with category fix retry.""" try: - return np.array(model.predict(newdata)) + probs = np.array(model.predict(newdata)) except Exception as e: - if "mismatching levels" in str(e): - newdata = _fix_categories_for_predict(model, newdata) - return np.array(model.predict(newdata)) - else: + if "mismatching levels" not in str(e): raise + newdata = _fix_categories_for_predict(model, newdata) + probs = np.array(model.predict(newdata)) + _check_predictions(model, newdata, probs) + return probs def _predict_model(self, model, newdata): diff --git a/pySEQTarget/weighting/_weight_fit.py b/pySEQTarget/weighting/_weight_fit.py index 4043d40..a198f99 100644 --- a/pySEQTarget/weighting/_weight_fit.py +++ b/pySEQTarget/weighting/_weight_fit.py @@ -1,7 +1,9 @@ +import numpy as np # noqa: F401 - formulas are evaluated here, e.g. np.log(x) import statsmodels.api as sm import statsmodels.formula.api as smf from ..error._check_separation import _check_separation +from ..helpers._check_design import _check_design from ..helpers._glum_fit import _fit_glum @@ -59,6 +61,8 @@ def _fit_pair( setattr(self, out, None) continue formula = f"{outcome}~{rhs}" + if getattr(self, "_current_boot_idx", None) is None: + _check_design(formula, WDT) if getattr(self, "glm_package", "statsmodels") == "glum": fitted = _fit_glum(formula, WDT) else: @@ -114,6 +118,8 @@ def _fit_numerator(self, WDT): if len(DT_subset[predictor].unique()) < 2: fits.append(None) continue + if getattr(self, "_current_boot_idx", None) is None: + _check_design(formula, DT_subset) # Use logit for binary 0/1 censoring, mnlogit otherwise if is_binary and getattr(self, "glm_package", "statsmodels") == "glum": model_fit = _fit_glum(formula, DT_subset) @@ -157,6 +163,8 @@ def _fit_denominator(self, WDT): if len(DT_subset[predictor].unique()) < 2: fits.append(None) continue + if getattr(self, "_current_boot_idx", None) is None: + _check_design(formula, DT_subset) # Use logit for binary 0/1 censoring, mnlogit otherwise if is_binary and getattr(self, "glm_package", "statsmodels") == "glum": model_fit = _fit_glum(formula, DT_subset) diff --git a/tests/test_undefined_terms.py b/tests/test_undefined_terms.py new file mode 100644 index 0000000..df72f10 --- /dev/null +++ b/tests/test_undefined_terms.py @@ -0,0 +1,86 @@ +"""Transformed terms such as np.log(x), and terms undefined for some rows.""" + +import polars as pl +import pytest + +from pySEQTarget import SEQopts, SEQuential +from pySEQTarget.data import load_data +from pySEQTarget.helpers._col_string import _col_string + +UNDEFINED = r"Model term\(s\) np.log\(x\) produced missing or infinite values" + + +def _data(): + # x is positive for N above its median and negative otherwise + return ( + load_data("SEQdata") + .with_columns( + (pl.col("N") > pl.col("N").median()).cast(pl.Int8).alias("welig"), + (pl.col("N") - pl.col("N").min() + 1).alias("pos"), + ) + .with_columns( + pl.when(pl.col("welig") == 1).then(pl.col("pos")).otherwise(-1.0).alias("x") + ) + ) + + +def _model(**opts): + s = SEQuential( + _data(), + id_col="ID", + time_col="time", + eligible_col="eligible", + treatment_col="tx_init", + outcome_col="outcome", + time_varying_cols=["x", "pos", "N", "L", "P"], + fixed_cols=["sex"], + method="censoring", + parameters=SEQopts(**opts), + ) + s.expand() + return s + + +def _weights(term, **opts): + return dict( + weighted=True, + weight_preexpansion=False, + numerator=f"sex+followup+trial+{term}", + denominator=f"sex+N+L+P+followup+trial+{term}", + **opts, + ) + + +def test_column_reader_skips_the_module_in_a_call(): + assert _col_string(["followup+np.log(pos)+np.sqrt(N)"]) == {"followup", "pos", "N"} + + +@pytest.mark.filterwarnings("ignore") +def test_log_terms_fit_end_to_end(): + s = _model(covariates="tx_init_bas+followup+np.log(pos)", km_curves=True) + s.fit() + s.survival() + assert "np.log(pos)" in s.outcome_model[0]["outcome"].params.index + s = _model(**_weights("np.log(pos)")) + s.fit() + assert "np.log(pos)" in s.denominator_model[0].params.index + + +def test_undefined_outcome_term_is_named(): + s = _model(covariates="tx_init_bas+followup+np.log(x)") + with pytest.raises(ValueError, match=UNDEFINED): + s.fit() + + +def test_undefined_weight_term_is_named(): + s = _model(**_weights("np.log(x)")) + with pytest.raises(ValueError, match=UNDEFINED): + s.fit() + + +@pytest.mark.filterwarnings("ignore") +def test_term_undefined_only_where_predicted_is_named(): + # Fitted on eligible rows, where x > 0, but predicted on every row + s = _model(**_weights("np.log(x)", weight_eligible_colnames=["welig", "welig"])) + with pytest.raises(ValueError, match=UNDEFINED): + s.fit() From c57b8d49c9f5861ea33cc21030e462c96925a081 Mon Sep 17 00:00:00 2001 From: Tom Palmer Date: Mon, 12 Oct 2026 15:57:27 +0100 Subject: [PATCH 18/28] Bake the spline centring constraint and check transform state before reusing designs --- pySEQTarget/analysis/_survival_pred.py | 45 ++++++++++++---- pySEQTarget/helpers/_spline.py | 14 ++++- tests/test_stateful_transforms.py | 74 ++++++++++++++++++++++++++ tests/test_weight_spline.py | 4 +- 4 files changed, 122 insertions(+), 15 deletions(-) create mode 100644 tests/test_stateful_transforms.py diff --git a/pySEQTarget/analysis/_survival_pred.py b/pySEQTarget/analysis/_survival_pred.py index 45adf12..2d41db1 100644 --- a/pySEQTarget/analysis/_survival_pred.py +++ b/pySEQTarget/analysis/_survival_pred.py @@ -53,15 +53,40 @@ class data: return np.asarray(dmatrix(design_info, fixed)) -def _cached_predict(model, X_cached, ref_column_names, data): +def _same_state(a, b): + """Deep equality of memorised transform state (dicts, arrays, objects).""" + if isinstance(a, dict): + return ( + isinstance(b, dict) + and a.keys() == b.keys() + and all(_same_state(a[k], b[k]) for k in a) + ) + if isinstance(a, np.ndarray) or isinstance(b, np.ndarray): + return isinstance(a, np.ndarray) and np.array_equal(a, b) + if hasattr(a, "__dict__"): + return type(a) is type(b) and _same_state(vars(a), vars(b)) + return a == b + + +def _transform_state(design_info): + """What stateful transforms such as center() or cr() memorised at fit.""" + return { + f.name(): fi.state.get("transforms", {}) + for f, fi in design_info.factor_infos.items() + if isinstance(fi.state, dict) + } + + +def _cached_predict(model, X_cached, ref_dinfo, data): """ - Predict using a pre-built design matrix when the model's design_info - column structure matches the reference, falling back to patsy via - _safe_predict on mismatch (e.g. a bootstrap resample that dropped a - categorical level). + Predict using a pre-built design matrix when the model's design matches the + reference — same columns and same memorised transform state — falling back + to patsy via _safe_predict otherwise (e.g. a resample that dropped a level). """ dinfo = _model_design_info(model) - if list(dinfo.column_names) == ref_column_names: + if list(dinfo.column_names) == list(ref_dinfo.column_names) and _same_state( + _transform_state(dinfo), _transform_state(ref_dinfo) + ): probs = np.asarray(model.predict(X_cached, transform=False)) if not np.any(np.isnan(probs)): return np.clip(probs, 0, 1) @@ -82,14 +107,12 @@ def _get_outcome_predictions(self, TxDT, val=None): main_outcome = self._offloader.load_model(main_dict["outcome"]) outcome_dinfo = _model_design_info(main_outcome) X_outcome = _build_design_matrix(outcome_dinfo, data) - outcome_cols = list(outcome_dinfo.column_names) - X_compevent = compevent_cols = None + X_compevent = compevent_dinfo = None if self.compevent_colname is not None: main_compevent = self._offloader.load_model(main_dict["compevent"]) compevent_dinfo = _model_design_info(main_compevent) X_compevent = _build_design_matrix(compevent_dinfo, data) - compevent_cols = list(compevent_dinfo.column_names) for boot_model in self.outcome_model: if val is not None and val not in boot_model: @@ -97,13 +120,13 @@ def _get_outcome_predictions(self, TxDT, val=None): model_dict = boot_model[val] if val is not None else boot_model outcome_model = self._offloader.load_model(model_dict["outcome"]) predictions["outcome"].append( - _cached_predict(outcome_model, X_outcome, outcome_cols, data) + _cached_predict(outcome_model, X_outcome, outcome_dinfo, data) ) if self.compevent_colname is not None: compevent_model = self._offloader.load_model(model_dict["compevent"]) predictions["compevent"].append( - _cached_predict(compevent_model, X_compevent, compevent_cols, data) + _cached_predict(compevent_model, X_compevent, compevent_dinfo, data) ) return predictions diff --git a/pySEQTarget/helpers/_spline.py b/pySEQTarget/helpers/_spline.py index 2333e2e..d0a48c0 100644 --- a/pySEQTarget/helpers/_spline.py +++ b/pySEQTarget/helpers/_spline.py @@ -1,6 +1,7 @@ import re import numpy as np +import patsy # The only cr() form whose basis depends on the rows, so the only one to bake. _CR_DF = re.compile( @@ -27,8 +28,10 @@ def _compute_spline_knots(arr, df=3): def _cr_term(var, inner_knots, lower, upper, constraints=None): - """A ``cr()`` term with its knots written out.""" - constraint = f', constraints="{constraints}"' if constraints else "" + """A ``cr()`` term with its knots, and any linear constraint, written out.""" + constraint = ( + f", constraints=[{list(constraints)}]" if constraints is not None else "" + ) return ( f"cr({var}, knots={list(inner_knots)}, " f"lower_bound={lower}, upper_bound={upper}{constraint})" @@ -79,6 +82,13 @@ def _bake_spline_knots(formula, data): f"{len(inner_knots)} interior knot(s) for cr(df={df}); use a " "smaller df, or model this term without a spline." ) + if constraints: + # patsy's centring constraint (the basis column means) also depends + # on the rows it sees, so fix it from the full data too + basis = patsy.dmatrix( + _cr_term("x", inner_knots, lower, upper) + "-1", {"x": arr} + ) + constraints = np.asarray(basis).mean(axis=0).tolist() formula = formula.replace( token, _cr_term(var, inner_knots, lower, upper, constraints) ) diff --git a/tests/test_stateful_transforms.py b/tests/test_stateful_transforms.py new file mode 100644 index 0000000..e3589e3 --- /dev/null +++ b/tests/test_stateful_transforms.py @@ -0,0 +1,74 @@ +"""Terms that remember their fitting data, e.g. centred splines or center(x).""" + +import numpy as np +import pytest + +import pySEQTarget.analysis._survival_pred as survival_pred +from pySEQTarget import SEQopts, SEQuential +from pySEQTarget.data import load_data + + +def _model(**opts): + s = SEQuential( + load_data("SEQdata"), + id_col="ID", + time_col="time", + eligible_col="eligible", + treatment_col="tx_init", + outcome_col="outcome", + time_varying_cols=["N", "L", "P"], + fixed_cols=["sex"], + method="censoring", + parameters=SEQopts(seed=42, **opts), + ) + s.expand() + if s.bootstrap_nboot: + s.bootstrap() + s.fit() + return s + + +def _weights(s): + return s.DT.sort(["ID", "trial", "followup"])["weight"].to_numpy() + + +@pytest.mark.filterwarnings("ignore") +def test_glum_weight_spline_survives_offloading(tmp_path): + # Unpickled glum models rebuild their design from two rows, so the + # centring constraint must be baked into the formula, not memorised + opts = dict( + weighted=True, + weight_preexpansion=False, + weight_spline=True, + glm_package="glum", + offload_dir=str(tmp_path), + ) + in_memory = _weights(_model(**opts)) + offloaded = _weights(_model(offload=True, **opts)) + assert np.allclose(in_memory, offloaded) + + +@pytest.mark.filterwarnings("ignore") +@pytest.mark.parametrize("term", ["center(N_bas)", "standardize(L_bas)"]) +def test_bootstrap_survival_uses_each_replicates_own_transform(term, monkeypatch): + opts = dict( + covariates=f"tx_init_bas+followup+trial+{term}", + km_curves=True, + bootstrap_nboot=2, + ) + + def km(s): + s.survival() + return s.km_data.sort(["estimate", "tx_init", "followup"])[ + ["pred", "LCI", "UCI"] + ].to_numpy() + + cached = km(_model(**opts)) + # Without the cached design matrix every model builds its own + monkeypatch.setattr( + survival_pred, + "_cached_predict", + lambda model, X, ref, data: survival_pred._safe_predict(model, data), + ) + uncached = km(_model(**opts)) + assert np.allclose(cached, uncached, equal_nan=True) diff --git a/tests/test_weight_spline.py b/tests/test_weight_spline.py index 61c1996..ba7976a 100644 --- a/tests/test_weight_spline.py +++ b/tests/test_weight_spline.py @@ -28,7 +28,7 @@ ] BAKED_PLAIN = r"cr\({var}, knots=\[[^]]*\], lower_bound=[-\d.]+, upper_bound=[-\d.]+" -BAKED = BAKED_PLAIN + r', constraints="center"\)' +BAKED = BAKED_PLAIN + r", constraints=\[\[[^]]*\]\]\)" def _model(**opts): @@ -264,7 +264,7 @@ def test_weight_spline_fits_on_either_glm_backend(glm_package): # The basis is centred, which keeps it full rank alongside the model # intercept — glum's solver, unlike statsmodels' pinv, needs that s = _model(weight_preexpansion=False, weight_spline=True, glm_package=glm_package) - assert 'constraints="center"' in s.denominator + assert "constraints=[[" in s.denominator assert s.DT["weight"].to_numpy().min() > 0 From 5eadb029d397faa24a0652ab406f5edcefa9d069 Mon Sep 17 00:00:00 2001 From: Tom Palmer Date: Mon, 12 Oct 2026 16:00:08 +0100 Subject: [PATCH 19/28] Keep followup interactions working with followup_spline --- pySEQTarget/analysis/_outcome_fit.py | 8 ++++++-- tests/test_followup_options.py | 29 ++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/pySEQTarget/analysis/_outcome_fit.py b/pySEQTarget/analysis/_outcome_fit.py index 4e7d1b3..c068e94 100644 --- a/pySEQTarget/analysis/_outcome_fit.py +++ b/pySEQTarget/analysis/_outcome_fit.py @@ -16,14 +16,18 @@ def _apply_spline_formula(formula, indicator_squared, spline_knots): inner_knots, lower, upper = spline_knots spline = _cr_term("followup", inner_knots, lower, upper) - formula = re.sub(r"(\w+)\s*\*\s*followup\b", rf"\1*{spline}", formula) - formula = re.sub(r"\bfollowup\s*\*\s*(\w+)", rf"{spline}*\1", formula) + # Mark interactions first, so dropping the bare followup terms below + # cannot reach into the spline, which contains "followup" itself + mark = "_SPLINE_" + formula = re.sub(r"(\w+)\s*\*\s*followup\b", rf"\1*{mark}", formula) + formula = re.sub(r"\bfollowup\s*\*\s*(\w+)", rf"{mark}*\1", formula) formula = re.sub(rf"\bfollowup{re.escape(indicator_squared)}\b", "", formula) formula = re.sub(r"\bfollowup\b", "", formula) formula = re.sub(r"\s+", " ", formula) formula = re.sub(r"\+\s*\+", "+", formula) formula = re.sub(r"^\s*\+\s*|\s*\+\s*$", "", formula).strip() + formula = formula.replace(mark, spline) if formula: return f"{formula} + {spline}" diff --git a/tests/test_followup_options.py b/tests/test_followup_options.py index 07125ea..c33ecc5 100644 --- a/tests/test_followup_options.py +++ b/tests/test_followup_options.py @@ -113,3 +113,32 @@ def test_no_followup(): 0.20398559747503964, ] assert [round(x, 3) for x in matrix] == [round(x, 3) for x in expected] + + +@pytest.mark.filterwarnings( + "ignore::statsmodels.tools.sm_exceptions.SingularMatrixWarning" +) +@pytest.mark.parametrize("method", ["ITT", "dose-response"]) +def test_followup_spline_with_km_curves_interactions(method): + # km_curves adds treatment- or dose-by-followup interactions, which must + # interact with the spline rather than lose its variable + s = SEQuential( + load_data("SEQdata"), + id_col="ID", + time_col="time", + eligible_col="eligible", + treatment_col="tx_init", + outcome_col="outcome", + time_varying_cols=["N", "L", "P"], + fixed_cols=["sex"], + method=method, + parameters=SEQopts( + followup_spline=True, followup_include=False, km_curves=True + ), + ) + s.expand() + s.fit() + s.survival() + names = s.outcome_model[0]["outcome"].params.index + assert any("cr(followup" in n and ":" in n for n in names) + assert s.km_data.height > 0 From 4e51500d90c59bf2b5b5102764658c0f8875b4c7 Mon Sep 17 00:00:00 2001 From: Tom Palmer Date: Tue, 13 Oct 2026 09:52:52 +0100 Subject: [PATCH 20/28] Silence numpy warnings in the undefined-term check --- pySEQTarget/helpers/_check_design.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/pySEQTarget/helpers/_check_design.py b/pySEQTarget/helpers/_check_design.py index b26fbe7..af6f8ca 100644 --- a/pySEQTarget/helpers/_check_design.py +++ b/pySEQTarget/helpers/_check_design.py @@ -8,9 +8,14 @@ def _undefined_terms(formula, data): formula = formula.split("~", 1)[-1] if formula.strip() in ("", "1"): return [] - X = patsy.dmatrix( - formula, data, NA_action=patsy.NAAction(NA_types=[]), return_type="dataframe" - ) + # Invalid values are what we are looking for, so don't warn about them + with np.errstate(divide="ignore", invalid="ignore", over="ignore"): + X = patsy.dmatrix( + formula, + data, + NA_action=patsy.NAAction(NA_types=[]), + return_type="dataframe", + ) return [col for col in X.columns if not np.isfinite(X[col]).all()] From fce4b65a9c0c296bff0ee0f4d5fa61aa27c7d8e0 Mon Sep 17 00:00:00 2001 From: Tom Palmer Date: Tue, 13 Oct 2026 09:59:05 +0100 Subject: [PATCH 21/28] Collect and report subgroup outcome models by subgroup --- pySEQTarget/SEQoutput.py | 42 ++++++++++++++++++---------- pySEQTarget/SEQuential.py | 14 ++++++++-- pySEQTarget/helpers/_output_files.py | 24 ++++++++++------ tests/test_output_files.py | 30 ++++++++++++++++++++ 4 files changed, 85 insertions(+), 25 deletions(-) diff --git a/pySEQTarget/SEQoutput.py b/pySEQTarget/SEQoutput.py index 1d8ab5a..342c580 100644 --- a/pySEQTarget/SEQoutput.py +++ b/pySEQTarget/SEQoutput.py @@ -1,7 +1,7 @@ import tempfile from dataclasses import dataclass from pathlib import Path -from typing import List, Literal, Optional +from typing import Any, Dict, List, Literal, Optional, Union import matplotlib.figure import matplotlib.pyplot as plt @@ -25,8 +25,12 @@ class SEQoutput: :type numerator_models: List[ResultsWrapper] or None :param denominator_models: Denominator models, if applicable, from the weighting process :type denominator_models: List[ResultsWrapper] or None - :param compevent_models: Competing event models, if applicable - :type compevent_models: List[ResultsWrapper] or None + :param outcome_models: Outcome models, one per bootstrap replicate with the + main fit first; for subgroup analyses, a dict of such lists keyed by subgroup + :type outcome_models: List[ResultsWrapper], Dict[Any, List[ResultsWrapper]] or None + :param compevent_models: Competing event models, if applicable, in the same form + as ``outcome_models`` + :type compevent_models: List[ResultsWrapper], Dict[Any, List[ResultsWrapper]] or None :param weight_statistics: Weight statistics once returned back to the expanded dataset :type weight_statistics: dict or None :param hazard: Hazard ratio if applicable @@ -67,8 +71,10 @@ class SEQoutput: method: str = None numerator_models: List[ResultsWrapper] = None denominator_models: List[ResultsWrapper] = None - outcome_models: List[List[ResultsWrapper]] = None - compevent_models: List[List[ResultsWrapper]] = None + outcome_models: Union[List[ResultsWrapper], Dict[Any, List[ResultsWrapper]]] = None + compevent_models: Union[List[ResultsWrapper], Dict[Any, List[ResultsWrapper]]] = ( + None + ) weight_statistics: pl.DataFrame = None hazard: pl.DataFrame = None km_data: pl.DataFrame = None @@ -96,9 +102,10 @@ def summary( type: Optional[ Literal["numerator", "denominator", "outcome", "compevent"] ] = None, - ) -> List: + ) -> Union[List, Dict[Any, List]]: """ - Returns a list of model summaries of either the numerator, denominator, outcome, or competing event models + Returns a list of model summaries of either the numerator, denominator, outcome, or competing event models. + For subgroup analyses, outcome and competing event summaries are a dict of lists keyed by subgroup. :param type: Indicator for which model list you would like returned :type type: str @@ -121,14 +128,19 @@ def summary( if self.options is not None and self.options.offload: loader = Offloader(enabled=True, dir=self.options.offload_dir) - summaries = [] - for model in models: - if model is None: - continue - if loader is not None: - model = loader.load_model(model) - summaries.append(model.summary()) - return summaries + def summarise(group): + summaries = [] + for model in group: + if model is None: + continue + if loader is not None: + model = loader.load_model(model) + summaries.append(model.summary()) + return summaries + + if isinstance(models, dict): + return {val: summarise(group) for val, group in models.items()} + return summarise(models) def retrieve_data( self, diff --git a/pySEQTarget/SEQuential.py b/pySEQTarget/SEQuential.py index 8163cef..f2f578b 100644 --- a/pySEQTarget/SEQuential.py +++ b/pySEQTarget/SEQuential.py @@ -31,6 +31,16 @@ _DEFAULT_SEED = 0 +def _collect_models(self, kind): + """One model per replicate, main fit first; keyed by subgroup for subgroup analyses.""" + if self.subgroup_colname is None: + return [models[kind] for models in self.outcome_model] + return { + val: [models[val][kind] for models in self.outcome_model if val in models] + for val in self._unique_subgroups + } + + class SEQuential: """ Primary class initializer for SEQuential target trial emulation @@ -558,9 +568,9 @@ def collect(self) -> SEQoutput: outcome_models = None compevent_models = None elif self.outcome_model is not None: - outcome_models = [model["outcome"] for model in self.outcome_model] + outcome_models = _collect_models(self, "outcome") if self.compevent_colname is not None: - compevent_models = [model["compevent"] for model in self.outcome_model] + compevent_models = _collect_models(self, "compevent") else: compevent_models = None else: diff --git a/pySEQTarget/helpers/_output_files.py b/pySEQTarget/helpers/_output_files.py index 8c85164..91ddaba 100644 --- a/pySEQTarget/helpers/_output_files.py +++ b/pySEQTarget/helpers/_output_files.py @@ -16,14 +16,22 @@ def _model_section(title, kind): # SEQoutput.summary handles absent model lists (e.g. no numerator # models under weighted ITT) and loads offloaded path refs. summaries = self.summary(kind) - if not summaries: - return - lines.append(f"### {title}") - lines.append("") - lines.append("```") - lines.append(str(summaries[0])) - lines.append("```") - lines.append("") + if isinstance(summaries, dict): + groups = summaries.items() + else: + groups = [(None, summaries)] + for val, group in groups: + if not group: + continue + label = title + if val is not None: + label = f"{title} ({self.options.subgroup_colname} = {val})" + lines.append(f"### {label}") + lines.append("") + lines.append("```") + lines.append(str(group[0])) + lines.append("```") + lines.append("") lines.append(f"# SEQuential Analysis: {datetime.date.today()}: {self.method}") lines.append("") diff --git a/tests/test_output_files.py b/tests/test_output_files.py index 8ff47ac..edea603 100644 --- a/tests/test_output_files.py +++ b/tests/test_output_files.py @@ -69,3 +69,33 @@ def test_to_md_with_offloaded_models(tmp_path): assert "Numerator Model" in content assert "Denominator Model" in content assert "Outcome Model" in content + + +def test_subgroup_models_are_collected_and_reported_by_subgroup(tmp_path): + s = SEQuential( + load_data("SEQdata"), + id_col="ID", + time_col="time", + eligible_col="eligible", + treatment_col="tx_init", + outcome_col="outcome", + time_varying_cols=["N", "L", "P"], + fixed_cols=["sex"], + method="ITT", + parameters=SEQopts(subgroup_colname="sex", bootstrap_nboot=2, seed=42), + ) + s.expand() + s.bootstrap() + s.fit() + out = s.collect() + + # Per subgroup: the main fit, then one model per replicate + assert set(out.outcome_models) == {0, 1} + assert all(len(models) == 3 for models in out.outcome_models.values()) + assert set(out.summary("outcome")) == {0, 1} + + md_file = tmp_path / "report.md" + out.to_md(str(md_file)) + content = md_file.read_text() + assert "Outcome Model (sex = 0)" in content + assert "Outcome Model (sex = 1)" in content From 399c6cb75adf6522f4c50549f7a450eb51033e0e Mon Sep 17 00:00:00 2001 From: Tom Palmer Date: Tue, 13 Oct 2026 10:18:15 +0100 Subject: [PATCH 22/28] Update end_of_followup.md --- docs/vignettes/end_of_followup.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/vignettes/end_of_followup.md b/docs/vignettes/end_of_followup.md index b25b977..97af634 100644 --- a/docs/vignettes/end_of_followup.md +++ b/docs/vignettes/end_of_followup.md @@ -51,8 +51,8 @@ model.eof_data.select(["A", "Proportion", "SE", "95% LCI", "95% UCI", ┌─────┬────────────┬──────────┬──────────┬──────────┬────────────┬──────────┐ │ A ┆ Proportion ┆ SE ┆ 95% LCI ┆ 95% UCI ┆ % Censored ┆ Subjects │ ╞═════╪════════════╪══════════╪══════════╪══════════╪════════════╪══════════╡ -│ 0 ┆ 0.019865 ┆ 0.003014 ┆ 0.013956 ┆ 0.025773 ┆ 19.687712 ┆ 266 │ -│ 1 ┆ 0.027256 ┆ 0.002342 ┆ 0.022666 ┆ 0.031847 ┆ 28.46412 ┆ 236 │ +│ 0 ┆ 0.019865 ┆ 0.003014 ┆ 0.013956 ┆ 0.025773 ┆ 17.098809 ┆ 266 │ +│ 1 ┆ 0.027256 ┆ 0.002342 ┆ 0.022666 ┆ 0.031847 ┆ 24.81102 ┆ 236 │ └─────┴────────────┴──────────┴──────────┴──────────┴────────────┴──────────┘ ``` @@ -108,8 +108,8 @@ windowed.eof_data.select(["A", "Proportion", "95% LCI", "95% UCI", │ A ┆ Proportion ┆ 95% LCI ┆ 95% UCI ┆ Trial-period ┆ Trial-period ┆ Trial-period ┆ % Censored │ │ ┆ ┆ ┆ ┆ s (Eligible) ┆ s (Analysed) ┆ s (Censored) ┆ │ ╞═════╪════════════╪══════════╪══════════╪══════════════╪══════════════╪══════════════╪════════════╡ -│ 0 ┆ 0.075704 ┆ 0.058602 ┆ 0.092805 ┆ 2946 ┆ 2523 ┆ 423 ┆ 14.358452 │ -│ 1 ┆ 0.102475 ┆ 0.0864 ┆ 0.11855 ┆ 6257 ┆ 4889 ┆ 1368 ┆ 21.863513 │ +│ 0 ┆ 0.075704 ┆ 0.058602 ┆ 0.092805 ┆ 2894 ┆ 2523 ┆ 371 ┆ 12.819627 │ +│ 1 ┆ 0.102475 ┆ 0.0864 ┆ 0.11855 ┆ 6073 ┆ 4889 ┆ 1184 ┆ 19.49613 │ └─────┴────────────┴──────────┴──────────┴──────────────┴──────────────┴──────────────┴────────────┘ ``` @@ -150,8 +150,8 @@ windowed.diagnostics["nonunique_eof"] │ tx_init_bas ┆ Eligible ┆ At k ┆ In window ┆ Excluded (outside ┆ Excluded (no measurement) │ │ ┆ ┆ ┆ ┆ window) ┆ │ ╞═════════════╪══════════╪══════╪═══════════╪═══════════════════╪═══════════════════════════╡ -│ 0 ┆ 2946 ┆ 2366 ┆ 157 ┆ 423 ┆ 0 │ -│ 1 ┆ 6257 ┆ 4476 ┆ 413 ┆ 1368 ┆ 0 │ +│ 0 ┆ 2894 ┆ 2366 ┆ 157 ┆ 371 ┆ 0 │ +│ 1 ┆ 6073 ┆ 4476 ┆ 413 ┆ 1184 ┆ 0 │ └─────────────┴──────────┴──────┴───────────┴───────────────────┴───────────────────────────┘ ``` @@ -272,8 +272,8 @@ perprotocol.eof_data.select(["A", "Proportion", "95% LCI", "95% UCI", ┌─────┬────────────┬──────────┬──────────┬────────────┬──────────┐ │ A ┆ Proportion ┆ 95% LCI ┆ 95% UCI ┆ % Censored ┆ Subjects │ ╞═════╪════════════╪══════════╪══════════╪════════════╪══════════╡ -│ 0 ┆ 0.045069 ┆ 0.011689 ┆ 0.07845 ┆ 82.959946 ┆ 86 │ -│ 1 ┆ 0.088733 ┆ 0.065572 ┆ 0.111894 ┆ 49.592456 ┆ 211 │ +│ 0 ┆ 0.043282 ┆ 0.012381 ┆ 0.074182 ┆ 82.653766 ┆ 86 │ +│ 1 ┆ 0.088984 ┆ 0.065753 ┆ 0.112215 ┆ 48.065207 ┆ 211 │ └─────┴────────────┴──────────┴──────────┴────────────┴──────────┘ ``` From d326bed308712ab975619136ef07c953deb6c00d Mon Sep 17 00:00:00 2001 From: Tom Palmer Date: Tue, 13 Oct 2026 10:35:50 +0100 Subject: [PATCH 23/28] Use the probability of remaining under follow-up in the LTFU censoring weights --- pySEQTarget/weighting/_weight_pred.py | 5 ++-- tests/test_cense_weights.py | 34 +++++++++++++++++++++++ tests/test_coefficients.py | 40 +++++++++++++-------------- 3 files changed, 57 insertions(+), 22 deletions(-) create mode 100644 tests/test_cense_weights.py diff --git a/pySEQTarget/weighting/_weight_pred.py b/pySEQTarget/weighting/_weight_pred.py index e38c40d..c6310f4 100644 --- a/pySEQTarget/weighting/_weight_pred.py +++ b/pySEQTarget/weighting/_weight_pred.py @@ -157,8 +157,9 @@ def _weight_predict(self, WDT): cense_denom_model = self._offloader.load_model(self.cense_denominator_model) if cense_num_model is not None and cense_denom_model is not None: WDT_pd = _prep_predict_frame(self, WDT) - p_num = _predict_model_pd(cense_num_model, WDT_pd).flatten() - p_denom = _predict_model_pd(cense_denom_model, WDT_pd).flatten() + # The models predict P(lost); the weight uses P(remaining), as in R + p_num = 1.0 - _predict_model_pd(cense_num_model, WDT_pd).flatten() + p_denom = 1.0 - _predict_model_pd(cense_denom_model, WDT_pd).flatten() WDT = ( WDT.with_columns( [ diff --git a/tests/test_cense_weights.py b/tests/test_cense_weights.py new file mode 100644 index 0000000..1e21128 --- /dev/null +++ b/tests/test_cense_weights.py @@ -0,0 +1,34 @@ +"""Censoring weights use the probability of remaining under follow-up.""" + +import numpy as np +import pytest + +from pySEQTarget import SEQopts, SEQuential +from pySEQTarget.data import load_data +from pySEQTarget.helpers._predict_model import _predict_model + + +@pytest.mark.filterwarnings("ignore") +def test_ltfu_weight_is_the_ratio_of_probabilities_of_remaining(): + s = SEQuential( + load_data("SEQdata_LTFU"), + id_col="ID", + time_col="time", + eligible_col="eligible", + treatment_col="tx_init", + outcome_col="outcome", + time_varying_cols=["N", "L", "P"], + fixed_cols=["sex"], + method="ITT", + parameters=SEQopts( + weighted=True, weight_preexpansion=False, cense_colname="LTFU" + ), + ) + s.expand() + s.fit() + # Under ITT the treatment weights are 1, so each weight is the LTFU factor + rows = s.DT.filter(s.DT["followup"] > 0).head(500) + lost_num = _predict_model(s, s.cense_numerator_model, rows) + lost_den = _predict_model(s, s.cense_denominator_model, rows) + expected = (1 - lost_num) / (1 - lost_den) + assert np.allclose(rows["weight"].to_numpy(), expected) diff --git a/tests/test_coefficients.py b/tests/test_coefficients.py index 1714840..2da644f 100644 --- a/tests/test_coefficients.py +++ b/tests/test_coefficients.py @@ -261,16 +261,16 @@ def test_PreE_LTFU_ITT(): s.fit() matrix = s.outcome_model[0]["outcome"].summary2().tables[1]["Coef."].to_list() expected = [ - -21.636346991788276, - 0.06813705852786496, - 0.02874152772603635, - -0.0005734047013500563, - 0.2854740212699898, - -0.0013729662310668182, - -0.1939555961858531, - 0.006501915963316852, - -0.4467079969655381, - 1.3870473474960576, + -21.640562053561073, + 0.06852515972631311, + 0.028751019561197418, + -0.0005762181500554517, + 0.2855438174370584, + -0.0013730471122256052, + -0.19004771044056396, + 0.006589451846069475, + -0.44899973509857344, + 1.3875130951733505, ] assert matrix == approx(expected, rel=1e-3) @@ -296,16 +296,16 @@ def test_PostE_LTFU_ITT(): s.fit() matrix = s.outcome_model[0]["outcome"].summary2().tables[1]["Coef."].to_list() expected = [ - -21.847198431385877, - 0.07786703138967718, - 0.030140057462437704, - -0.0006287338029348562, - 0.287393206037481, - -0.0013719595115633126, - -0.15461370944416225, - 0.007295485861066434, - -0.42797049565882755, - 1.4082102322835948, + -21.638981392234413, + 0.06850547874247659, + 0.02874572640721577, + -0.0005760278247524966, + 0.2855200268142661, + -0.0013729693434970476, + -0.1901847051810351, + 0.006586770631265142, + -0.4490558452282004, + 1.3873546219096944, ] assert matrix == approx(expected, rel=1e-3) From 1b65ff35edfcda175136b06ec935367a251e884d Mon Sep 17 00:00:00 2001 From: Tom Palmer Date: Tue, 13 Oct 2026 10:34:44 +0100 Subject: [PATCH 24/28] Label the report's plot by what it shows, not as Kaplan-Meier curves --- pySEQTarget/SEQoutput.py | 2 +- pySEQTarget/helpers/_output_files.py | 8 +++++--- tests/test_output_files.py | 26 ++++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/pySEQTarget/SEQoutput.py b/pySEQTarget/SEQoutput.py index 342c580..c283271 100644 --- a/pySEQTarget/SEQoutput.py +++ b/pySEQTarget/SEQoutput.py @@ -88,7 +88,7 @@ class SEQoutput: def plot(self) -> None: """ - Displays the Kaplan-Meier graph + Displays the survival, risk or incidence plot """ if self.km_graph is None: raise ValueError( diff --git a/pySEQTarget/helpers/_output_files.py b/pySEQTarget/helpers/_output_files.py index 91ddaba..c4fbd27 100644 --- a/pySEQTarget/helpers/_output_files.py +++ b/pySEQTarget/helpers/_output_files.py @@ -6,7 +6,7 @@ def _build_md(self, img_path: str = None) -> str: Builds markdown content for SEQuential analysis results. :param self: SEQoutput instance - :param img_path: Path to saved KM graph image (if any) + :param img_path: Path to the saved survival, risk or incidence plot (if any) :return: Markdown string """ @@ -91,9 +91,11 @@ def _model_section(title, kind): lines.append("") if self.km_graph is not None and img_path is not None: - lines.append("#### Survival Curves") + # Model-based curves of the plotted quantity, as titled on the plot + label = f"Cumulative {self.options.plot_type.title()}" + lines.append(f"#### {label}") lines.append("") - lines.append(f"![Kaplan-Meier Survival Curves]({img_path})") + lines.append(f"![{label}]({img_path})") lines.append("") if self.diagnostic_tables: diff --git a/tests/test_output_files.py b/tests/test_output_files.py index edea603..6ec167e 100644 --- a/tests/test_output_files.py +++ b/tests/test_output_files.py @@ -99,3 +99,29 @@ def test_subgroup_models_are_collected_and_reported_by_subgroup(tmp_path): content = md_file.read_text() assert "Outcome Model (sex = 0)" in content assert "Outcome Model (sex = 1)" in content + + +def test_report_labels_the_plot_by_what_it_shows(tmp_path): + s = SEQuential( + load_data("SEQdata"), + id_col="ID", + time_col="time", + eligible_col="eligible", + treatment_col="tx_init", + outcome_col="outcome", + time_varying_cols=["N", "L", "P"], + fixed_cols=["sex"], + method="ITT", + parameters=SEQopts(km_curves=True, plot_type="risk", seed=42), + ) + s.expand() + s.fit() + s.survival() + s.plot() + md_file = tmp_path / "report.md" + s.collect().to_md(str(md_file)) + content = md_file.read_text() + # Model-based curves, so no Kaplan-Meier label + assert "#### Cumulative Risk" in content + assert "![Cumulative Risk](report.png)" in content + assert "Kaplan-Meier" not in content From d36057aba63e30d7afb1c27d2363696b61de3c17 Mon Sep 17 00:00:00 2001 From: Tom Palmer Date: Tue, 13 Oct 2026 10:35:59 +0100 Subject: [PATCH 25/28] Regenerate the advanced-analysis vignettes for clearer, sensible output --- docs/vignettes/SEQuential_results.png | Bin 154088 -> 131282 bytes docs/vignettes/exploring_results.md | 195 +++++++++++-------------- docs/vignettes/more_advanced_models.md | 5 +- 3 files changed, 90 insertions(+), 110 deletions(-) diff --git a/docs/vignettes/SEQuential_results.png b/docs/vignettes/SEQuential_results.png index 7388757fe881450510b99a994642871aa53e61ad..f996c938d2dae08b590ea49e5901e942a3209e0c 100644 GIT binary patch literal 131282 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

+SGTqxF+6clunkTV0qyY= zY8qI!H4axe=-U`E6O%h~($e+sYX=xeyJjP+uGrhd@4gR_dy;rpukhVO42Mc07Typ( zV;F}+u4=MM;M*66K<3Xv_M?(D&;G|sdmwnu&|xM!zD+H$flKr5AB;X^rE)mwWNR7N z_OO-+%nWI>Ge)Bp5#x!cQO1o;&}$Ia(o~;NwGX>@<3?hI%%uTR-7?gr&A<naRt8V7E%==ZRw);cV(fneD)K94-t)vg zY~kcu6lKkM9OlPlc~dkAmk$2Dc~g>D44c*FO;Ds;{KslDQ_*>4(A(V)Wxv;55uSW+ z11qMNt^HEo{VzTVcr#YrSo1jPo0|Yyu6JmegD##LI67@hUm=52_ES2hx@435O~#Ri zz0LdpJm{)tY60?l@BsU=Qy%~fDDOWD+3+a=LOZjPBfYM~4aH-i=a%d*kMiMom;;dZ zz40W8Yil(h6}ICeZGTm_OI^>G5>FQ3FHh@;2CMLRzbx1Ug`0qmMlD-% zk;g;!u={xY>-@pCSbVUq0R)6uNk}f~$=&EGer&^rlNuu92<0ocYW|3;#2YMjy!_$k zcDOoNxC(M7)H9JuZ&IAw!2#4&V_eWw+w8-`tXgpNFP!#?a@W*ixW0A0PQ8kXq~pi) z&QN8H?>xtCH+3;4dj3qux=r;S%Z|P>J0F|T83?#u%e1qQ2T6Ih1$$jTS7kG1LhvTW zT0v3BJ-eNob&PStzT`1|H{=C%+5BCLhuDhS^MCmI&ZwrgF4_~iAc&VLO%w$bDN0p9 zuz^ZbQBZ0S=^bg(62MNgT>#81`)TkE&?|Iks7_(6qHe!I^f#x)h3*`qNnuWy_?S2JLzGc)GyE8n{A#<(}&(i z_t61leuSzizha^2?7UqFf=jPIb6AK~!yVN(#*JPh8L^|Py@`F&+tpMBAf)CD3PzK+ z@DW&pS8wim;lu<|bXDNT$?*7ZN1!aXAO&mSTtbIQ_?1QhE)`qCh3YiGnhFeG#d+-^ zXy%zz2KOOl?MwlMZ4d75Ku}F#TgOrV8a{W(C$+9z!&;0J9_V!0Q)rJx)T!|CU=rPn z^6fcnOJ58P2LU)MEq24FutD&P5?9$kV*{XL^0~ze?f;%V_6bSCtK43ceEi7oIV#Xa zMjm+8fL3u zAW)y&YQ@^=`0q7#%JZ+k%Z}~bfU6neT|US%Q$0L#M1f9`(82`-4X%=_adXYyY@RR0 zSb-TTth!z8I;KKYJ~=tsG>VaK1Ck}R(ZXAJDeUM=YZH2+tiE;IcN=F`5wLlO3hppf zG}yzJ_NcIor303q4_&(0UW32KFF*67h=d?f( zYX45B@W0`h_=mvG;6+kIg5r`;#-{+hobq~OaN0y>3DO`r9ltFAQ9m^(llE=?*vfMA zM`@-N($IClj&fSoX;!&cy1KVBB*?*lZ<_0~bRDf6+Pr27zTa}%xvtVTjmU;x{%b!% z<(pDHxC%pt4qNv0pnwy4xAmS4;N8IW)r;5TnTaHtEAF*YQ!IMLJezT|Xz|`n#P7(~ z@&xeDpJ8W&Tk!g=cE|_SO<})0d_>CkQYTHDC<@X2U{@Z>CfiKL4B2gUHLB)w(2vEq z
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 literal 154088 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

2hyxK~N)60HR7;`Te%&l%tDxClzj^HCFYwXTD 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 diff --git a/docs/vignettes/exploring_results.md b/docs/vignettes/exploring_results.md index f78ad06..f9fad98 100644 --- a/docs/vignettes/exploring_results.md +++ b/docs/vignettes/exploring_results.md @@ -12,72 +12,40 @@ Let us now go over what the dump to md looks like and explore our output in furt ## Weighting -We begin by exploring the weight models, this gives us general information about the numerator and denominator models, as well as weight statistics before applying any limits. If you recall, we imposed weight bounds at the 99th percentile. This means that in the outcome model our weights will be bound at [0.273721, 423.185]. Note that in real analysis, we would hope the weights are stabilized further. Using the generated data, specifically with excused analysis, often result in larger-than-intended weights. +We begin by exploring the weight models, this gives us general information about the denominator model, as well as weight statistics before applying any limits. With pre-expansion weights and excused conditions the numerator is fixed at 1, so there is no numerator model and the weights are not stabilized; they have a long right tail, which is why we bound them at the 1st and 99th percentiles. This means that in the outcome model our weights will be bound at [0.999954, 19.8889]. -We should also note here that in excused-censoring analysis, our adherance models hold `switch` as the dependent variable. In all non-excused cases, this would normally be your treatment value. - -### Numerator Model - -``` - MNLogit Regression Results -============================================================================== -Dep. Variable: switch No. Observations: 65375 -Model: MNLogit Df Residuals: 65366 -Method: MLE Df Model: 8 -Date: Wed, 10 Dec 2025 Pseudo R-squ.: 0.008332 -Time: 10:18:38 Log-Likelihood: -13986. -converged: True LL-Null: -14103. -Covariance Type: nonrobust LLR p-value: 2.560e-46 -=============================================================================== - switch=1 coef std err z P>|z| [0.025 0.975] -------------------------------------------------------------------------------- -Intercept -0.8797 0.692 -1.271 0.204 -2.236 0.477 -sex[T.1] -0.0461 0.035 -1.325 0.185 -0.114 0.022 -N_bas 0.0026 0.003 0.741 0.459 -0.004 0.009 -L_bas 0.3368 0.032 10.553 0.000 0.274 0.399 -P_bas -0.1864 0.073 -2.556 0.011 -0.329 -0.043 -followup -0.0211 0.006 -3.822 0.000 -0.032 -0.010 -followup_sq 0.0001 0.000 0.637 0.524 -0.000 0.000 -trial -0.0624 0.014 -4.430 0.000 -0.090 -0.035 -trial_sq 0.0004 0.000 2.309 0.021 5.78e-05 0.001 -=============================================================================== -``` +We should also note here that with pre-expansion weights the denominator model has the treatment as its dependent variable. With post-expansion weights (`weight_preexpansion=False`), excused-censoring models hold `switch` as the dependent variable instead. ### Denominator Model ``` - MNLogit Regression Results + Logit Regression Results +============================================================================== +Dep. Variable: tx_init No. Observations: 6137 +Model: Logit Df Residuals: 6130 +Method: MLE Df Model: 6 +Date: Tue, 13 Oct 2026 Pseudo R-squ.: 0.0006500 +Time: 10:31:40 Log-Likelihood: -3017.9 +converged: True LL-Null: -3019.8 +Covariance Type: nonrobust LLR p-value: 0.6867 +============================================================================== + coef std err z P>|z| [0.025 0.975] +------------------------------------------------------------------------------ +Intercept -2.2157 1.214 -1.824 0.068 -4.596 0.165 +sex 0.0331 0.065 0.511 0.609 -0.094 0.160 +N -0.0105 0.006 -1.648 0.099 -0.023 0.002 +L -0.0177 0.052 -0.343 0.732 -0.119 0.083 +P 0.0945 0.128 0.741 0.459 -0.156 0.345 +time 0.0147 0.024 0.609 0.542 -0.033 0.062 +time_sq -1.602e-05 0.000 -0.066 0.947 -0.000 0.000 ============================================================================== -Dep. Variable: switch No. Observations: 65375 -Model: MNLogit Df Residuals: 65363 -Method: MLE Df Model: 11 -Date: Wed, 10 Dec 2025 Pseudo R-squ.: 0.01586 -Time: 10:18:38 Log-Likelihood: -13880. -converged: True LL-Null: -14103. -Covariance Type: nonrobust LLR p-value: 5.374e-89 -=============================================================================== - switch=1 coef std err z P>|z| [0.025 0.975] -------------------------------------------------------------------------------- -Intercept -1.4384 0.715 -2.012 0.044 -2.840 -0.037 -sex[T.1] -0.0447 0.035 -1.281 0.200 -0.113 0.024 -N -0.0195 0.003 -5.655 0.000 -0.026 -0.013 -L 0.3719 0.062 6.025 0.000 0.251 0.493 -P 0.9362 0.139 6.723 0.000 0.663 1.209 -N_bas 0.0023 0.003 0.674 0.501 -0.004 0.009 -L_bas -0.1703 0.092 -1.842 0.066 -0.351 0.011 -P_bas -0.9966 0.139 -7.166 0.000 -1.269 -0.724 -followup 0.0906 0.022 4.164 0.000 0.048 0.133 -followup_sq -0.0007 0.000 -3.678 0.000 -0.001 -0.000 -trial -0.0695 0.014 -4.934 0.000 -0.097 -0.042 -trial_sq 0.0006 0.000 3.788 0.000 0.000 0.001 -=============================================================================== ``` ### Weighting Statistics | weight_min | weight_max | weight_mean | weight_std | weight_p01 | weight_p25 | weight_p50 | weight_p75 | weight_p99 | |-------------:|-------------:|--------------:|-------------:|-------------:|-------------:|-------------:|-------------:|-------------:| -| 3.11308e-08 | 9.08003e+30 | 1.97762e+26 | 3.39822e+28 | 0.260691 | 0.853367 | 1.02192 | 1.28444 | 30119 | +| 0.999923 | 24934.2 | 2.05553 | 33.0393 | 0.999954 | 0.999995 | 1.00002 | 1.26351 | 19.8889 | ## Outcome @@ -88,29 +56,26 @@ After weight information, we begin to gather information about the outcome model ``` Generalized Linear Model Regression Results ============================================================================== -Dep. Variable: outcome No. Observations: 658971 -Model: GLM Df Residuals: 658961 -Model Family: Binomial Df Model: 9 +Dep. Variable: outcome No. Observations: 670413 +Model: GLM Df Residuals: 670406 +Model Family: Binomial Df Model: 6 Link Function: Logit Scale: 1.0000 -Method: IRLS Log-Likelihood: -2844.7 -Date: Wed, 10 Dec 2025 Deviance: 5689.4 -Time: 10:18:38 Pearson chi2: 6.80e+05 -No. Iterations: 11 Pseudo R-squ. (CS): 0.0001638 +Method: IRLS Log-Likelihood: -3096.8 +Date: Tue, 13 Oct 2026 Deviance: 6193.6 +Time: 10:31:40 Pearson chi2: 1.02e+06 +No. Iterations: 13 Pseudo R-squ. (CS): 0.0002477 Covariance Type: nonrobust -==================================================================================== - coef std err z P>|z| [0.025 0.975] ------------------------------------------------------------------------------------- -Intercept -23.1102 2.697 -8.569 0.000 -28.396 -17.824 -tx_init_bas[T.1] -0.2221 0.185 -1.203 0.229 -0.584 0.140 -sex[T.1] -0.5588 0.113 -4.942 0.000 -0.780 -0.337 -followup 0.0060 0.015 0.416 0.678 -0.022 0.035 -followup_sq 0.0001 0.000 0.465 0.642 -0.000 0.001 -trial 0.3377 0.054 6.274 0.000 0.232 0.443 -trial_sq -0.0022 0.001 -4.223 0.000 -0.003 -0.001 -N_bas -0.0007 0.011 -0.066 0.947 -0.022 0.021 -L_bas -0.3595 0.072 -4.962 0.000 -0.501 -0.217 -P_bas 1.6141 0.281 5.752 0.000 1.064 2.164 -==================================================================================== +============================================================================================= + coef std err z P>|z| [0.025 0.975] +--------------------------------------------------------------------------------------------- +Intercept -9.5140 0.371 -25.647 0.000 -10.241 -8.787 +tx_init_bas[T.1] -0.0750 0.343 -0.219 0.827 -0.748 0.598 +followup -0.0560 0.024 -2.346 0.019 -0.103 -0.009 +tx_init_bas[T.1]:followup 0.0581 0.022 2.633 0.008 0.015 0.101 +followup_sq 0.0002 0.000 0.677 0.498 -0.000 0.001 +trial 0.1249 0.018 7.092 0.000 0.090 0.159 +trial_sq -0.0017 0.000 -4.600 0.000 -0.002 -0.001 +============================================================================================= ``` ### Survival @@ -125,21 +90,21 @@ survival_data = my_output.retrieve_data("km_data") #### Risk Differences -| A_x | A_y | Risk Difference | RD 95% LCI | RD 95% UCI | -|------:|------:|------------------:|-------------:|-------------:| -| 0 | 1 | 0.00859802 | -0.169438 | 0.186634 | -| 1 | 0 | -0.00859802 | -0.186634 | 0.169438 | +| Followup | A_x | A_y | Risk Difference | RD 95% LCI | RD 95% UCI | RD SE | +|-----------:|------:|------:|------------------:|-------------:|-------------:|----------:| +| 60 | 0 | 1 | -0.0244359 | -0.126522 | -0.00410246 | 0.0270593 | +| 60 | 1 | 0 | 0.0244359 | 0.00410246 | 0.126522 | 0.0270593 | #### Risk Ratios -| A_x | A_y | Risk Ratio | RR 95% LCI | RR 95% UCI | -|------:|------:|-------------:|-------------:|-------------:| -| 0 | 1 | 1.24069 | 0.0121904 | 126.272 | -| 1 | 0 | 0.806005 | 0.00791939 | 82.032 | +| Followup | A_x | A_y | Risk Ratio | RR 95% LCI | RR 95% UCI | log(RR) SE | +|-----------:|------:|------:|-------------:|-------------:|-------------:|-------------:| +| 60 | 0 | 1 | 0.255543 | 0.114726 | 0.632205 | 0.48761 | +| 60 | 1 | 0 | 3.91324 | 1.58177 | 8.71642 | 0.48761 | -#### Survival Curves +#### Cumulative Risk -![Kaplan-Meier Survival Curves](SEQuential_results.png) +![Cumulative Risk](SEQuential_results.png) ## Diagnostic Tables @@ -147,42 +112,56 @@ After all of our primary results, we are met with a few diagnostic tables. These Because we have an excused-censoring analysis, we are also provided with information about switches from treatment as well as how many of these switches were excused. -### Unique Outcomes +### Unique Outcomes (distinct subjects who had the outcome) | tx_init | outcome | len | |----------:|----------:|------:| -| 0 | 0 | 249 | +| 1 | 0 | 713 | +| 0 | 1 | 5 | | 1 | 1 | 8 | -| 0 | 1 | 4 | -| 1 | 0 | 715 | +| 0 | 0 | 252 | -### Nonunique Outcomes +### Nonunique Outcomes (total outcome events) | tx_init | outcome | len | |----------:|----------:|-------:| -| 0 | 1 | 73 | -| 1 | 0 | 546644 | -| 1 | 1 | 227 | -| 0 | 0 | 117007 | +| 1 | 0 | 553803 | +| 0 | 0 | 121031 | +| 0 | 1 | 70 | +| 1 | 1 | 209 | + +### Unique Followup (distinct subjects contributing follow-up) + +| tx_init_bas | len | +|--------------:|------:| +| 0 | 828 | +| 1 | 913 | + +### Nonunique Followup (person-time intervals) + +| tx_init_bas | len | +|--------------:|-------:| +| 0 | 59827 | +| 1 | 610586 | -### Unique Switches +### Unique Switches (distinct subjects who switched) | tx_init | isExcused | switch | len | |----------:|:------------|---------:|------:| -| 0 | True | 1 | 30 | -| 1 | False | 1 | 47 | -| 0 | False | 1 | 91 | -| 1 | True | 1 | 32 | -| 0 | False | 0 | 132 | -| 1 | False | 0 | 644 | +| 1 | False | 0 | 646 | +| 0 | True | 1 | 29 | +| 1 | True | 1 | 33 | +| 0 | False | 1 | 94 | +| 0 | False | 0 | 134 | +| 1 | False | 1 | 42 | -### Nonunique Switches +### Nonunique Switches (total switch intervals) | tx_init | isExcused | switch | len | |----------:|:------------|---------:|-------:| -| 0 | True | 0 | 22056 | -| 0 | False | 1 | 3724 | -| 1 | False | 1 | 1256 | -| 1 | False | 0 | 527107 | -| 1 | True | 0 | 18508 | -| 0 | False | 0 | 91300 | +| 0 | True | 0 | 23012 | +| 0 | False | 1 | 3394 | +| 1 | False | 1 | 1306 | +| 1 | False | 0 | 533916 | +| 0 | False | 0 | 94695 | +| 1 | True | 0 | 18790 | diff --git a/docs/vignettes/more_advanced_models.md b/docs/vignettes/more_advanced_models.md index d281a45..4231d1b 100644 --- a/docs/vignettes/more_advanced_models.md +++ b/docs/vignettes/more_advanced_models.md @@ -1,7 +1,7 @@ # More Advanced Analysis In getting started, we covered some of the basics for getting up and running on a simple analysis, but there are many options stored within `SEQuential`, or more aptly, many more parameters to play with in {py:class}`~pySEQTarget.SEQopts`. Let's cover a more in-depth analysis. -In this case, let's go over a censoring analysis with excused conditions and stabilized weighting, limiting weights to the 99th percentile, and adjusting for losses-to-followup. Futhermore, we are interested in bootstrapping our results to get a risk estimate with confidence bounds and for ease of computation, we are going to randomly downsample 30% of trials which did not initiate treatment. Because we are downsampling, we are additionally going to turn off the lag condition for our adherance weights. +In this case, let's go over a censoring analysis with excused conditions and inverse probability weighting, limiting weights to the 99th percentile, and adjusting for losses-to-followup. Futhermore, we are interested in bootstrapping our results to get a risk estimate with confidence bounds and for ease of computation, we are going to randomly downsample 30% of trials which did not initiate treatment. If you are coming from the R version, many arguments have been streamlined or inferred - take R's `bootstrap`, and `bootstrap.nboot` - these have been merged such that any `bootstrap_nboot` over 0 automatically starts the bootstrap initiation. @@ -16,14 +16,15 @@ from pySEQTarget.data import load_data data = load_data("SEQdata_LTFU") my_options = SEQopts( bootstrap_nboot = 20, # 20 bootstrap iterations (for demonstration only — use 500+ in practice) + bootstrap_CI_method = "percentile", # percentile intervals stay within [0, 1] cense_colname = "LTFU", # control for losses-to-followup as a censor excused = True, # allow excused treatment swapping excused_colnames = ["excusedZero", "excusedOne"], km_curves = True, # run survival estimates + plot_type = "risk", # plot cumulative risk rather than survival selection_random = True, # randomly sample treatment non-initiators selection_sample = 0.30, # sample 30% of treatment non-initiators weighted = True, # enables the weighting - weight_lag_condition=False, # turn off lag condition when weighting for adherance weight_p99 = True, # bounds weights by the 1st and 99th percentile weight_preexpansion = True # weights are predicted using pre-expansion data ) From 8e18e66aab25ba8314a58bff5de50aa31a764fea Mon Sep 17 00:00:00 2001 From: Tom Palmer Date: Tue, 13 Oct 2026 10:50:56 +0100 Subject: [PATCH 26/28] Keep the supplied weight bounds when truncating at percentiles --- pySEQTarget/analysis/_endoffup.py | 4 +++- pySEQTarget/analysis/_outcome_fit.py | 6 +++--- pySEQTarget/weighting/_weight_stats.py | 12 ++++++++---- tests/test_weight_p99.py | 27 ++++++++++++++++++++++++-- 4 files changed, 39 insertions(+), 10 deletions(-) diff --git a/pySEQTarget/analysis/_endoffup.py b/pySEQTarget/analysis/_endoffup.py index f7e7ac7..bb2e9de 100644 --- a/pySEQTarget/analysis/_endoffup.py +++ b/pySEQTarget/analysis/_endoffup.py @@ -12,6 +12,7 @@ import polars as pl from scipy import stats +from ..weighting._weight_stats import _weight_bounds from ._risk_estimates import _ci_label @@ -125,8 +126,9 @@ def _eof_estimate(self): DT = _eof_frame(self) by = _eof_group_cols(self, DT) + lower, upper = _weight_bounds(self) measured = _eof_measure(self, DT).with_columns( - pl.col("weight").clip(lower_bound=self.weight_min, upper_bound=self.weight_max) + pl.col("weight").clip(lower_bound=lower, upper_bound=upper) ) est = measured.group_by(by).agg( diff --git a/pySEQTarget/analysis/_outcome_fit.py b/pySEQTarget/analysis/_outcome_fit.py index c068e94..ec64d4b 100644 --- a/pySEQTarget/analysis/_outcome_fit.py +++ b/pySEQTarget/analysis/_outcome_fit.py @@ -10,6 +10,7 @@ from ..helpers._check_design import _check_design from ..helpers._fix_categories import _cast_fixed_categories from ..helpers._spline import _compute_spline_knots, _cr_term +from ..weighting._weight_stats import _weight_bounds def _apply_spline_formula(formula, indicator_squared, spline_knots): @@ -92,10 +93,9 @@ def _outcome_fit( start_params=None, ): if weighted: + lower, upper = _weight_bounds(self) df = df.with_columns( - pl.col(weight_col).clip( - lower_bound=self.weight_min, upper_bound=self.weight_max - ) + pl.col(weight_col).clip(lower_bound=lower, upper_bound=upper) ) if self.method == "censoring": diff --git a/pySEQTarget/weighting/_weight_stats.py b/pySEQTarget/weighting/_weight_stats.py index 6004884..988a054 100644 --- a/pySEQTarget/weighting/_weight_stats.py +++ b/pySEQTarget/weighting/_weight_stats.py @@ -16,8 +16,12 @@ def _weight_stats(self): ] ) - if self.weight_p99: - self.weight_min = float(stats["weight_p01"][0]) - self.weight_max = float(stats["weight_p99"][0]) - return stats + + +def _weight_bounds(self): + """Truncation bounds for the current fit; with weight_p99, its 1st/99th percentiles.""" + stats = getattr(self, "weight_stats", None) + if self.weight_p99 and stats is not None: + return float(stats["weight_p01"][0]), float(stats["weight_p99"][0]) + return self.weight_min, self.weight_max diff --git a/tests/test_weight_p99.py b/tests/test_weight_p99.py index be856f2..3d55451 100644 --- a/tests/test_weight_p99.py +++ b/tests/test_weight_p99.py @@ -28,8 +28,8 @@ def _coefs(s): def test_weight_p99_truncates_at_p01_p99_percentile_weights(): - # weight_p99=True overrides weight_min/weight_max with the p01/p99 of the - # (untruncated) weights -- these are reported in weight_stats. So it must be + # weight_p99=True truncates at the p01/p99 of the (untruncated) weights -- + # these are reported in weight_stats. So it must be # equivalent to passing those percentile values as explicit bounds, and must # differ from an untruncated weighted fit. p99 = _fit(weight_p99=True) @@ -42,3 +42,26 @@ def test_weight_p99_truncates_at_p01_p99_percentile_weights(): assert np.allclose(_coefs(p99), _coefs(explicit), atol=1e-8) assert not np.allclose(_coefs(p99), _coefs(untruncated), atol=1e-6) + + +def test_weight_p99_leaves_the_supplied_bounds_alone(): + # Each fit, main or replicate, truncates at its own percentiles, but the + # options keep what was supplied, as in SEQTaRget + s = SEQuential( + load_data("SEQdata"), + id_col="ID", + time_col="time", + eligible_col="eligible", + treatment_col="tx_init", + outcome_col="outcome", + time_varying_cols=["N", "L", "P"], + fixed_cols=["sex"], + method="censoring", + parameters=SEQopts(weighted=True, weight_p99=True, bootstrap_nboot=2, seed=1), + ) + s.expand() + s.bootstrap() + s.fit() + assert (s.weight_min, s.weight_max) == (0.0, None) + options = s.collect().options + assert (options.weight_min, options.weight_max) == (0.0, None) From 36d5129182ae47d0b15d50e0a502a708c8fafe57 Mon Sep 17 00:00:00 2001 From: Tom Palmer Date: Tue, 13 Oct 2026 11:47:47 +0100 Subject: [PATCH 27/28] Install OpenMP, xsimd and jemalloc for the Python 3.15 CI job --- .github/workflows/python-app.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/python-app.yml b/.github/workflows/python-app.yml index e517e7a..8c85932 100644 --- a/.github/workflows/python-app.yml +++ b/.github/workflows/python-app.yml @@ -28,6 +28,14 @@ jobs: - name: Set up Python ${{ matrix.python-version }} run: uv python install ${{ matrix.python-version }} + # tabmat and glum have no Python 3.15 wheels yet, so they build from source + - name: Install build dependencies for Python 3.15 + if: matrix.python-version == '3.15' + run: | + brew install libomp xsimd jemalloc + echo "CPPFLAGS=-I$(brew --prefix libomp)/include -I$(brew --prefix xsimd)/include -I$(brew --prefix jemalloc)/include" >> "$GITHUB_ENV" + echo "LDFLAGS=-L$(brew --prefix libomp)/lib -L$(brew --prefix jemalloc)/lib" >> "$GITHUB_ENV" + - name: Install dependencies run: | uv venv --python ${{ matrix.python-version }} From 45e44864e4aa7a0633359d901bf531f209888d47 Mon Sep 17 00:00:00 2001 From: Tom Palmer Date: Tue, 13 Oct 2026 12:20:48 +0100 Subject: [PATCH 28/28] Override lifelines' pandas cap in the Python 3.15 CI job --- .github/workflows/python-app.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/python-app.yml b/.github/workflows/python-app.yml index 8c85932..ec4e173 100644 --- a/.github/workflows/python-app.yml +++ b/.github/workflows/python-app.yml @@ -28,13 +28,18 @@ jobs: - name: Set up Python ${{ matrix.python-version }} run: uv python install ${{ matrix.python-version }} - # tabmat and glum have no Python 3.15 wheels yet, so they build from source - - name: Install build dependencies for Python 3.15 + # tabmat and glum have no Python 3.15 wheels yet, so they build from source. + # lifelines caps pandas below 3, and pandas 2.x is broken on 3.15, so override + # the cap and stop uv run from re-syncing it back. + - name: Prepare Python 3.15 build if: matrix.python-version == '3.15' run: | brew install libomp xsimd jemalloc echo "CPPFLAGS=-I$(brew --prefix libomp)/include -I$(brew --prefix xsimd)/include -I$(brew --prefix jemalloc)/include" >> "$GITHUB_ENV" echo "LDFLAGS=-L$(brew --prefix libomp)/lib -L$(brew --prefix jemalloc)/lib" >> "$GITHUB_ENV" + echo "pandas>=3" > "$RUNNER_TEMP/uv-overrides.txt" + echo "UV_OVERRIDE=$RUNNER_TEMP/uv-overrides.txt" >> "$GITHUB_ENV" + echo "UV_NO_SYNC=1" >> "$GITHUB_ENV" - name: Install dependencies run: |