Releases: heidihelena/assesslite
Release list
AssessLite 0.4.0
Ships the three items previously marked as future work, each in a scoped, honest form. Native in R and Python against one shared schema; R CMD check clean.
New
- spatial_autocorrelation — the random-field diagnostic: Moran's I on the outcome-model residuals (martingale for Cox via a Breslow baseline hazard, response for GLMs) over a k-nearest-neighbour weight matrix, attacking a new
spatial_independenceinvariance. Resolved residual autocorrelation means the effective sample size is smaller than n and i.i.d.-style intervals overstate precision. Deterministic (Cliff-Ord moments); R and Python agree bit-for-bit. - Interference exposure maps —
interference_check(..., exposure_map=)declares how spillover aggregates:mean(exposed fraction),any(contagion),sum(dose). The chosen map is recorded in the audit. - Identification repair — when the effect is not identifiable,
adjustment_checknames which latent node(s), if measured, would restore identifiability by adjustment (adjustment.repair): "measuring {U} would make the effect identifiable."
No new dependencies (numpy/pandas and base R).
Acknowledgement
AssessLite's assumptions-first framing is indebted to Weinstein & Blei, "Geometric Causal Models" (arXiv:2607.05153, 2026).
Publishes to PyPI and archives on Zenodo.
AssessLite 0.3.0
Reaches into genuinely dependent data (spatial, networked) and completes the identification story (latent-node non-identifiability, positivity), with a correctness fix that makes every holdout verdict honest. Native in R and Python against one shared schema.
New attacks
- confounding_scenarios — a deterministic bias-analysis array (Lin-Psaty-Kronmal; VanderWeele-Arah): the estimator-failure map complementing the E-value, targetable at a declared decision threshold, not just the null.
- graph_check / adjustment_check — declare a causal DAG (
declare_graph) and test its implied conditional independencies against the data, and whether your adjusted set satisfies the backdoor criterion. Mark unmeasured confounderslatent=and it reports non-identifiability. Self-contained d-separation, no dagitty. - positivity_check — propensity-overlap trimming: does the finding lean on units with near-deterministic exposure?
- spatial_holdout — leave-one-spatial-block-out over a coordinate grid (
coords=). - interference_check — does the outcome depend on neighbours' exposure? (
unit_id=,edges=); attacks SUTVA. - assumption_lattice() — the pooling commitments as a Hasse diagram.
Correctness
- The holdout verdict rule now uses a Bonferroni-adjusted shift p-value: the old max-shift rule flagged ~m times too often with m variants (a false-positive
cluster_holdout-> abstain in the worked example). Applies to every holdout attack. mark_testedkeeps the worst verdict when several attacks share an invariance.
No new dependencies (numpy/pandas and base R). The pure-numpy Cox reproduces R's coxph(ties="breslow") exactly, including stratification.
Acknowledgement
AssessLite's assumptions-first framing is indebted to Weinstein & Blei, "Geometric Causal Models" (arXiv:2607.05153, 2026).
Publishes to PyPI and archives on Zenodo.
AssessLite 0.2.0
Four new attacks/analyses, all folding into the same three-way verdicts and decision rules, native in both R and Python, with audit records validated against one shared JSON Schema.
New in 0.2.0
- confounding_sensitivity — E-value (VanderWeele & Ding): how strong an unmeasured confounder would have to be to move the interval to no effect. Ratio-scale estimators (Cox HR, logistic OR).
- graph_check — declare a causal DAG with
declare_graph(); the engine tests the conditional independencies the graph implies against the data (partial correlation, self-contained d-separation). - adjustment_check — given the declared DAG, does your adjusted covariate set satisfy the backdoor criterion? Flags open backdoor paths (under-adjustment) and adjusted descendants of the exposure (over-adjustment / collider or mediator bias), and reports a minimal sufficient set. Verified on the confounding triangle, mediator, and M-bias.
- assumption_lattice() — the pooling commitments (cluster / time) as a Hasse lattice: refit the exposure estimate under every pool-or-stratify combination and see whether the conclusion depends on them.
No new dependencies (numpy/pandas and base R). The pure-numpy stratified Cox reproduces R's coxph(ties="breslow") exactly.
Acknowledgement
AssessLite's assumptions-first framing is indebted to Weinstein & Blei, "Geometric Causal Models" (arXiv:2607.05153, 2026).
This release publishes assesslite 0.2.0 to PyPI and archives it on Zenodo.
AssessLite 0.1.0
First release. Structural assumption assessment for causal analysis, for R and Python.
- R package (repo root) and Python package (python/) implement one shared spec (spec/).
- Attacks: unit permutation, cluster holdout, temporal split, subgroup stability.
- Three-way verdicts (stable / unstable / not resolvable) and proceed / conditional / abstain decisions.
- Exports an auditable JSON record (validated against spec/schema/audit.schema.json) and an HTML report.
- Python engine is pure numpy/pandas; its Cox fit reproduces R coxph(ties=breslow) exactly.
This release publishes the Python package to PyPI via trusted publishing.