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.