(来源:小鱼量化)
跑实证这件事,最难的不是"不会写",而是"跑不通"。
数据导不进来、代码报错、结果不显著、稳健性补不上——这四件事卡住了绝大多数人。我把这些年带人做实证时最常遇到的 18 个问题整理成清单,按"报错原文—原因—怎么修"三段式排列。
建议收藏。卡住的时候按顺序对一遍,大部分问题都能自己解决。
说明一下:本文以 Stata 为主讲解。SPSS 用户遇到同类问题,思路是一致的——数据没洗干净、量纲没对齐、变量类型设错,这三个原因在两个软件里占了绝大多数。
一、数据导入与面板设定
01 repeated time values within panel
原因:同一只股票、同一年有两条以上记录。多半是数据源里有重复行,或者合并时产生了笛卡尔积。
怎么修:先看有多少条重复,再决定是直接删还是人工挑。
duplicates report code year duplicates list code year duplicates drop code year, force
如果要保留某一条,别急着 force,先 browse 看清楚哪条是对的。
02 年份是字符串,xtset 直接失败
原因:从 Excel 或 CSV 导入时,年份被识别成文本。
怎么修:
destring year, replace force
如果年份里混了"2020年"这类字符,destring 会失败,改用:
gen y = real(substr(year, 1, 4))
然后用 y 做时间维度。
03 股票代码带小数点或后缀,匹配不上
原因:000001.SZ 和 000001 是两个东西;从 Excel 导入还可能变成 1。
怎么修:统一截取六位数字。
gen code2 = real(substr(code, 1, 6))
两边都用 code2 做匹配键。
04 变量名和标签全是乱码
原因:Stata 13 及以前读取 UTF-8 编码的中文会乱。
怎么修:先备份原文件,再转码。
unicode analyze _all unicode translate _all
这一步不可逆,务必先复制一份 dta 文件。
05 merge 之后一大堆没匹配上
原因:匹配键类型不一致(一个是字符串一个是数字),或者键里有空格、前导零。
怎么修:先看匹配结果分布。
tab _merge
大量 _merge==1 或 ==2 说明键有问题。检查两边的键是不是同一类型:
describe code year
修正后重新合并,并清理:
dropif _merge != 3drop _merge
注意:_merge 不删掉,下次再 merge 会报 variable already defined。
06 回归直接提示 no observations
原因:if 条件太严,或者某个关键变量全是缺失值,样本被清空了。
怎么修:逐级数样本。
countcountif !missing(ret)countif !missing(ret, divyield)countif !missing(ret, divyield, size)
数到哪一级突然变 0,问题就在那个变量上。
二、回归跑不通
07 variable already defined
原因:重复跑同一段代码,变量已经存在了。
怎么修:两种办法。
capture drop d3gen d3 = ...
或者在改代码时用 replace 代替 gen,这样反复跑也不会报错。
08 omitted due to collinearity
原因:变量之间完全共线。常见情况是同时放了 size 和它的对数,或者在 xtreg, fe 里放了不随时间变化的变量。
怎么修:去掉冗余变量。
这里有个关键点:xtreg, fe 会自动吸收个体层面不随时间变化的 everything。行业属性、公司注册地、性别这类变量放进去,要么被剔除,要么系数没法解释——不是 bug,是固定效应的数学性质决定的。
09 聚类数太少,标准误不可信
原因:vce(cluster code) 要求聚类组数足够(经验上至少 30-40 组)。组数太少,聚类标准误会严重低估。
怎么修:换聚类层级,或者改用稳健标准误。
vce(robust)
论文里必须说明为什么这么选,别闷头改。
10 factor variables not allowed
原因:Stata 11 以前不支持 i.year 这种因子变量写法。
怎么修:手动生成年度哑变量。
tab year, gen(yd)
再把 yd2 到 yd10 放进回归(留一个做基准组)。
11 reghdfe 装不上或一跑就报错
原因:依赖包 ftools 缺失或版本不匹配,这是 reghdfe 最常见的坑。
怎么修:两个一起重装,顺序不能反。
sscinstall ftools, replacesscinstallreghdfe, replace
还不行就先卸载再装:
ado uninstall reghdfeado uninstall ftools
然后重装。
12 matsize too small 或内存不足
原因:变量太多,或者样本量太大超出默认矩阵上限。
怎么修:
set matsize 800set max_memory 4g
Stata 14 以前的版本用 set memory 而不是 set max_memory。
13 esttab 提示 last estimates not found
原因:前面的回归失败了,estimates store 根本没存上。
怎么修:确认回归成功输出后再存。建议在每段回归后立刻:
estimates store m1estimates dir
estimates dir 能列出来就说明存上了。
三、结果不对劲
14 系数大得离谱
原因:量纲问题。股息率是 0.04(小数)还是 4(百分数),差 100 倍。
怎么修:先看描述性统计确认量纲。
summarize divyield, detail
判据:如果系数大到暗示"股息率每提高 1 个百分点,收益提高 3 个百分点",那基本可以肯定是量纲错了——这个幅度不合常理。
15 全部不显著
按顺序排查这五项:
1. 样本量够不够(几十个观测很难显著)
2. 有没有极端值(先做缩尾)
3. 标准误设定对不对(有没有聚类)
4. 变量定义是否真的对应你的理论
5. 可能真的没有关系
最后一条要说实话。 为了显著而反复改模型设定,是 p-hacking,盲审专家一眼能看出来。
16 稳健性一做就不显著
原因:基准结果本来就脆弱,换个设定就站不住。
怎么修:如实报告。这比硬凑一个显著结果强得多。
论文里可以讨论"为什么在这个设定下不成立"——这本身是有价值的信息,也是审稿人更愿意看到的诚实。
17 R² 高得离谱(超过 0.9)
原因:多半是把被解释变量自己(或它的滞后项)放进了解释变量。
怎么修:逐个检查控制变量,尤其注意有没有 L.ret 这类变量出现在控制变量里。
四、结果输出
18 esttab 导出 RTF 后中文乱码
原因:RTF 编码与 Word 不兼容。
怎么修:改导 CSV,再用 Excel 排成三线表。
esttab m1 m2 m3 using "res.csv", /// replace b(%6.3f) se(%6.3f) /// star(* 0.1 ** 0.05 *** 0.01)
CSV 在 Excel 里打开不会乱码,手动加边框就是标准三线表。
最后一句
这 18 条里,真正卡人的往往不是代码本身,而是数据没洗干净和量纲没对齐。
跑回归之前,多花十分钟做描述性统计,能省掉后面两小时的调试。