pipeline
Classical end-to-end empirical analysis workflow in the traditional Python econometric stack โ pandas + numpy + scipy +โฆ
Quality assurance and testing protocols for statistical software
Claude Code
$ npx -y skills add brycewang-stanford/Auto-Empirical-Research-Skills --skill statistical-software-qa --agent claude-code
Codex
$ npx skills add brycewang-stanford/Auto-Empirical-Research-Skills --skill statistical-software-qa -a codex -y
Cursor
$ npx skills add brycewang-stanford/Auto-Empirical-Research-Skills --skill statistical-software-qa -a cursor -y
Gemini CLI
$ npx skills add brycewang-stanford/Auto-Empirical-Research-Skills --skill statistical-software-qa -a gemini-cli -y
GitHub Copilot
$ npx skills add brycewang-stanford/Auto-Empirical-Research-Skills --skill statistical-software-qa -a github-copilot -y
OpenCode
$ npx skills add brycewang-stanford/Auto-Empirical-Research-Skills --skill statistical-software-qa -a opencode -y
Windsurf
$ npx skills add brycewang-stanford/Auto-Empirical-Research-Skills --skill statistical-software-qa -a windsurf -y
name: statistical-software-qa description: Quality assurance and testing protocols for statistical software
**Quality assurance patterns and testing strategies for statistical R packages**
Use this skill when working on: R package testing, numerical accuracy validation, reference implementation comparison, edge case identification, statistical correctness verification, or software quality assurance for methodology packages.
---
Unlike typical software where "correct output" is clear, statistical software must:
1. **Produce statistically correct results** - Not just bug-free 2. **Handle edge cases gracefully** - Small samples, boundary conditions 3. **Maintain numerical precision** - Floating-point considerations 4. **Match known results** - Verification against published examples 5. **Degrade gracefully** - Informative errors, not crashes
โฒ
/โ\
/ โ \
/ โ \
/Manualโ\ <- Human review of outputs
/ Tests โ \
/โโโโโโโโโโโโโ\
/ Integration \ <- Cross-function workflows
/ Tests \
/โโโโโโโโโโโโโโโโโโโ\
/ Statistical Tests \ <- Correctness verification
/ \
/โโโโโโโโโโโโโโโโโโโโโโโโโ\
/ Reference Tests \ <- Match known results
/ \
/โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\
/ Unit Tests \ <- Individual functions
/___________________________________\---
Test against analytically derivable results:
test_that("indirect effect equals a*b for simple mediation", {
# Create data where we know true values
set.seed(42)
n <- 10000
x <- rnorm(n)
m <- 0.5 * x + rnorm(n, sd = 0.1) # a = 0.5
y <- 0.3 * m + rnorm(n, sd = 0.1) # b = 0.3
result <- mediate(y ~ x + m, mediator = "m", data = data.frame(x, m, y))
# True indirect = 0.5 * 0.3 = 0.15
expect_equal(result$indirect, 0.15, tolerance = 0.02)
})test_that("handles minimum sample size", {
# Minimum viable sample
small_data <- data.frame(
x = c(0, 0, 1, 1),
m = c(0, 1, 1, 2),
y = c(1, 2, 2, 3)
)
# Should work without error
expect_no_error(mediate(y ~ x + m, mediator = "m", data = small_data))
# Should warn about low power
expect_warning(
mediate(y ~ x + m, mediator = "m", data = small_data),
"sample size"
)
})test_that("bootstrap CI contains delta method CI asymptotically", {
set.seed(123)
data <- simulate_mediation(n = 5000, a = 0.3, b = 0.4)
boot_result <- mediate(data, method = "bootstrap", R = 2000)
delta_result <- mediate(data, method = "delta")
# CIs should be similar for large n
expect_equal(boot_result$ci, delta_result$ci, tolerance = 0.05)
})---
test_that("matches Imai et al. (2010) JOBS II example",
# Load reference data from mediation package
data("jobs", package = "mediation")
# Our implementation
our_result <- our_mediate(
outcome = job_seek ~ treat + econ_hard + sex + age,
mediator = job_disc ~ treat + econ_hard + sex + age,
data = jobs
)
# Published results (from paper Table 2)
expected_acme <- 0.015
expected_acme_ci <- c(-0.004, 0.035)
expect_equal(our_result$acme, expected_acme, tolerance = 0.005)
expect_equal(our_result$acme_ci, expected_acme_ci, tolerance = 0.01)
})test_that("matches lavaan for SEM-based mediation", {
data <- simulate_mediation(n = 1000)
# Our implementation
our_result <- our_mediate(data)
# lavaan implementation
library(lavaan)
model <- '
m ~ a*x
y ~ b*m + c*x
indirect := a*b
'
lavaan_fit <- sem(model, data = data)
lavaan_indirect <- parameterEstimates(lavaan_fit)[
parameterEstimates(lavaan_fit)$label == "indirect", "est"
]
expect_equal(our_result$indirect, lavaan_indirect, tolerance = 0.01)
})---
Verify confidence intervals achieve nominal coverage:
test_that("95% CI achieves nominal coverage", {
set.seed(42)
n_sims <- 1000
true_indirect <- 0.15
coverage <- 0
for (i in 1:n_sims) {
data <- simulate_mediation(n = 200, a = 0.5, b = 0.3)
result <- mediate(data, conf.level = 0.95)
if (result$ci[1] <= true_indirect && true_indirect <= result$ci[2]) {
coverage <- coverage + 1
}
}
coverage_rate <- coverage / n_sims
# Coverage should be between 93% and 97% (accounting for MC error)
expect_gte(coverage_rate, 0.93)
expect_lte(coverage_rate, 0.97)
})test_that("estimator is approximately unbiased", {
set.seed(123)
n_sims <- 500
true_indirect <- 0.2
estimates <- numeric(n_sims)
for (i in 1:n_sims) {
data <- simulate_mediation(n = 500, a = 0.5, b = 0.4)
estimates[i] <- mediate(data)$indirect
}
# Mean should be close to true value
bias <- mean(estimates) - true_indirect
expect_lt(abs(bias), 0.02) # Less than 2% bias
})test_that("maintains nominal Type I error under null", {
set.seed(456)
n_sims <- 1000
rejections <- 0
for (i in 1:n_sims) {
# Null: no indirect effect (a = 0)
data <- simulate_mediation(n = 200, a = 0, b = 0.5)
result <- mediate(data, conf.level = 0.95)
# Reject if CI excludes 0
if (result$ci[1] > 0 || result$ci[2] < 0) {
rejections <- rejections + 1
}
}
type1_rate <- rejections / n_sims
# Should be close to 5%
expect_lt(type1_rate, 0.07) # Allow some MC error## ๐ฅ ๅ่ ยท StatsPAI โ Stata ไธ R ็ Python ๅนณๆฟ๏ผไธบ AI Agent ่็ ๐ Stata / R ๅนณๆฟ๏ผreghdfeใcsdidใrdrobustใsynthใfixestใdid ็ญๅธธ็จๅฝไปคๅจ Python ไธญไธ็ซๅผๆฟไปฃ๏ผไธไธช import statspai as sp ๆๅฎ DID / RD / IV / SCM / DML / matching ๐ค ้ขๅ Agent ่ฎพ่ฎก๏ผ็ปๆๅ็ปๆๅฏน่ฑก + ๅ ็ฝฎ MCP Server๏ผClaude / Codex
Classical end-to-end empirical analysis workflow in the traditional Python econometric stack โ pandas + numpy + scipy +โฆ
Use when the user asks to run a full empirical / causal analysis in Python โ by default in the style of an applied economicsโฆ
Classical end-to-end empirical analysis workflow in the traditional Python econometric stack โ pandas + numpy + scipy +โฆ
Classical end-to-end empirical analysis workflow in the traditional Stata ecosystem โ native Stata + reghdfe + ivreg2 + csdid +โฆ
Classical end-to-end empirical analysis workflow in the modern tidyverse + econometrics R ecosystem โ dplyr + tidyr + haven +โฆ
Systematic writing framework for philosophy and interdisciplinary academic papers from optimized outline to submission-readyโฆ
Direct browser control via CDP for web interaction: automation, scraping, testing, screenshots, and site/app work. Also coversโฆ
Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, fillingโฆ