实证跑不通?18 个 Stata/SPSS 报错的排查清单(建议收藏)_新浪财经_新浪网

(来源:小鱼量化)

跑实证这件事,最难的不是"不会写",而是"跑不通"。

数据导不进来、代码报错、结果不显著、稳健性补不上——这四件事卡住了绝大多数人。我把这些年带人做实证时最常遇到的 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 条里,真正卡人的往往不是代码本身,而是数据没洗干净和量纲没对齐。

跑回归之前,多花十分钟做描述性统计,能省掉后面两小时的调试。