StatsPAI: The Agent-Native Causal Inference & Econometrics Toolkit for Python

StatsPAI is the agent-native Python package for causal inference and applied econometrics. One import, 390+ functions, covering the complete empirical research workflow — from classical econometrics to cutting-edge ML/AI causal methods to publication-ready tables in Word, Excel, and LaTeX.
Designed for AI agents: every function returns structured result objects with self-describing schemas (list_functions(), describe_function(), function_schema()), making StatsPAI the first econometrics toolkit purpose-built for LLM-driven research workflows — while remaining fully ergonomic for human researchers.
It brings R's Causal Inference Task View (fixest, did, rdrobust, gsynth, DoubleML, MatchIt, CausalImpact, ...) and Stata's core econometrics commands into a single, consistent Python API.
Built by the team behind CoPaper.AI · Stanford REAP Program
Why StatsPAI?
| Pain point |
Stata |
R |
StatsPAI |
| Scattered packages |
One environment, but $695+/yr license |
20+ packages with incompatible APIs |
One import, unified API |
| Publication tables |
outreg2 (limited formats) |
modelsummary (best-in-class) |
Word + Excel + LaTeX + HTML in every function |
| Robustness checks |
Manual re-runs |
Manual re-runs |
spec_curve() + robustness_report() — one call |
| Heterogeneity analysis |
Manual subgroup splits + forest plots |
Manual lapply + ggplot |
subgroup_analysis() with Wald test |
| Modern ML causal |
Limited (no DML, no causal forest) |
Fragmented (DoubleML, grf, SuperLearner separate) |
DML, Causal Forest, Meta-Learners, TMLE, DeepIV |
| Neural causal models |
None |
None |
TARNet, CFRNet, DragonNet |
| Causal discovery |
None |
pcalg (complex API) |
notears(), pc_algorithm() |
| Policy learning |
None |
policytree (standalone) |
policy_tree() + policy_value() |
| Result objects |
Inconsistent across commands |
Inconsistent across packages |
Unified CausalResult with .summary(), .plot(), .to_latex(), .cite() |
Complete Feature List
Regression Models
| Function |
Description |
Stata equivalent |
R equivalent |
regress() |
OLS with robust/clustered/HAC SE |
reg y x, r / vce(cluster c) |
fixest::feols() |
ivreg() |
IV / 2SLS with first-stage diagnostics |
ivregress 2sls |
fixest::feols() with IV |
panel() |
Fixed Effects, Random Effects, Between, FD |
xtreg, fe / xtreg, re |
plm::plm() |
heckman() |
Heckman selection model |
heckman |
sampleSelection::selection() |
qreg(), sqreg() |
Quantile regression |
qreg / sqreg |
quantreg::rq() |
tobit() |
Censored regression (Tobit) |
tobit |
censReg::censReg() |
xtabond() |
Arellano-Bond dynamic panel GMM |
xtabond |
plm::pgmm() |
glm() |
Generalized Linear Model (6 families × 8 links) |
glm |
stats::glm() |
logit(), probit() |
Binary choice with marginal effects |
logit / probit |
stats::glm(family=binomial) |
mlogit() |
Multinomial logit |
mlogit |
nnet::multinom() |
ologit(), oprobit() |
Ordered logit / probit |
ologit / oprobit |
MASS::polr() |
clogit() |
Conditional logit (McFadden) |
clogit |
survival::clogit() |
poisson(), nbreg() |
Count data (Poisson, Negative Binomial) |
poisson / nbreg |
MASS::glm.nb() |
ppmlhdfe() |
Pseudo-Poisson MLE for gravity models |
ppmlhdfe |
fixest::fepois() |
zip_model(), zinb() |
Zero-inflated Poisson / NegBin |
zip / zinb |
pscl::zeroinfl() |
hurdle() |
Hurdle (two-part) model |
— |
pscl::hurdle() |
truncreg() |
Truncated regression (MLE) |
truncreg |
truncreg::truncreg() |
fracreg() |
Fractional response (Papke-Wooldridge) |
fracreg |
— |
betareg() |
Beta regression |
— |
betareg::betareg() |
liml() |
LIML (robust to weak IV) |
ivregress liml |
AER::ivreg() |
jive() |
Jackknife IV (many instruments) |
— |
— |
lasso_iv() |
LASSO-selected instruments |
— |
— |
sureg() |
Seemingly Unrelated Regression |
sureg |
systemfit::systemfit("SUR") |
three_sls() |
Three-Stage Least Squares |
reg3 |
systemfit::systemfit("3SLS") |
biprobit() |
Bivariate probit |
biprobit |
— |
etregress() |
Endogenous treatment effects |
etregress |
— |
gmm() |
General GMM (arbitrary moments) |
gmm |
gmm::gmm() |
frontier() |
Stochastic frontier analysis |
frontier |
sfa::sfa() |
Panel Data (Extended)
| Function |
Description |
Stata equivalent |
panel_logit(), panel_probit() |
Panel binary (FE conditional / RE / CRE Mundlak) |
xtlogit / xtprobit |
panel_fgls() |
FGLS with heteroskedasticity and AR(1) |
xtgls |
interactive_fe() |
Interactive fixed effects (Bai 2009) |
— |
panel_unitroot() |
Panel unit root (IPS / LLC / Fisher / Hadri) |
xtunitroot |
mixed() |
Multilevel / mixed effects (HLM) |
mixed |
Survival / Duration Analysis
| Function |
Description |
Stata equivalent |
cox() |
Cox Proportional Hazards |
stcox |
kaplan_meier() |
Kaplan-Meier survival curves |
sts graph |
survreg() |
Parametric AFT (Weibull / exponential / log-normal) |
streg |
logrank_test() |
Log-rank test for group comparison |
sts test |
Time Series & Cointegration
| Function |
Description |
Stata equivalent |
var() |
Vector Autoregression |
var |
granger_causality() |
Granger causality test |
vargranger |
irf() |
Impulse response functions |
irf graph |
structural_break() |
Bai-Perron structural break test |
estat sbsingle |
cusum_test() |
CUSUM parameter stability test |
— |
engle_granger() |
Engle-Granger cointegration test |
— |
johansen() |
Johansen cointegration (trace / max-eigenvalue) |
vecrank |
Nonparametric Methods
| Function |
Description |
Stata equivalent |
lpoly() |
Local polynomial regression |
lpoly |
kdensity() |
Kernel density estimation |
kdensity |
Experimental Design & RCT Tools
| Function |
Description |
randomize() |
Stratified / cluster / block randomization |
balance_check() |
Covariate balance with normalized differences |
attrition_test() |
Differential attrition analysis |
attrition_bounds() |
Lee / Manski bounds under attrition |
optimal_design() |
Optimal sample size / cluster design |
Missing Data
| Function |
Description |
Stata equivalent |
mice() |
Multiple Imputation by Chained Equations |
mi impute chained |
mi_estimate() |
Combine estimates via Rubin's rules |
mi estimate |
Mendelian Randomization
| Function |
Description |
mendelian_randomization() |
IVW + MR-Egger + Weighted Median MR |
mr_plot() |
Scatter plot with MR regression lines |
Structural Estimation
| Function |
Description |
Reference |
blp() |
BLP random-coefficients demand estimation |
Berry, Levinsohn & Pakes (1995) |
Difference-in-Differences
| Function |
Description |
Reference |
did() |
Auto-dispatching DID (2×2 or staggered) |
— |
did_2x2() |
Classic two-group, two-period DID |
— |
callaway_santanna() |
Staggered DID with heterogeneous effects |
Callaway & Sant'Anna (2021) |
sun_abraham() |
Interaction-weighted event study |
Sun & Abraham (2021) |
bacon_decomposition() |
TWFE decomposition diagnostic |
Goodman-Bacon (2021) |
honest_did() |
Sensitivity to parallel trends violations |
Rambachan & Roth (2023) |
continuous_did() |
Continuous treatment DID (dose-response) |
Callaway, Goodman-Bacon & Sant'Anna (2024) |
did_multiplegt() |
DID with treatment switching |
de Chaisemartin & D'Haultfoeuille (2020) |
did_imputation() |
Imputation DID estimator |
Borusyak, Jaravel & Spiess (2024) |
distributional_te() |
Distributional treatment effects |
Chernozhukov, Fernandez-Val & Melly (2013) |
Regression Discontinuity
| Function |
Description |
Reference |
rdrobust() |
Sharp/Fuzzy RD with robust bias-corrected inference |
Calonico, Cattaneo & Titiunik (2014) |
rdplot() |
RD visualization with binned scatter |
— |
rddensity() |
McCrary density manipulation test |
McCrary (2008) |
rdmc() |
Multi-cutoff RD |
Cattaneo et al. (2024) |
rdms() |
Geographic / multi-score RD |
Keele & Titiunik (2015) |
rkd() |
Regression Kink Design |
Card et al. (2015) |
Matching & Reweighting
| Function |
Description |
Stata equivalent |
match() |
PSM, Mahalanobis, CEM with balance diagnostics |
psmatch2 / cem |
ebalance() |
Entropy balancing |
ebalance |
Synthetic Control
| Function |
Description |
Reference |
synth() |
Abadie-Diamond-Hainmueller SCM |
Abadie et al. (2010) |
sdid() |
Synthetic Difference-in-Differences |
Arkhangelsky et al. (2021) |
| Placebo inference, gap plots, weight tables, RMSE plots |
— |
— |
Machine Learning Causal Inference
| Function |
Description |
Reference |
dml() |
Double/Debiased ML (PLR + IRM) with cross-fitting |
Chernozhukov et al. (2018) |
causal_forest() |
Causal Forest for heterogeneous treatment effects |
Wager & Athey (2018) |
deepiv() |
Deep IV neural network approach |
Hartford et al. (2017) |
metalearner() |
S/T/X/R/DR-Learner for CATE estimation |
Kunzel et al. (2019), Kennedy (2023) |
tmle() |
Targeted Maximum Likelihood Estimation |
van der Laan & Rose (2011) |
aipw() |
Augmented Inverse-Probability Weighting |
— |
Neural Causal Models
| Function |
Description |
Reference |
tarnet() |
Treatment-Agnostic Representation Network |
Shalit et al. (2017) |
cfrnet() |
Counterfactual Regression Network |
Shalit et al. (2017) |
dragonnet() |
Dragon Neural Network for CATE |
Shi et al. (2019) |
Causal Discovery
| Function |
Description |
Reference |
notears() |
DAG learning via continuous optimization |
Zheng et al. (2018) |
pc_algorithm() |
Constraint-based causal graph learning |
Spirtes et al. (2000) |
Policy Learning
| Function |
Description |
Reference |
policy_tree() |
Optimal treatment assignment rules |
Athey & Wager (2021) |
policy_value() |
Policy value evaluation |
— |
Conformal & Bayesian Causal Inference
| Function |
Description |
Reference |
conformal_cate() |
Distribution-free prediction intervals for ITE |
Lei & Candes (2021) |
bcf() |
Bayesian Causal Forest (separate mu/tau) |
Hahn, Murray & Carvalho (2020) |
Dose-Response & Multi-valued Treatment
| Function |
Description |
Reference |
dose_response() |
Continuous treatment dose-response curve (GPS) |
Hirano & Imbens (2004) |
multi_treatment() |
Multi-valued treatment AIPW |
Cattaneo (2010) |
Bounds & Partial Identification
| Function |
Description |
Reference |
lee_bounds() |
Sharp bounds under sample selection |
Lee (2009) |
manski_bounds() |
Worst-case bounds (no assumption / MTR / MTS) |
Manski (1990) |
Interference & Spillover
| Function |
Description |
Reference |
spillover() |
Direct + spillover + total effect decomposition |
Hudgens & Halloran (2008) |
Dynamic Treatment Regimes
| Function |
Description |
Reference |
g_estimation() |
Multi-stage optimal DTR via G-estimation |
Robins (2004) |
Bunching & Tax Policy
| Function |
Description |
Reference |
bunching() |
Kink/notch bunching estimator with elasticity |
Kleven & Waseem (2013) |
Matrix Completion (Panel)
| Function |
Description |
Reference |
mc_panel() |
Causal panel data via nuclear-norm matrix completion |
Athey et al. (2021) |
Other Causal Methods
| Function |
Description |
Stata/R equivalent |
causal_impact() |
Bayesian structural time-series |
R CausalImpact |
mediate() |
Mediation analysis (ACME/ADE) |
medeff / R mediation |
bartik() |
Shift-share IV with Rotemberg weights |
bartik_weight |
Post-Estimation
| Function |
Description |
Stata equivalent |
margins() |
Average marginal effects (AME/MEM) |
margins, dydx(*) |
marginsplot() |
Marginal effects visualization |
marginsplot |
test() |
Wald test for linear restrictions |
test x1 = x2 |
lincom() |
Linear combinations with inference |
lincom x1 + x2 |
Diagnostics & Sensitivity
| Function |
Description |
Reference |
oster_bounds() |
Coefficient stability bounds |
Oster (2019) |
sensemakr() |
Sensitivity to omitted variables |
Cinelli & Hazlett (2020) |
mccrary_test() |
Density discontinuity test |
McCrary (2008) |
hausman_test() |
FE vs RE specification test |
Hausman (1978) |
anderson_rubin_test() |
Weak instrument robust inference |
Anderson & Rubin (1949) |
evalue() |
E-value sensitivity to unmeasured confounding |
VanderWeele & Ding (2017) |
het_test() |
Breusch-Pagan / White heteroskedasticity |
— |
reset_test() |
Ramsey RESET specification test |
— |
vif() |
Variance Inflation Factor |
— |
diagnose() |
General model diagnostics |
— |
Smart Workflow Engine (unique to StatsPAI — no other package has these)
| Function |
Description |
recommend() |
Given data + research question → recommends estimators with reasoning, generates workflow, provides .run() |
compare_estimators() |
Runs multiple methods (OLS, matching, IPW, DML, ...) on same data, reports agreement diagnostics |
assumption_audit() |
One-call test of ALL assumptions for any method, with pass/fail/remedy for each |
sensitivity_dashboard() |
Multi-dimensional sensitivity analysis (sample, outliers, unobservables) with stability grade |
pub_ready() |
Journal-specific publication readiness checklist (Top 5 Econ, AEJ, RCT) |
replicate() |
Built-in famous datasets (Card 1995, LaLonde 1986, Lee 2008) with replication guides |
Robustness Analysis (unique to StatsPAI)
| Function |
Description |
R/Stata equivalent |
spec_curve() |
Specification Curve / Multiverse Analysis |
R specr (limited) / Stata: none |
robustness_report() |
Automated robustness battery (SE variants, winsorize, trim, add/drop controls, subsamples) |
None |
subgroup_analysis() |
Heterogeneity analysis with forest plot + interaction Wald test |
None (manual in both) |
Inference Methods
| Function |
Description |
wild_cluster_bootstrap() |
Wild cluster bootstrap (Cameron, Gelbach & Miller 2008) |
ri_test() |
Randomization inference / Fisher exact test |
CATE Diagnostics (for Meta-Learners & Causal Forest)
| Function |
Description |
cate_summary(), cate_by_group() |
CATE distribution summaries |
cate_plot(), cate_group_plot() |
CATE visualization |
gate_test() |
Group Average Treatment Effect test |
blp_test() |
Best Linear Projection test |
compare_metalearners() |
Compare S/T/X/R/DR-Learner estimates |
Publication-Quality Output
| Function |
Description |
Formats |
modelsummary() |
Multi-model comparison tables |
Text, LaTeX, HTML, Word, Excel, DataFrame |
outreg2() |
Stata-style regression table export |
Excel, LaTeX, Word |
sumstats() |
Summary statistics (Table 1) |
Text, LaTeX, HTML, Word, Excel, DataFrame |
balance_table() |
Pre-treatment balance check |
Text, LaTeX, HTML, Word, Excel, DataFrame |
tab() |
Cross-tabulation with chi-squared / Fisher |
Text, LaTeX, Word, Excel, DataFrame |
coefplot() |
Coefficient forest plot across models |
matplotlib Figure |
binscatter() |
Binned scatter with residualization |
matplotlib Figure |
set_theme() |
Publication themes ('academic', 'aea', 'minimal', 'cn_journal') |
— |
Every result object has:
result.summary() # Formatted text summary
result.plot() # Appropriate visualization
result.to_latex() # LaTeX table
result.to_docx() # Word document
result.cite() # BibTeX citation for the method
Utilities
| Function |
Description |
Stata equivalent |
label_var(), label_vars() |
Variable labeling |
label var |
describe() |
Data description |
describe |
pwcorr() |
Pairwise correlation with significance stars |
pwcorr, star(.05) |
winsor() |
Winsorization |
winsor2 |
read_data() |
Multi-format data reader |
use / import |
Installation
pip install statspai
With optional dependencies:
pip install statspai[plotting] # matplotlib, seaborn
pip install statspai[fixest] # pyfixest for high-dimensional FE
Requirements: Python >= 3.9
Core dependencies: NumPy, SciPy, Pandas, statsmodels, scikit-learn, linearmodels, patsy, openpyxl, python-docx
Quick Example
import statspai as sp
# --- Estimation ---
r1 = sp.regress("wage ~ education + experience", data=df, robust='hc1')
r2 = sp.ivreg("wage ~ (education ~ parent_edu) + experience", data=df)
r3 = sp.did(df, y='wage', treat='policy', time='year', id='worker')
r4 = sp.rdrobust(df, y='score', x='running_var', c=0)
r5 = sp.dml(df, y='wage', treat='training', covariates=['age', 'edu', 'exp'])
r6 = sp.causal_forest("y ~ treatment | x1 + x2 + x3", data=df)
# --- Post-estimation ---
sp.margins(r1, data=df) # Marginal effects
sp.test(r1, "education = experience") # Wald test
sp.oster_bounds(df, y='wage', treat='education', controls=['experience'])
# --- Tables (to Word / Excel / LaTeX) ---
sp.modelsummary(r1, r2, output='table2.docx')
sp.outreg2(r1, r2, r3, filename='results.xlsx')
sp.sumstats(df, vars=['wage', 'education', 'age'], output='table1.docx')
# --- Robustness (unique to StatsPAI) ---
sp.spec_curve(df, y='wage', x='education',
controls=[[], ['experience'], ['experience', 'female']],
se_types=['nonrobust', 'hc1']).plot()
sp.robustness_report(df, formula="wage ~ education + experience",
x='education', extra_controls=['female'],
winsor_levels=[0.01, 0.05]).plot()
sp.subgroup_analysis(df, formula="wage ~ education + experience",
x='education',
by={'Gender': 'female', 'Region': 'region'}).plot()
StatsPAI vs Stata vs R: Honest Comparison
Where StatsPAI wins
| Advantage |
Detail |
| Unified API |
One package, one import, consistent .summary() / .plot() / .to_latex() across all methods. Stata requires paid add-ons; R requires 20+ packages with different interfaces. |
| Modern ML causal methods |
DML, Causal Forest, Meta-Learners (S/T/X/R/DR), TMLE, DeepIV, TARNet/CFRNet/DragonNet, Policy Trees — all in one place. Stata has almost none of these. R has them scattered across incompatible packages. |
| Robustness automation |
spec_curve(), robustness_report(), subgroup_analysis() — no manual re-running. Neither Stata nor R offers this out-of-the-box. |
| Free & open source |
MIT license, $0. Stata costs $695–$1,595/year. |
| Python ecosystem |
Integrates naturally with pandas, scikit-learn, PyTorch, Jupyter, cloud pipelines. |
| Auto-citations |
Every causal method has .cite() returning the correct BibTeX. Neither Stata nor R does this. |
Where Stata still wins
| Advantage |
Detail |
| Battle-tested at scale |
40+ years of production use in economics. Edge cases are well-handled. |
| Speed on very large datasets |
Stata's compiled C backend is faster for simple OLS/FE on datasets with millions of rows. |
| Survey data & complex designs |
svy: prefix, stratification, clustering — Stata's survey support is unmatched. |
| Mature documentation |
Every command has a PDF manual with worked examples. Community is massive. |
| Journal acceptance |
Referees in some fields trust Stata output by default. |
Where R still wins
| Advantage |
Detail |
| Cutting-edge methods |
New econometric methods (e.g., fixest, did2s, HonestDiD) often appear in R first. |
ggplot2 visualization |
R's grammar of graphics is more flexible than matplotlib for complex figures. |
modelsummary |
R's modelsummary is the gold standard for regression tables — StatsPAI's is close but not yet identical. |
| CRAN quality control |
R packages go through peer review. Python packages vary in quality. |
| Spatial econometrics |
spdep, spatialreg — R has a deeper spatial ecosystem. |
API at a Glance
390+ public functions/classes
Regression: regress, ivreg, glm, logit, probit, mlogit, ologit, poisson, nbreg, ppmlhdfe,
tobit, heckman, qreg, truncreg, fracreg, betareg, sureg, three_sls, gmm
IV Advanced: liml, jive, lasso_iv
Panel: panel, panel_logit, panel_probit, panel_fgls, interactive_fe, xtabond, mixed
DID: did, callaway_santanna, sun_abraham, bacon_decomposition, honest_did,
continuous_did, did_multiplegt, did_imputation, stacked_did
RD: rdrobust, rdplot, rddensity, rdmc, rdms, rkd
Matching: match, ebalance, ipw, aipw
Synth: synth, sdid, gsynth, augsynth, staggered_synth, conformal_synth
ML Causal: dml, causal_forest, deepiv, metalearner, tmle
Neural: tarnet, cfrnet, dragonnet
Discovery: notears, pc_algorithm
Policy: policy_tree, policy_value
Survival: cox, kaplan_meier, survreg, logrank_test
Time Series: var, granger_causality, irf, structural_break, johansen, engle_granger
Nonparametric: lpoly, kdensity
Experimental: randomize, balance_check, attrition_test, optimal_design
Imputation: mice, mi_estimate
Frontier: frontier (stochastic frontier analysis)
Structural: blp (BLP demand estimation)
MR: mendelian_randomization, mr_ivw, mr_egger, mr_median
Smart Workflow: recommend, compare_estimators, assumption_audit,
sensitivity_dashboard, pub_ready, replicate
Output: modelsummary, outreg2, sumstats, balance_table, tab, coefplot, binscatter
Release Notes
v0.6.0 (2026-04-05) — Complete Econometrics Toolkit + Smart Workflow Engine
30 new modules, 390+ public API, 860+ tests passing, 83K+ lines of code.
New Regression & GLM:
glm() (6 families × 8 links), logit(), probit(), cloglog(), mlogit(), ologit(), oprobit(), clogit()
poisson(), nbreg(), ppmlhdfe() (gravity model), zip_model(), zinb(), hurdle()
truncreg(), fracreg(), betareg(), biprobit(), etregress()
liml(), jive(), lasso_iv() (advanced IV), sureg(), three_sls(), gmm() (general GMM)
New Panel & Multilevel:
panel_logit(), panel_probit() (FE/RE/CRE), panel_fgls(), interactive_fe() (Bai 2009)
panel_unitroot() (IPS/LLC/Fisher/Hadri), mixed() (multilevel/HLM)
New Survival: cox(), kaplan_meier(), survreg(), logrank_test()
New Time Series: var(), granger_causality(), irf(), structural_break(), cusum_test(), engle_granger(), johansen()
New Causal: continuous_did(), rdmc(), rdms() (geographic RD), distributional_te(), mendelian_randomization()
New Design & Data: randomize(), balance_check(), attrition_test(), optimal_design(), mice(), mi_estimate()
New Structural: blp() (BLP demand estimation), frontier() (stochastic frontier)
Smart Workflow Engine (unique to StatsPAI):
recommend() — data + question → estimator recommendation + workflow
compare_estimators() — multi-method comparison with agreement diagnostics
assumption_audit() — one-call assumption testing with remedies
sensitivity_dashboard() — multi-dimensional sensitivity analysis
pub_ready() — journal-specific publication readiness checklist
replicate() — built-in famous datasets with replication guides
Plot Editor: Font presets redesigned to show actual font names; separate font and size presets for independent per-element control.
v0.5.1 (2026-04-04) — Interactive Plot Editor & Agent Enhancements
v0.4.0 (2026-04-05) — Module Architecture Overhaul
Major refactoring and expansion of core modules (+5,800 lines of new code):
- DID: Added Triple Differences (
ddd()), one-call did_analysis() workflow (auto design detection → Bacon decomposition → estimation → event study → sensitivity), and 8 publication-ready plot functions (parallel_trends_plot, bacon_plot, group_time_plot, enhanced_event_study_plot, treatment_rollout_plot, sensitivity_plot, cohort_event_study_plot)
- Synthetic Control: Modular rewrite —
demeaned_synth(), robust_synth() (penalized SCM), gsynth() (Generalized SCM with interactive fixed effects), staggered_synth() (multi-unit staggered adoption), conformal_synth() (distribution-free inference), and comprehensive synth_plot() / synth_weight_plot() / synth_gap_plot()
- Panel: Major expansion of
panel() — Hausman test, Breusch-Pagan LM, Pesaran CD, Wooldridge autocorrelation, panel unit root tests; added panel_summary_plot(), fe_plot(), re_comparison_plot()
- RD: New
rd_diagnostics() suite — bandwidth sensitivity, placebo cutoffs, donut-hole robustness, covariate balance at cutoff, density test
- IV / 2SLS: Rewritten
ivreg() with proper first-stage diagnostics (Cragg-Donald, Kleibergen-Paap), weak IV detection, Sargan-Hansen overidentification test, Anderson canonical correlation test, Stock-Yogo critical values
- Matching: Enhanced
match() — added CEM (Coarsened Exact Matching), optimal matching, genetic matching; improved balance diagnostics with Love plot and standardized mean difference
- DAG: Expanded
dag() with 15+ built-in example DAGs (dag_example()), dag_simulate() for data generation from causal graphs, backdoor/frontdoor criterion identification
- Causal Impact: Enhanced Bayesian structural time-series with automatic model selection and improved inference
- AI Agent Registry: Expanded
list_functions(), describe_function(), function_schema(), search_functions() for LLM/agent tool-use integration
- CausalResult: Added
.to_json(), .to_dict(), enhanced .summary() formatting
v0.3.1 (2025-12-20)
- Fix PyPI badge displaying stale version
v0.3.0 (2025-12-20) — ML & Advanced Causal Methods
- Meta-Learners: S/T/X/R/DR-Learner for CATE estimation with
compare_metalearners() and CATE diagnostics (gate_test, blp_test)
- Neural Causal Models: TARNet, CFRNet, DragonNet for deep CATE estimation
- Causal Discovery:
notears() (continuous DAG optimization), pc_algorithm() (constraint-based)
- TMLE: Targeted Maximum Likelihood Estimation with Super Learner
- Policy Learning:
policy_tree() optimal treatment rules, policy_value() evaluation
- Conformal Causal: Distribution-free prediction intervals for ITE
- Bayesian Causal Forest:
bcf() with separate prognostic/treatment functions
- Dose-Response: Continuous treatment GPS curves
- Bounds: Lee bounds (sample selection), Manski bounds (partial identification)
- Interference:
spillover() direct + indirect effect decomposition
- DTR:
g_estimation() multi-stage optimal treatment regimes
- Multi-Treatment: AIPW for multi-valued treatments
- Bunching: Kink/notch bunching estimator with elasticity
- Matrix Completion:
mc_panel() nuclear-norm panel estimator
- Robustness:
spec_curve(), robustness_report(), subgroup_analysis()
- New Regression: DeepIV, Heckman selection, quantile regression, Tobit, Arellano-Bond GMM
- New Diagnostics: E-value, Anderson-Rubin weak IV test, Sensemakr, RD density test
- Other: Entropy balancing, Sun-Abraham event study, Bacon decomposition, HonestDiD
v0.2.0 (2025-11-15) — Post-Estimation & Output
- Post-Estimation:
margins(), marginsplot(), test(), lincom()
- Output Tables:
modelsummary(), outreg2(), sumstats(), balance_table(), tab(), coefplot(), binscatter()
- Inference:
wild_cluster_bootstrap(), aipw(), ri_test()
- New Modules: DML, Causal Forest, Matching (PSM/Mahalanobis), Synthetic Control (ADH + SDID), Panel (FE/RE/FD), Causal Impact, Mediation, Bartik IV
- Diagnostics:
oster_bounds(), mccrary_test(), hausman_test(), het_test(), reset_test(), vif()
- Utilities: Variable labeling,
describe(), pwcorr(), winsor(), read_data()
v0.1.0 (2025-10-01) — Initial Release
- Core regression:
regress() OLS with robust/clustered/HAC standard errors
- Instrumental variables:
ivreg() 2SLS
- Difference-in-Differences:
did(), did_2x2(), callaway_santanna()
- Regression discontinuity:
rdrobust()
- Unified
CausalResult object with .summary(), .plot(), .to_latex(), .to_docx(), .cite()
About
StatsPAI Inc. is the research infrastructure company behind CoPaper.AI — the AI co-authoring platform for empirical research, born out of Stanford's REAP program.
CoPaper.AI — Upload your data, set your research question, and produce a fully reproducible academic paper with code, tables, and formatted output. Powered by StatsPAI under the hood. copaper.ai
Team:
- Bryce Wang — Founder. Economics, Finance, CS & AI. Stanford REAP.
- Dr. Scott Rozelle — Co-founder & Strategic Advisor. Stanford Senior Fellow, author of Invisible China.
Contributing
git clone https://github.com/brycewang-stanford/statspai.git
cd statspai
pip install -e ".[dev,plotting,fixest]"
pytest
Citation
@software{wang2025statspai,
title={StatsPAI: The Causal Inference & Econometrics Toolkit for Python},
author={Wang, Bryce},
year={2025},
url={https://github.com/brycewang-stanford/statspai},
version={0.6.0}
}
License
MIT License. See LICENSE.
GitHub · PyPI · User Guide · CoPaper.AI