Aer Statspai logo

Aer Statspai

Community
brycewang-stanford
aer-statspai

Use when aer-identification has fixed the design, after methodology choice and before aer-robustness or aer-tables-figures, to run an AER-track analysis with StatsPAI — the agent-native Python engine and MCP server for causal inference, robustness, sensitivity, and publication-ready table export.

Overview

Publisherbrycewang-stanford
RepositoryAER-Skills
Skill nameaer-statspai
Stars
62
Forks
11
Bundled files
1
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 1 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by brycewang-stanford on GitHub. Read the source before you install it.

Installation

Install the Aer Statspai AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/brycewang-stanford/AER-Skills/tree/main/skills/aer-statspai
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/brycewang-stanford/AER-Skills.git /tmp/AER-Skills
mkdir -p .claude/skills
cp -r /tmp/AER-Skills/skills/aer-statspai .claude/skills/aer-statspai
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Aer Statspai in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Aer Statspai on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Aer Statspai is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

AER StatsPAI

Overview

aer-statspai is the implementation engine option for this stack. Where aer-identification and aer-robustness decide which estimator and which diagnostics a referee will demand, this skill is about running them — through StatsPAI, an open-source, agent-native Python platform that exposes 1,000+ causal-inference and econometrics functions behind one unified API, plus a machine-readable MCP server an agent can drive directly.

It is one more choice, not a replacement. The Stata / R / Python templates in templates/ remain the default for users who want drop-in, version-pinned scripts. Reach for StatsPAI when you want a single Python surface that covers the whole AER identification toolkit, self-describes its assumptions to an agent, and exports publication-ready LaTeX / Word / Excel tables from the estimator object.

This skill does not override the methodology. The modern-default rules in aer-identification (no TWFE on staggered data, Anderson-Rubin under weak IV, local-linear RDD, placebo inference for SCM) still bind. StatsPAI executes those rules; it does not relax them.

When to Use

  • You want to run the empirical analysis interactively from the agent, not just receive template code to run later by hand
  • You want one Python dependency covering DiD, IV, RDD, SCM, matching, DML, and causal forests instead of stitching together fixest, did, rdrobust, linearmodels, and scdata
  • A StatsPAI MCP server is connected (tools prefixed statspai) and you can chain detect_design → recommend → fit → audit_result → sensitivity → bibtex
  • You need publication-ready tables straight from the estimator object (.to_latex(), .to_docx(), .to_excel()) to hand to aer-tables-figures

When NOT to Use

  • The deposited replication package must be Stata-only (some coauthors / Data Editor workflows assume .do files) → use templates/stata/
  • You want exact, pinned, language-native scripts to commit verbatim into an openICPSR deposit → use templates/python/, templates/r/, or templates/stata/
  • The methodological choice is the open question — go to aer-identification first; come back here to execute once the design is fixed

Install and Connect

Two ways to use StatsPAI; they share the same estimators.

bash
pip install statspai
python
import statspai as sp

df = sp.datasets.mpdta()                       # bundled teaching panel
cs = sp.callaway_santanna(data=df, y="lemp", t="year",
                          i="countyreal", g="first_treat")
print(sp.aggte(cs, type="simple").summary())   # staggered-robust ATT

Agent-native (MCP) path. When a StatsPAI MCP server is connected, the agent calls the same methods as tools (statspai namespace) and gets back structured result handles instead of parsing console output. This is the preferred path inside an agent loop because every function publishes its assumptions, preconditions, and failure modes for the agent to read before it runs.

Recommended Agent-Native Workflow

Drive the MCP server as a chain, not as one-shot calls. Pass as_handle=true (or detail='agent') so each step returns a result_id the next step consumes — no need to ferry betas, standard errors, or covariance matrices by hand.

  1. detect_design — infer the study shape (DiD / IV / RDD / SCM / panel), or pass design= explicitly when you already know it.
  2. preflight + recommend — surface design problems (no never-treated group, weak first stage, manipulation at the cutoff) and let the engine propose the modern-default estimator.
  3. Fit with as_handle=true — e.g. callaway_santanna, ivreg, rdrobust, synth. You get a result_id you can chain downstream.
  4. audit_result(result_id=...) — enumerate the robustness checks still missing; for each, call the suggest_function it emits. This is the referee-anticipation step from aer-robustness, automated.
  5. honest_did_from_result / sensitivity_from_result — design-specific sensitivity (Rambachan-Roth honest bounds, Oster δ, etc.) directly off the handle.
  6. bibtex(keys=[...]) — pull verified citations for every estimator and diagnostic you used. Never invent references — paper.bib is the single source of truth.

Token economy: pass detail='minimal' on cheap sub-step calls; the default detail='agent' carries the violations list and next_steps you actually need.

Worked Execution Snapshot

Before handing results to aer-robustness, leave this shape:

text
DESIGN: staggered DiD; n = 48,212; cohorts = 37
RESULT: ATT = -0.042; SE = 0.011; pretrend p = 0.64
AUDIT: forbidden weight = 0.31; honest-DiD Mbar=1 bound [-0.071, -0.009]
DECISION: advance only if template cross-check agrees within 0.002

Mapping AER Identification Strategies to StatsPAI

Each row keeps the modern default from aer-identification; StatsPAI is the execution surface.

StrategyModern default (see aer-identification)StatsPAI entry point
Staggered DiDCallaway-Sant'Anna ATT(g,t); never raw TWFEcallaway_santanna, aggte, did_imputation, sun_abraham, did_multiplegt, lp_did
Forbidden-comparison checkGoodman-Bacon decompositionbacon_decomposition, bacon_plot
Event study / pre-trendsJoint pre-period test, not just the plotevent_study, pretrends_test, honest_did
IV / weak instrumentsAnderson-Rubin, not first-stage F > 10ivreg, anderson_rubin_ci, effective_f_test, tF_adjustment
Shift-share / BartikRotemberg weights or shock-level inferencebartik
RDDLocal-linear, MSE-optimal bandwidth, RBC CIrdrobust, rdbwselect, rdplot, rddensity (McCrary)
Synthetic controlPlacebo inference; modern variantssynth, gsynth, augsynth, sdid, synth_time_placebo, synth_loo
Factor-model counterfactualsInteractive FE / matrix completion for larger treated blocksinteractive_fe, matrix_completion
Bunching / kink designsExcess mass over a polynomial counterfactualbunching, notch
DML / causal MLCross-fit nuisance; honest CIsdml, causal_forest, metalearner, tmle, aipw
Distributional effectsQuantile treatment effects when the mean hides the actionqte
Robustness / few-cluster inferenceSpecification curve; cluster-robust variance; exact randomization testsspec_curve, wild_cluster_bootstrap, twoway_cluster, conley, ri_test
Sensitivity to confounding / multiplicityOster δ-R²; Cinelli-Hazlett robustness value; FWER controloster_delta, oster_bounds, robustness_value, romano_wolf
Partial identification under attritionLee (2009) trimming bounds when selection is differentiallee_bounds

When in doubt about whether an estimator is appropriate, that decision belongs to aer-identification. This table is for how to run the one you've chosen.

Robustness, Heterogeneity, Sensitivity

audit_result is the bridge to aer-robustness: it reads the fitted handle and lists the checks a referee will expect — placebo, alternative samples, heterogeneity by cohort, leave-one-out for SCM — emitting a suggest_function for each. Drive that list to closure rather than guessing which robustness checks to add.

For design-specific sensitivity, prefer the *_from_result tools so you never re-specify the model:

  • honest_did_from_result — Rambachan-Roth (2023) honest bounds for DiD
  • sensitivity_from_result — Oster (2019) δ / unobserved-confounding bounds
  • robustness_value — Cinelli-Hazlett (2020) partial-R² robustness value and bias factor
  • lee_bounds — Lee (2009) trimming bounds under differential attrition
  • evalue_from_result — E-value for observational designs

Publication Export — Hand Off to aer-tables-figures

StatsPAI result objects export directly, which removes manual table assembly:

python
res.to_latex("output/tables/table3.tex")   # AER booktabs-compatible
res.to_docx("output/tables/table3.docx")
res.to_excel("output/tables/table3.xlsx")

The house-style rules still come from aer-tables-figures — column count, note structure, significance-star policy, and the booktabs conventions. Use StatsPAI to emit the table; use aer-tables-figures to decide what the table should look like before you ship it.

Validation Status — Read It Before Trusting a Number

StatsPAI labels every function with a validation_status. Treat these as a trust tier, not decoration:

  • Certified numerical evidence (benchmarked against Stata / R reference implementations) → safe for a main specification.
  • API-stable breadth (broad coverage, not yet numerically certified end-to-end) → fine for exploration; re-run the headline result against a reference implementation (templates/) before it becomes a main table in a top-5 submission.

For an AER main result, cross-check at least the headline coefficient and its inference against the language-native template. Convergent numbers across two engines is itself a robustness signal a referee will respect.

Red Flags

  • Reporting a StatsPAI estimate as a main AER specification without confirming its validation_status is certified or cross-checking against templates/
  • Letting the unified API tempt you into a worse estimator than aer-identification prescribes (e.g. plain TWFE because it is one call)
  • Skipping audit_result and hand-picking robustness checks — the whole point of the agent-native loop is that it enumerates what you missed
  • Pasting a citation StatsPAI did not return from bibtex — verified keys only

Repository Resources

When working from the AER-skills repository or plugin bundle, load only the relevant resource:

  • Estimator defaults, diagnostics, and primary citations: docs/methods-reference.md
  • The methodological decision that precedes execution: skills/aer-identification/SKILL.md
  • Referee-anticipating checks audit_result should reproduce: skills/aer-robustness/SKILL.md
  • House-style rules for the tables StatsPAI emits: skills/aer-tables-figures/SKILL.md
  • Reference Python implementation to cross-check headline numbers: templates/python/main_did.py
  • Pinned reference-engine dependencies: templates/python/requirements.txt

Use aer-identification to fix the design before running anything here; use docs/methods-reference.md to confirm the estimand, diagnostic, and citation the manuscript must report.

Handoff

text
ENGINE: StatsPAI (python-api | mcp)
DESIGN: <DiD | IV | RDD | SCM | DML | ...>
ESTIMATOR FUNCTION: <statspai function used>
VALIDATION STATUS: <certified | api-stable — cross-checked? yes/no>
AUDIT_RESULT CHECKS CLOSED: <list or "none">
SENSITIVITY RUN: <honest_did | oster | evalue | none>
TABLES EXPORTED: <paths or "none">
NEXT SKILL: aer-robustness (close audit) → aer-tables-figures (house style)

Anti-Patterns

  • Treating aer-statspai as a substitute for aer-identification — it executes the design, it does not choose it
  • Shipping an api-stable result as a main top-5 table with no reference cross-check
  • Using the unified API to add a fifth "robustness" estimator that shares the same identifying variation as the main result and calling it confirmation
  • Exporting a table from StatsPAI and skipping aer-tables-figures — the engine emits a table, it does not enforce AER house style

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Aer Statspai AI skill do?

Use when aer-identification has fixed the design, after methodology choice and before aer-robustness or aer-tables-figures, to run an AER-track analysis with StatsPAI — the agent-native Python engine and MCP server for causal inference, robustness, sensitivity, and publication-ready table export.

Why use Aer Statspai on TypingMind?

Because you install it once and use it with any model. Aer Statspai is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Aer Statspai in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/brycewang-stanford/AER-Skills/tree/main/skills/aer-statspai. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Aer Statspai?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Aer Statspai?

As many as you like. As long as a model supports skills, you can use Aer Statspai with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Aer Statspai AI skill free?

Yes. It is published on GitHub by brycewang-stanford under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇