简介这是一份面向经济学、管理学及其他社科领域实证研究者的Stata命令速查文档按“数据导入—数据处理—描述性统计”的实证流程组织围绕常用代码整理出可直接套用的示例。文档从数据导入导出开始依次覆盖生成新变量、格式转换、缺失值和异常值处理、重命名变量、分类变量编码、面板数据设定、数据合并与追加并单列国泰安、CFPS、CHFS等常见微观数据库的原始数据清洗思路也包含字符串截取与正则表达提取等内容方便研究者在实证分析各阶段快速调用。资源以单个docx文件打包大小仅66KB轻量便携文档目录层级清晰既可通读建立整体框架也可按具体需求直接跳到对应命令区块查用。目前已有三千五百五十八人学习下载对需要提升Stata操作效率、减少重复试错的研究者而言是一份实用、易查的代码命令汇总。1. 实证Stata代码命令汇总一份拿来就能改的论文级命令清单做实证研究的人都有过这种经历模型跑完准备写论文结果发现数据清洗的代码丢了描述性统计的表格格式不对固定效应模型的标准误忘了聚类审稿人一问稳健性检验只能从头翻聊天记录找当时用的命令组合。一份「实证Stata代码命令汇总」就是把散落在各个 do 文件里的高频命令按实证流程重新组织从数据导入、变量构造到基准回归、稳健性检验、结果导出每一步给出可直接复制的代码块和参数解释。这份汇总适合正在写本科或硕士学位论文、准备投稿的实证研究者也适合需要快速复现某篇论文结果的从业者。它能帮你把「跑出数字」变成「跑出经得起追问的证据」省下的时间足以覆盖整理这份清单本身的成本。2. 数据准备阶段的Stata命令从导入到样本构建的完整链路实证分析的第一步永远不是跑回归而是把数据变成「干净、可复制、可追溯」的状态。很多人在这一步翻车变量类型搞错导致回归结果全是缺失值重复样本没去干净导致显著性失真离群值没处理导致核心系数被一个极端值带偏。我在这部分汇总的命令是每次动手做实证前必过的三道工序。2.1 数据导入与变量类型矫正destring、encode 与缺失值识别Stata 读入数据最常见的问题是「看起来是数字、其实是字符串」。从 Excel 或 CSV 导入的 ID 变量、年份变量经常被识别成 str 类型直接用reg会报错或者自动丢弃。我一般会先用describe和codebook扫一遍变量清单再用destring批量矫正。* 导入 CSV 文件把第一行当作变量名 import delimited data_raw.csv, clear varnames(1) * 批量查看变量存储类型重点核对 id、year、行业代码 describe, short codebook id year industry_code * 把明确是数字的变量批量转为数值型 destring id year industry_code, replace force * 单独处理含有特殊符号的数值变量如金额里的逗号 destring revenue, replace ignore(,) forceforce选项的意思是尽量转换无法转换的变成缺失值。转换后建议立刻执行isid id year确认 id 变量没有重复同时tab检查年份是否有异常值。这里有个关键习惯清理代码和最终回归代码要分开存放因为导入和清洗通常只需要跑一次而回归模型会反复调整。把清洗代码独立保存后续修改回归时不用重新读入原始数据。2.2 样本筛选与变量构造keep、gen 与组内运算样本筛选的速度直接影响回归结果的可复现性。常见做法是先按论文假设限定样本范围再生成关键变量。构造变量时要注意「变量生成顺序」和「缺失值传播」这两个隐形坑gen新变量引用的是当前内存里的值如果replace条件写错错误会被带到后续所有分析里。* 保留上市年限满三年的样本 keep if year listing_year 3 * 剔除关键变量缺失的观测 drop if missing(roa) | missing(leverage) * 构造核心解释变量企业年龄取对数 gen ln_firmage ln(year - establish_year 1) * 对连续变量进行上下 1% 缩尾winsorize ssc install winsor2, replace winsor2 roa leverage turnover, suffix(_w) cuts(1 99) * 生成行业年份交乘项用于控制行业-年度联合固定效应 egen ind_year group(industry_code year)winsor2是实证论文中最常用的离群值处理命令。cuts(1 99)表示把上下 1% 的极值替换为 1% 和 99% 分位点的值suffix(_w)生成新变量而不是覆盖原变量保留原始变量方便做稳健性对比。如果不用缩尾而用drop if roa ...样本量会明显减少审稿人可能质疑样本选择偏误。这里强调任何样本筛选条件都写注释确保三个月后回看代码还能看懂为什么留下这批样本。2.3 描述性统计与组间差异检验tabstat、esttab 输出三线表描述性统计不只是列出均值标准差更关键的是「分组差异」——处理组和控制组在核心变量上是否可比。实证论文的标准做法是输出全样本和分组的描述性统计表并附上均值差异检验的 p 值。* 全样本描述性统计按列输出均值、标准差、最小最大值 tabstat roa_w leverage_w ln_firmage turnover_w, /// stats(mean sd min max) columns(statistics) format(%9.3f) * 分组描述统计treat1 处理组treat0 控制组 tabstat roa_w leverage_w ln_firmage, by(treat) /// stats(mean sd) format(%9.3f) * 均值差异 t 检验 ttest roa_w, by(treat) * 输出到 Word 表格 ssc install estout, replace estpost tabstat roa_w leverage_w ln_firmage turnover_w, /// statistics(mean sd min max) columns(statistics) esttab using descriptive.rtf, replace /// title(Descriptive Statistics) /// cells(mean(fmt(2)) sd(fmt(2)) min(fmt(2)) max(fmt(2))) /// labelesttab系列命令是实证输出的事实标准它能把描述统计、回归结果直接转成 Word 或 Excel 表格。rtf格式可以直接被 Word 打开label选项显示变量标签而不是变量名这能避免审稿人看到ln_firmage_w这种变量名感到困惑。我在这一阶段一定会跑duplicates report检查样本是否重复重复样本会导致标准误被低估这是实证分析中隐蔽性最强的数据问题。3. 基准回归模型从OLS到固定效应的完整实现基准回归是整个实证分析的核心章节。审稿人或者答辩老师最先看的就是基准结果表系数大小是否符合预期、显著性是否达标、控制了哪些变量、标准误是否聚类。很多初学者用reg加一堆变量就结束了实际上固定效应模型的选择、标准误的聚类层级、模型间的递进逻辑都写在代码顺序里。3.1 普通OLS与多维度固定效应reghdfe 的引入与选择理由如果是截面数据reg配合vce(robust)通常够用但实证论文常用的是面板数据需要控制公司个体固定效应和年份固定效应。早期做法是xtreg配fe现在更通用的是reghdfe因为它能处理高维固定效应吸收多个分类变量后再做估计速度和自由度都优于手动生成虚拟变量。* 基准 OLS控制变量分两批加入观察系数稳定性 reg roa_w treat_w leverage_w ln_firmage turnover_w, robust est store m1 * 加入行业固定效应 reghdfe roa_w treat_w leverage_w ln_firmage turnover_w, /// absorb(industry_code) vce(robust) est store m2 * 加入行业和年份双向固定效应 reghdfe roa_w treat_w leverage_w ln_firmage turnover_w, /// absorb(industry_code year) vce(cluster firm_id) est store m3 * 个体固定效应加年份固定效应公司面板常用 reghdfe roa_w treat_w leverage_w ln_firmage turnover_w, /// absorb(firm_id year) vce(cluster firm_id) est store m4 * 四个模型合并输出 esttab m1 m2 m3 m4 using baseline.rtf, replace /// b(%9.3f) se(%9.3f) /// star(* 0.10 ** 0.05 *** 0.01) /// stats(N r2_a, fmt(%9.0f %9.3f)) /// order(treat_w leverage_w ln_firmage turnover_w)absorb()括号里可以放多个分类变量reghdfe会把它们的固定效应全部吸收后再回归。标准误聚类cluster(firm_id)的含义是允许同一家公司不同年份的扰动项相关这是面板数据的默认做法。模型递进逻辑是先不加固定效应看总相关再加入行业控制再加入时间控制再到个体固定效应。如果核心系数从 m1 到 m4 方向稳定、显著性保持说明结果不是由某个遗漏变量驱动的。3.2 交互项与边际效应核心解释变量的构建细节很多实证问题的核心解释变量是「交乘项」比如政策实施前后与处理组的交乘双重差分、某个连续变量与虚拟变量的交乘调节效应。交乘项的构造直接影响系数的解释方式一旦不小心把交乘项生成顺序写错后面全部分析都会跟着错。* 双重差分设置post政策实施后treat处理组 gen did post * treat * 调节效应X 去中心化后再交乘降低共线性 sum roa_w, meanonly gen roa_demean roa_w - r(mean) gen interaction roa_demean * leverage_w * 交乘项回归 reghdfe roa_w treat_w leverage_w roa_demean interaction /// absorb(firm_id year) vce(cluster firm_id) est store m5 * 输出各控制变量的 VIF检查多重共线性 estat vif去中心化操作roa_demean在交互项回归中非常重要。如果不减去均值交互项和主效应之间的相关系数可能超过 0.9导致标准误被严重膨胀系数无法解释。estat vif输出方差膨胀因子经验法则是 VIF 超过 10 需要警惕超过 20 基本可以判定共线性会影响结果。交乘项系数的解释方式与普通变量不同它表示调节变量变化一个单位时核心变量的边际效应变化多少而不是直接的经济含义。所以报告结果时我一般会配合margins命令计算不同调节水平下的边际效应。* 计算调节变量在均值加减一个标准差处的边际效应 sum leverage_w, detail local m r(mean) local s r(sd) margins, dydx(treat_w) at(leverage_w(m-s m ms))margins输出的三行结果分别对应调节变量低、中、高三个水平下核心解释变量对被解释变量的边际效应。如果低水平不显著、高水平显著这就是经典的「调节效应存在且方向递增」证据链。这个过程比单纯看交互项系数更直观也更容易写进论文。4. 稳健性检验与内生性处理实证论文能否过关的分水岭基准回归做完真正的挑战才开始。审稿人最常问的问题有三个换一种衡量方式结果还成立吗是不是存在反向因果是不是有遗漏变量这部分给出的命令组合是应对这三类质疑的标准配置。4.1 替换核心变量与子样本检验让结论经得起折腾稳健性检验的逻辑是「核心结论不随测量方式和样本范围的变化而改变」。常见的做法是替换被解释变量、替换核心解释变量、剔除特殊样本如直辖市、极端年份、缩尾比例从 1% 换成 5%。每次检验都应在同一套固定效应设置下进行否则无法判断结果的差异来自变量替换还是模型变动。* 替换被解释变量ROA 换成 ROE replace roe_w . if roe_w 0 // 处理 ROE 为 0 的异常值 winsor2 roe_w, suffix(_w2) cuts(1 99) reghdfe roe_w2 treat_w leverage_w ln_firmage turnover_w, /// absorb(firm_id year) vce(cluster firm_id) est store r1 * 替换解释变量连续处理强度替换为虚拟变量 gen treat_intensity_high (treat_intensity 3) reghdfe roa_w treat_intensity_high leverage_w ln_firmage turnover_w, /// absorb(firm_id year) vce(cluster firm_id) est store r2 * 剔除特定年份比如政策冲击年 reghdfe roa_w treat_w leverage_w ln_firmage turnover_w if year ! 2015, /// absorb(firm_id year) vce(cluster firm_id) est store r3 * 缩尾比例改为 5% 重新跑 winsor2 roa leverage turnover, replace cuts(5 95) reghdfe roa_w treat_w leverage_w ln_firmage turnover_w, /// absorb(firm_id year) vce(cluster firm_id) est store r4 esttab r1 r2 r3 r4 using robust.rtf, replace /// b(%9.3f) se(%9.3f) star(* 0.10 ** 0.05 *** 0.01) /// stats(N r2_a, fmt(%9.0f %9.3f))这里的关键点不是命令多复杂而是「每个替换背后都有明确的理由」。比如用 ROE 替代 ROA 是因为 ROA 受资产规模影响而 ROE 反映股东回报剔除 2015 年是因为当年有一项行业政策可能同时影响解释变量和被解释变量。如果不写理由直接换变量审稿人会觉得这是「换到显著为止」的数字游戏。4.2 工具变量法ivreghdfe 的两阶段最小二乘实现内生性处理是实证论文里最容易踩坑的环节。工具变量需要满足相关性和排他性两个条件Stata 里用ivreghdfe做两阶段最小二乘可以同时处理固定效应和聚类标准误。第一阶段 F 值、过度识别检验、内生性检验的结果都要报告。* 安装外部命令 ssc install ivreghdfe, replace ssc install ftools, replace * 工具变量回归iv 是工具变量 ivreghdfe roa_w treat_w leverage_w ln_firmage turnover_w /// (treat_w iv), absorb(firm_id year) cluster(firm_id) * 查看第一阶段 F 值判断弱工具变量 estat firststage * 如果存在多个工具变量进行过度识别检验 estat overid * 输出两阶段结果 est store iv1 esttab iv1 using iv.rtf, replace /// b(%9.3f) se(%9.3f) star(* 0.10 ** 0.05 *** 0.01) /// stats(N r2_a F, fmt(%9.0f %9.3f %9.3f))estat firststage会输出 Cragg-Donald Wald F 统计量经验规则是 F 值大于 10 认为不存在严重弱工具变量问题。estat overid输出 Hansen J 统计量p 值大于 0.1 表示工具变量满足排他性。这两个检验结果都要在论文里明确给出缺失任何一个都会被审稿人质疑。使用工具变量时还有一个常见误区把工具变量和内生变量同时放入回归而不声明(treat_w iv)的内生结构这样得到的是简化型而不是两阶段结果系数含义完全不同。4.3 安慰剂检验与PSM-DID因果推断的补充证据如果论文用的是双重差分设计安慰剂检验几乎是必须的。做法是随机抽取伪处理组重复多次回归观察系数分布是否集中在零附近。PSM-DID 则是在处理组和对照组差异较大的情况下先用倾向得分匹配再跑 DID。* 安慰剂检验随机分配 treat 进行 500 次回归 permute treat_w coefficient _b[treat_w], /// reps(500) seed(12345) nodots: /// reghdfe roa_w treat_w leverage_w ln_firmage turnover_w, /// absorb(firm_id year) cluster(firm_id) * PSM 匹配基于可观测变量估计倾向得分 ssc install psmatch2, replace psmatch2 treat_w leverage_w ln_firmage turnover_w, /// outcome(roa_w) logit neighbor(1) caliper(0.05) common * 匹配后重新跑 DID使用匹配样本 reghdfe roa_w treat_w leverage_w ln_firmage turnover_w /// if _support 1, absorb(firm_id year) cluster(firm_id)permute的_b[treat_w]表示每次抽样后提取 treat 的系数500 次之后可以得到系数的经验分布。如果真实估计值落在这个分布的极端尾部说明结果不太可能是随机产生的。caliper(0.05)限制匹配后的倾向得分差异不超过 0.05避免配对质量过差。这里要说清楚PSM 解决的是「可观测变量上的选择偏误」不可观测因素造成的问题仍然要靠工具变量或自然实验设计解决不要把 PSM 的结果说成因果结论。5. 实证分析避坑指南报错信息、缺失值黑洞与显著性玄学这份汇总做到一半的时候我发现真正浪费时间的不是模型本身而是那些反复出现的低级错误。这些坑不会让 Stata 崩溃但会让结果悄悄变错。以下是我在过去项目中踩过、也帮别人排查过的几类高频问题每一条都是「现象 → 原因 → 解决」的真实路径。5.1 回归样本量莫名减少缺失值的来源不在原始数据而在生成变量现象reg出来的观测数比tabstat少了三分之一检查原始数据几乎无缺失。原因生成变量时用了错误的变量名引用。比如你想生成ln_firmage ln(year - establish_year 1)但establish_year是从字符串转来的数值转换失败导致大量缺失。最常见的是destring没加force或者日期变量含有不可见字符。解决回归前先跑codebook检查每个核心变量的缺失情况。用misstable summarize定位哪些变量包含缺失值再看是哪个环节产生的misstable summarize treat_w leverage_w ln_firmage turnover_w。缺哪个变量就回溯到生成命令检查计算逻辑。一个实用技巧变量名前统一加后缀_w表示缩尾后版本_ln表示对数版本这样缺失值的来源清清楚楚。5.2 标准误差异巨大固定效应吸收层级混乱导致自由度计算错误现象结果表里核心系数的 t 值特别大显著性和理论预期完全不符但系数本身合理。原因用reg加虚拟变量控制行业效应时虚拟变量组数很多导致自由度下降标准误被低估。更隐蔽的是在reghdfe里把firm_id和industry_code同时放入absorb()——如果每个公司只属于一个行业行业固定效应会被公司固定效应完全吸收实际控制的是冗余组合。解决检查absorb()里是否含有多对一关系的变量。如果公司-年份层面不需要行业固定效应就不要同时放入。固定效应的选择遵循「控制层级不超过样本识别层级」的原则。另外标准误聚类层级一定要随固定效应层级走只聚到行业就用vce(cluster industry_code)聚到公司就用vce(cluster firm_id)聚类层级过低会夸大显著性。5.3 系数符合预期但经济显著性极小缩尾与量纲处理不当现象t 值 3.8星号三颗但系数是 0.002写论文时没法解释「提高 0.2%」意味着什么。原因变量量纲问题。如果被解释变量是收益率小数形式解释变量是绝对值百万单位回归系数就会非常小。另一个原因是缩尾后变量被严重压缩方差变小导致系数变小。解决处理连续变量时统一量纲。常见做法是把百分比变量标准化为 0~1把对数变量作为解释变量核心解释变量缩尾后除以标准差再跑。以下命令让系数更容易解读egen treat_std std(treat_w)。标准化后的系数可以解读为「核心解释变量提高一个标准差被解释变量变动多少」这是经济显著性讨论的通用语言。5.4 固定效应被完全吸收单观测值组与零方差变量现象reghdfe报错note: X omitted because of collinearity或者某个变量系数显示为 0。原因某个分组里只有一条观测值固定效应吸收了该组内的所有变量变异或者treat_w本身是行业层面变量而你又固定了行业导致这个变量和固定效应完全共线。解决如果是行业层面变量解释了行业固定效应你需要改变固定效应层级——固定到年份乘以行业或者固定到省份。观察每组观测数用tab firm_id如果大量组只有一条记录考虑用连续型行业特征替代行业固定效应。还可以用reghdfe的verbose选项查看哪些变量被吸收了reghdfe roa_w treat_w, absorb(firm_id year) verbose。5.5 显著性无法复现代码运行顺序导致的环境污染现象换了台电脑重新跑结果系数一致但标准误略有差异或者某个变量从显著变成不显著。原因do 文件没有在开头清空内存之前的变量生成命令残留影响结果。或者外部命令版本不一致reghdfe旧版本和ftools版本冲突。解决do 文件第一步永远是clear all和set more off第二步用version指定 Stata 版本。外部命令建议在开头统一安装ssc install reghdfe, replace和ssc install ftools, replace。每次跑数之前执行replay检查是否有隐藏的变量覆盖警告set trace on会输出每一步命令的执行过程发现环境污染时快速定位。这些习惯花五分钟建立之后省下的是几个小时排查时间。6. 把实证结果变成论文esttab 表格定制与 do 文件模块化管理的进阶技巧当所有检验跑完、思路清晰之后最后一道工序是把结果整理成论文可直接使用的表格。这一步的进阶技巧是「一劳永逸」式的用一套模板输出所有表格用模块化管理 do 文件保证任何改动都可追踪。我推荐的 do 文件结构是四个文件01_import_clean.do处理原始数据02_variables.do构造变量03_analysis.do跑所有模型04_results.do输出表格。每个文件开头用* 注释说明文件功能、数据来源、运行顺序。这样设计的价值在于当你三个月后收到审稿意见需要补一个检验时不用重新梳理逻辑链直接进03_analysis.do加模块即可。esttab的深度定制常被忽视。实际写作中论文表格需要的不是默认输出而是经过精心挑选的字段组合。以下是我常用的一套完整模板star(* 0.10 ** 0.05 *** 0.01)控制显著性标记b(%9.3f) se(%9.3f)控制系数和标准误的位数stats(N r2_a, fmt(%9.0f %9.3f))添加样本量和调整 R 方order()指定变量显示顺序drop()隐藏不需要的模型。如果需要表格按组分行显示用mgroups()给不同模型分组加标题indicate(Controls ...)用于显示控制变量是否包含这在三线表里比单独列出所有控制变量更常见。最后一个值得一提的习惯是在03_analysis.do的每个模型块前写清楚该模型回答什么问题、检验什么假设、预期的系数方向。这不是给 Stata 看的是给未来的自己看的——审稿意见回来时你面对的不是冷冰冰的代码而是当时思考的完整记录。这个习惯在多次修改论文的过程中帮我避免了很多重复劳动也让合作的协作者能快速接手。希望这份实证命令汇总能帮你在实证路上少走弯路把更多时间留给真正重要的问题本身。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?