关于 stata
面向编码 Agent 的 Stata 参考技能,按任务索引文档并提示常见陷阱,也说明如何批量运行 Stata 脚本及检查日志。
主要功能
- 01按任务索引参考文档
- 02提示 Stata 常见陷阱
- 03批量运行 .do 文件
- 04检查日志与结果
适用场景
- 01编写数据管理命令
- 02选择统计或计量方法
- 03在终端运行分析脚本
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ dylantmoore/ stata-skill --skill stata安装后在 Claude Code 中输入/stata确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
packages/asdoc.mdbinsreg.mdcoefplot.mddata-manipulation.mddiagnostics.mddid.mdestout.mdevent-study.mdgraph-schemes.mdivreg2.mdnprobust.mdoutreg2.mdpackage-management.mdpsmatch2.mdrdrobust.mdreghdfe.mdsynth.mdtabout.mdwinsor.mdxtabond2.mdreferences/advanced-programming.mdbasics-getting-started.mdbootstrap-simulation.mddata-import-export.mddata-management.mddate-time-functions.mddescriptive-statistics.mddifference-in-differences.mdexternal-tools-integration.mdfiling-issues.md详细介绍
Stata 技能
你可以访问全面的 Stata 参考文件。不要加载所有文件。 请根据下方路由表,只读取与用户当前任务相关的 1-3 个文件。
关键注意事项
这些是 Stata 特有的陷阱,可能导致隐蔽的错误。编写任何代码前,请牢记这些事项。
缺失值排序为 +Infinity
Stata 的 .(以及 .a-.z)大于所有数字。
* WRONG — includes observations where income is missing!
gen high_income = (income > 50000)
* RIGHT
gen high_income = (income > 50000) if !missing(income)
* WRONG — missing ages appear in this list
list if age > 60
* RIGHT
list if age > 60 & !missing(age)
= 与 ==
= 表示赋值;== 表示比较。混淆二者会导致语法错误或隐蔽的错误。
* WRONG — syntax error
gen employed = 1 if status = 1
* RIGHT
gen employed = 1 if status == 1
本地宏语法
本地宏使用 `name'(反引号 + 单引号)。全局宏使用 $name 或 ${name}。
忘记闭合引号是最常见的宏错误。
local controls "age education income"
regress wage `controls' // correct
regress wage `controls // WRONG — missing closing quote
regress wage 'controls' // WRONG — wrong quote characters
by 需要预先排序(使用 bysort)
* WRONG — error if data not sorted by id
by id: gen first = (_n == 1)
* RIGHT — bysort sorts automatically
bysort id: gen first = (_n == 1)
* Also RIGHT — explicit sort
sort id
by id: gen first = (_n == 1)
因子变量表示法(i. 和 c.)
分类变量使用 i.,连续变量使用 c.。省略 i. 会将分类变量视为连续变量。
* WRONG — treats race as continuous (e.g., race=3 has 3x effect of race=1)
regress wage race education
* RIGHT — creates dummies automatically
regress wage i.race education
* Interactions
regress wage i.race##c.education // full interaction
regress wage i.race#c.education // interaction only (no main effects)
generate 与 replace
generate 用于创建新变量;replace 用于修改现有变量。对已存在的变量名使用 generate 会报错。
gen x = 1
gen x = 2 // ERROR: x already defined
replace x = 2 // correct
字符串比较区分大小写
* May miss "Male", "MALE", etc.
keep if gender == "male"
* Safer
keep if lower(gender) == "male"
始终检查 merge 的 _merge
绝不要跳过 tab _merge——这不会增加任何成本,而且在 assert 失败时,这是唯一的诊断信息。
merge 1:1 id using other.dta
tab _merge // ALWAYS tab before assert
assert _merge == 3 // fails silently without tab output
drop _merge
使用 preserve / restore 和 tempfile 进行汇总-合并-还原
计算分组统计量并将其合并回原始数据的标准模式:
tempfile stats
preserve
collapse (mean) avg_x=x, by(group)
save `stats'
restore
merge m:1 group using `stats'
tab _merge
assert _merge == 3
drop _merge
对于简单的分组均值,bysort group: egen avg_x = mean(x) 可以完全避免这一来回操作。
权重不可互换
fweight— 频数权重(复制)aweight— 分析/回归权重(方差倒数)pweight— 概率/抽样权重(调查数据,意味着使用稳健标准误)iweight— 重要性权重(很少使用)
capture 会吞掉错误
capture some_command
if _rc != 0 {
di as error "Failed with code: " _rc
exit _rc
}
使用 /// 续行
regress y x1 x2 x3 ///
x4 x5 x6, ///
vce(robust)
存储结果:r()、e() 与 s()
r()— r 类命令(summarize、tabulate 等)e()— e 类命令(估计:regress、logit 等)s()— s 类命令(解析)
新的估计命令会覆盖之前的 e() 结果。请先保存:
regress y x1 x2
estimates store model1
从命令行运行 Stata
Claude 可以通过在终端中以批处理模式运行 .do 文件来执行 Stata 代码。以下介绍如何以非交互方式运行 Stata。
查找 Stata 二进制文件
macOS 上的 Stata 是一个 .app 应用包,实际的二进制文件位于其中。常见位置:
# Stata 18 / StataNow (most common)
/Applications/Stata/StataMP.app/Contents/MacOS/stata-mp
/Applications/StataNow/StataMP.app/Contents/MacOS/stata-mp
# Other editions (SE, BE)
/Applications/Stata/StataSE.app/Contents/MacOS/stata-se
/Applications/Stata/StataBE.app/Contents/MacOS/stata-be
如果 Stata 不在 $PATH 中,可通过以下命令查找:mdfind -name "stata-mp" | grep MacOS
批处理模式(-b)
# Run a .do file in batch mode — output goes to <filename>.log
/Applications/Stata/StataMP.app/Contents/MacOS/stata-mp -b do analysis.do
# If stata-mp is on PATH (e.g., via symlink or alias):
stata-mp -b do analysis.do
-b= 批处理模式(非交互式,无 GUI)- 所有 Stata 本应显示的输出都会写入工作目录中的
analysis.log - 成功时退出代码为 0,出错时为非零
- 日志文件包含所有输出,包括错误消息——执行后请检查日志
运行内联 Stata 代码
若要快速运行一段 Stata 代码,而不创建 .do 文件:
# Write a temp .do file and run it
cat > /tmp/stata_run.do << 'EOF'
sysuse auto, clear
summarize price mpg
EOF
stata-mp -b do /tmp/stata_run.do
cat /tmp/stata_run.log
检查结果
# Check if it succeeded
stata-mp -b do tests/run_tests.do && echo "SUCCESS" || echo "FAILED"
# Search the log for pass/fail
grep -E "PASS|FAIL|error|r\([0-9]+\)" run_tests.log
提示
- 在批处理脚本顶部使用
clear all— 批处理模式会启动全新的 Stata 会话,但clear all可确保同一会话中先前运行遗留的状态不会影响当前运行。 - 使用
set more off— 防止 Stata 因--more--提示而暂停(这在批处理模式下会造成致命问题)。 - 日志文件会静默覆盖 —
analysis.do始终会在当前目录中写入analysis.log。如果运行多个.do文件,请确认检查的是正确的日志。 - 工作目录 — Stata 的工作目录是运行命令时所在的位置,而不是
.do文件所在的位置。必要时,请在.do文件中使用cd或绝对路径。
路由表
只读取与用户任务相关的文件。路径相对于此 SKILL.md 文件。
数据操作
| 文件 | 主题与关键命令 |
|---|---|
references/basics-getting-started.md | use、save、describe、browse、sysuse、基本工作流 |
references/data-import-export.md | import delimited、import excel、ODBC、export、网络数据 |
references/data-management.md | generate、replace、merge、append、reshape、collapse、recode、egen、encode/decode |
references/variables-operators.md | 变量类型、byte/int/long/float/double、运算符、缺失值(.<.a)、if/in 限定符 |
references/string-functions.md | substr()、regexm()、strtrim()、split、ustrlen()、正则表达式、Unicode |
references/date-time-functions.md | date()、clock()、%td/%tc 格式、mdy()、dofm()、商务日历 |
references/mathematical-functions.md | round()、log()、exp()、abs()、mod()、cond()、分布、随机数 |
统计与计量经济学
| 文件 | 主题与关键命令 |
|---|---|
references/descriptive-statistics.md | summarize、tabulate、correlate、tabstat、codebook、加权统计量 |
references/linear-regression.md | regress、vce(robust)、vce(cluster)、test、lincom、margins、predict、ivregress |
references/panel-data.md | xtset、xtreg fe/re、Hausman 检验、xtabond、动态面板 |
references/time-series.md | tsset、ARIMA、VAR、dfuller、pperron、irf、预测 |
references/limited-dependent-variables.md | logit、probit、tobit、poisson、nbreg、mlogit、ologit、非线性模型的 margins |
references/bootstrap-simulation.md | bootstrap、simulate、permute、蒙特卡洛 |
references/survey-data-analysis.md | svyset、svy:、subpop()、复杂抽样设计、重复权重 |
references/missing-data-handling.md | mi impute、mi estimate、FIML、misstable、诊断 |
references/maximum-likelihood.md | ml model、自定义似然函数、ml init、基于梯度的优化 |
references/gmm-estimation.md | gmm、矩条件、estat overid、J 检验 |
因果推断
| 文件 | 主题与关键命令 |
|---|---|
references/treatment-effects.md | teffects ra/ipw/ipwra/aipw、stteffects、ATE/ATT/ATET |
references/difference-in-differences.md | DiD、平行趋势、事件研究、错位实施 |
references/regression-discontinuity.md | 精确/模糊 RD、带宽选择、rdplot |
references/matching-methods.md | PSM、最近邻、核匹配、teffects nnmatch |
references/sample-selection.md | heckman、heckprobit、处理模型、排除限制 |
高级方法
| 文件 | 主题与关键命令 |
|---|---|
references/survival-analysis.md | stset、stcox、streg、Kaplan-Meier、参数模型 |
references/sem-factor-analysis.md | sem、gsem、CFA、路径分析、alpha、信度 |
references/nonparametric-methods.md | kdensity、秩检验、qreg、npregress |
references/spatial-analysis.md | spmatrix、spregress、空间权重、Moran's I |
references/machine-learning.md | lasso、elasticnet、cvlasso、交叉验证 |
图形
| 文件 | 主题与关键命令 |
|---|---|
references/graphics.md | twoway、scatter、line、bar、histogram、graph combine、graph export、方案 |
编程
| 文件 | 主题与主要命令 |
|---|---|
references/programming-basics.md | local、global、foreach、forvalues、program define、syntax、return |
references/advanced-programming.md | syntax、mata、类、_prefix、对话框、tempfile/tempvar |
references/mata-introduction.md | Mata 基础知识、何时使用 Mata 而非 ado、数据类型 |
references/mata-programming.md | Mata 函数、流程控制、结构、指针 |
references/mata-matrix-operations.md | 矩阵创建、分解、求解器、st_matrix() |
references/mata-data-access.md | st_data()、st_view()、st_store()、性能提示 |
输出与工作流
| 文件 | 主题与主要命令 |
|---|---|
references/tables-reporting.md | putexcel、putdocx、putpdf、LaTeX 集成、collect |
references/workflow-best-practices.md | 项目结构、主 do 文件、版本控制、调试、常见错误 |
references/external-tools-integration.md | 通过 python: 使用 Python、通过 rsource 使用 R、shell 命令、Git |
references/filing-issues.md | 用户想向代码库报告 Stata 技能文档中的缺漏或错误 |
社区程序包
| 文件 | 功能 |
|---|---|
packages/reghdfe.md | 高维固定效应 OLS(高效吸收多组固定效应) |
packages/estout.md | esttab/estout:达到出版质量的回归表格 |
packages/outreg2.md | 另一种回归表格导出工具(Word、Excel、TeX) |
packages/asdoc.md | 一条命令即可将任意 Stata 输出创建为 Word 文档 |
packages/tabout.md | 将交叉表和汇总表导出到文件 |
packages/coefplot.md | 根据已存储的估计结果绘制系数图 |
packages/graph-schemes.md | grstyle、schemepack、plotplain——更好的图形主题 |
packages/did.md | 现代 DiD:csdid、did_multiplegt、did_imputation(Callaway-Sant'Anna、de Chaisemartin-D'Haultfoeuille、Borusyak-Jaravel-Spiess) |
packages/event-study.md | eventstudyinteract、eventdd——事件研究估计器 |
packages/rdrobust.md | 使用最优带宽进行稳健 RD 估计(rdrobust、rdplot、rdbwselect) |
packages/psmatch2.md | 倾向得分匹配(最近邻、核、半径) |
packages/synth.md | 合成控制法(synth、synth_runner) |
packages/ivreg2.md | 增强型 IV/2SLS:ivreg2、xtivreg2,附带额外诊断功能 |
packages/xtabond2.md | 动态面板 GMM(Arellano-Bond/Blundell-Bond) |
packages/binsreg.md | 带置信区间的分箱散点图(binsreg、binstest) |
packages/nprobust.md | 非参数核估计与推断 |
packages/diagnostics.md | bacondecomp、xttest3、共线性与异方差检验 |
packages/winsor.md | 缩尾处理与修剪:winsor2、winsor |
packages/data-manipulation.md | gtools(快速 collapse/egen)、rangestat、egenmore |
packages/package-management.md | ssc install、net install、ado update、查找程序包 |
常见模式
回归表格工作流
* Estimate models
eststo clear
eststo: regress y x1 x2, vce(robust)
eststo: regress y x1 x2 x3, vce(robust)
eststo: regress y x1 x2 x3 x4, vce(cluster id)
* Export table
esttab using "results.tex", replace ///
se star(* 0.10 ** 0.05 *** 0.01) ///
label booktabs ///
title("Main Results") ///
mtitles("(1)" "(2)" "(3)")
面板数据设置
xtset panelid timevar // declare panel structure
xtdescribe // check balance
xtsum outcome // within/between variation
* Fixed effects
xtreg y x1 x2, fe vce(cluster panelid)
* Or with reghdfe (preferred for multiple FE)
reghdfe y x1 x2, absorb(panelid timevar) vce(cluster panelid)
双重差分
* Classic 2x2 DiD
gen post = (year >= treatment_year)
gen treat_post = treated * post
regress y treated post treat_post, vce(cluster id)
* Event study (uniform timing — must interact with treatment group)
reghdfe y ib(-1).rel_time#1.treated, absorb(id year) vce(cluster id)
testparm *.rel_time#1.treated // pre-trend test
* Modern staggered DiD (Callaway & Sant'Anna)
csdid y x1 x2, ivar(id) time(year) gvar(first_treat) agg(event)
csdid_plot
图形导出
* Publication-quality scatter with fit line
twoway (scatter y x, mcolor(navy%50) msize(small)) ///
(lfit y x, lcolor(cranberry) lwidth(medthick)), ///
title("Title Here") ///
xtitle("X Label") ytitle("Y Label") ///
legend(off) scheme(s2color)
graph export "figure1.pdf", replace as(pdf)
graph export "figure1.png", replace as(png) width(2400)
数据清理流程
* Load and inspect
import delimited "raw_data.csv", clear varnames(1)
describe
codebook, compact
* Clean
rename *, lower // lowercase all varnames
destring income, replace force // convert string to numeric
replace income = . if income < 0
* Label
label variable income "Annual household income (USD)"
label define yesno 0 "No" 1 "Yes"
label values employed yesno
* Save
compress
save "clean_data.dta", replace
多重插补
mi set mlong
mi register imputed income education
mi impute chained (regress) income (ologit) education = age i.gender, add(20) rseed(12345)
mi estimate: regress wage income education age i.gender
帮助改进此技能
如果你生成的 Stata 代码存在重大错误——例如语法错误、命令用法不正确,或遗漏了容易踩的坑——而且问题似乎源于这些参考文件存在缺漏,而非偶发失误,请考虑建议用户在该技能的代码仓库中提交 issue。这有助于帮助未来的用户。
**何时提出:**仅在你已经纠正错误且用户已有可用代码后再提出。将其表述为可选建议:“我在 [X] 上犯了错误,我认为这是因为 Stata 技能文档存在缺漏。如果你愿意,我可以帮你提交 issue 或 PR,让大家都能受益。”
**何时不要提出:**如果用户使用的是 Claude Haiku,那么错误更可能是模型能力所致,而非文档缺漏。在这种情况下,建议用户改用 Sonnet 或 Opus 处理复杂的 Stata 工作,而不是提交 issue。
如果用户同意,请阅读 references/filing-issues.md,了解如何撰写优质的 issue 报告。