【Stata实战】从数据清洗到结果输出:一份完整的实证分析代码框架
1. 数据准备从原始数据到分析就绪刚拿到手的原始数据往往像一团乱麻——变量名是拼音缩写、日期格式混乱、缺失值标记五花八门。我处理过最离谱的一份数据关键变量竟然用指标A指标B这样的命名。先分享几个血泪教训换来的标准化操作变量重命名是第一步建议直接用英文全称或学术惯例缩写。比如资产负债率不要用zcfzl而是leverage这样国际期刊通用的名称。实际操作时可以批量处理rename 资产负债率 leverage rename 总资产周转率 turnover rename 净资产收益率 roe面板数据声明经常被新手忽略。假设你的数据包含上市公司多年财务指标必须明确告诉Stata哪些是截面单元如股票代码、哪些是时间维度encode stock_code, gen(id) // 将文本股票代码转为数值型 encode year, gen(time) // 处理日期变量 xtset id time // 声明面板结构注意如果数据包含中文文本变量如行业分类一定要先用encode转换否则后续模型会报错。我曾在 deadline 前熬夜3小时就因为这个隐藏问题。缺失值处理推荐用mdesc命令快速扫描ssc install mdesc // 先安装这个用户编写命令 mdesc roe leverage turnover看到缺失比例超过15%的变量就要警惕了可能需要用ipolate插值或与导师讨论是否删除该指标。2. 描述性统计与可视化发现数据的故事描述性统计不是简单跑个tabstat就完事。好的描述分析要能回答三个问题数据质量如何变量分布形态怎样是否存在异常值智能统计表可以这样做logout, save(描述统计) word replace: /// tabstat roe leverage turnover, /// stat(n mean sd p50 min max skewness kurtosis) /// format(%9.3f) columns(statistics)这个输出包含偏度(skewness)和峰度(kurtosis)能直接判断是否需要做对数变换。箱线图矩阵比单纯看数字更直观graph box roe leverage turnover, /// title(关键变量分布检查) /// note(数据来源CSMAR数据库)如果发现roe有超过300%的观测值可能是数据录入错误——现实中净资产收益率极少超过50%。相关系数矩阵要带显著性标记pwcorr_a roe leverage turnover, star(0.05)我习惯把结果导出为三线表格式logout, save(相关系数) excel replace: /// pwcorr_a roe leverage turnover, star(0.05)3. 模型诊断避开统计陷阱很多论文被拒稿就是因为忽略了基础诊断。分享几个必做的检查项共线性诊断不能只看VIFreg roe leverage turnover vif estat vif // 更详细的方差膨胀因子报告但更推荐用条件数(condition number)判断collin leverage turnover // 需要先安装collin若条件数30说明存在严重共线性可能需要删除变量或改用主成分分析。异方差检验对截面数据尤其重要reg roe leverage turnover estat hettest // Breusch-Pagan检验 estat imtest, white // White检验如果存在异方差p0.05必须在回归中加入robust选项reg roe leverage turnover, robust面板模型选择是重灾区。很多同学直接跑固定效应其实需要三步检验// 1. 混合OLS vs 固定效应 xtreg roe leverage turnover, fe est store fe testparm i.id // 检验个体效应是否显著 // 2. 混合OLS vs 随机效应 xtreg roe leverage turnover, re xttest0 // Breusch-Pagan检验 // 3. 固定效应 vs 随机效应 hausman fe // 必须使用存储的模型结果4. 高级分析让论文脱颖而出的技巧基础回归只是起点期刊审稿人更看重这些进阶分析滞后效应分析要注意处理面板结构xtreg roe L.leverage turnover, fe // 滞后一期 xtreg roe L2.leverage turnover, fe // 滞后两期建议用esttab对比结果esttab fe L1 L2 using 滞后效应.rtf, /// b(%9.3f) se(%9.3f) nogap compress /// star(* 0.1 ** 0.05 *** 0.01) /// stats(N r2_a, fmt(%9.0f %9.3f))调节效应作图能显著提升可读性// 先创建交互项 gen mod leverage * turnover xtreg roe leverage turnover mod, fe // 调节效应可视化 margins, at(leverage(0.1(0.1)0.9) turnover(-1 0 1)) marginsplot, x(leverage) /// title(调节效应分析) /// ytitle(预测ROE) /// legend(title(资产周转率))中介效应建议用Bootstrap法// 假设托宾Q是中介变量 sgmediation roe, mv(tobin_q) iv(leverage) cv(turnover)这个用户命令会自动输出三步检验结果比手动跑三个回归更规范。最后分享我的结果输出模板outreg2 using 最终结果, excel /// replace see label /// keep(leverage turnover) /// addtext(个体效应, 是, 时间效应, 否) /// addstat(调整R2, e(r2_a), F值, e(F)) /// title(表3回归分析结果)把这段代码存为do文件每次新项目只需修改变量名能节省至少2小时格式调整时间。记得在do文件开头添加版本控制和注释/* 实证分析主程序 作者你的名字 日期2024-03-20 Stata版本17.0 数据来源CSMAR 2023 */