1. 数据清洗:从原始数据到分析就绪
做实证研究最头疼的往往不是模型跑不出来,而是数据根本没法用。我见过太多研究生花两周时间清洗数据,最后跑回归只用两小时。先分享几个真实案例:有次处理上市公司数据时,发现同一家公司居然有5个不同的股票代码;还有次做跨国研究,发现德国日期格式是"dd.mm.yyyy"而美国是"mm/dd/yyyy",直接导致合并失败。
缺失值处理是第一个拦路虎。STATA里最简单的drop if missing(var)虽然粗暴但有效,不过更推荐用线性插值:
stata复制by company: ipolate sales year, gen(sales_adj) epolate
这个命令会按公司分组,用前后年份数据插补缺失值。加epolate选项还能进行外推,但要注意外推结果仅供参考。
异常值检测我习惯用组合拳:
stata复制winsor2 ROA ROE, cuts(1 99) replace // 双边缩尾
egen z_score = abs((ROA - mean(ROA))/sd(ROA)) // Z-score法
list if z_score > 3 // 人工核查极端值
日期处理有个坑:CSMAR数据库的会计期间经常是"2022-12-31"格式,需要提取年份时:
stata复制split accper, parse("-") gen(date_part)
destring date_part1, gen(year)
记得用destring转换字符型数字,否则后续回归会报错。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 描述性统计与可视化
期刊审稿人最先看的就是描述性统计表。我常用的模板:
stata复制asdoc sum ROA ROE SIZE LEV, stat(N mean sd p25 p50 p75) dec(3) replace
这个输出直接带格式,复制到Word就能用。更复杂的可以用estpost:
stata复制estpost tabstat $vars, stat(mean sd min max) columns(stat)
esttab using "描述统计.rtf", cells("mean(fmt(3)) sd(fmt(3))
